zoukankan      html  css  js  c++  java
  • NPOI操作excel

    本事例只演示导入

    其它案例参考

    导出参考调用

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace NpoiTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                string path = "D:\";
                string xlsPath = Path.Combine(path, DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls");;//excel的保存路径
                NpoiExcelUtility utility = new NpoiExcelUtility(xlsPath);
    
                #region MyRegion
                 DataTable dt = new DataTable("NewDt");
    
                //创建自增长的ID列
                DataColumn dc = dt.Columns.Add("ID", Type.GetType("System.Int32"));
                dc.AutoIncrement = true;   //自动增加
                dc.AutoIncrementSeed = 1;  //起始为1
                dc.AutoIncrementStep = 1;  //步长为1
                dc.AllowDBNull = false;    //非空
    
                //创建其它列表
                dt.Columns.Add(new DataColumn("Name", Type.GetType("System.String")));
                dt.Columns.Add(new DataColumn("Age", Type.GetType("System.Int32")));
                dt.Columns.Add(new DataColumn("Score", Type.GetType("System.Decimal")));
                dt.Columns.Add(new DataColumn("CreateTime", Type.GetType("System.DateTime")));
    
                //创建数据
                DataRow dr = dt.NewRow();
                dr["Name"] = "张三";
                dr["Age"] = 28;
                dr["Score"] = 85.5;
                dr["CreateTime"] = DateTime.Now;
                dt.Rows.Add(dr);
    
                dr = dt.NewRow();
                dr["Name"] = "李四";
                dr["Age"] = 24;
                dr["Score"] = 72;
                dr["CreateTime"] = DateTime.Now;
                dt.Rows.Add(dr);
    
                dr = dt.NewRow();
                dr["Name"] = "王五";
                dr["Age"] = 36;
                dr["Score"] = 63.5;
                dr["CreateTime"] = DateTime.Now;
                dt.Rows.Add(dr);
                #endregion
    
                if (dt != null)
                {
                    utility.CreatExcelSheet("基本信息表", dt);
                    utility.SaveExcel();
                    Process.Start(xlsPath);//导入完毕后直接自动启动exce打开生成的excel文件
                }
            }
        }
    }

    excel帮助类

    using NPOI.HSSF.UserModel;
    using NPOI.SS.UserModel;
    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.IO;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace NpoiTest
    {
    
        /// <summary>
        /// 写Excel的实用类,NPOI 是POI项目的.NET 版本,是一个开源的用来读写Excel、WORD等微软OLE2组件文档的项目,不依赖于office,如果用Microsoft.Office.Interop.Excel,容易出错,尤其是安装了不同版本的office软件
        /// </summary>
        public class NpoiExcelUtility
        {
            private string _xlsPath = string.Empty;
            private HSSFWorkbook _workBook = null;
    
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param name="xlsPath">xls保存路径</param>
            public NpoiExcelUtility(string xlsPath)
            {
                _xlsPath = this.CheckFilePath(xlsPath);
    
                _workBook = new HSSFWorkbook();
            }
    
            /// <summary>
            /// 将DataTable保存到sheet里
            /// </summary>
            /// <param name="dt"></param>
            /// <param name="sheet"></param>
            private void DataTableToExcel(DataTable dt, ISheet sheet)
            {
                ICellStyle style = _workBook.CreateCellStyle();
                style.Alignment = HorizontalAlignment.Left;
                style.VerticalAlignment = VerticalAlignment.Center;
    
                ICellStyle colStyle = _workBook.CreateCellStyle();
                colStyle.Alignment = HorizontalAlignment.Left;
                colStyle.VerticalAlignment = VerticalAlignment.Center;
                IFont font = _workBook.CreateFont();
                font.Color = NPOI.HSSF.Util.HSSFColor.LightBlue.COLOR_NORMAL;
                colStyle.SetFont(font);
    
                //列名
                IRow row = sheet.CreateRow(0);
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    sheet.SetDefaultColumnStyle(i, style);
    
                    ICell cell = row.CreateCell(i);
                    cell.SetCellValue(dt.Columns[i].ToString());
    
                    cell.CellStyle = colStyle;
                }
                //内容
                for (int i = 1; i <= dt.Rows.Count; i++)
                {
                    row = sheet.CreateRow(i);
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        object obj = dt.Rows[i - 1][j];
                        if (obj != null)
                        {
                            ICell cell = row.CreateCell(j);
                            if (obj is double || obj is float || obj is int || obj is long || obj is decimal)
                            {
                                cell.SetCellValue(Convert.ToDouble(obj));
                            }
                            else if (obj is bool)
                            {
                                cell.SetCellValue((bool)obj);
                            }
                            else
                            {
                                cell.SetCellValue(obj.ToString());
                            }
                        }
                    }
                }
                //一下方法会报异常,可能是改NPOI版本的问题,之前老的版本不会报错,这里暂时注释掉
                //for (int i = 0; i < dt.Columns.Count; i++)
                //{
                //    sheet.AutoSizeColumn(i);
                //}
            }
    
            /// <summary>
            /// 保存Excel
            /// </summary>
            public void SaveExcel()
            {
                FileStream file = new FileStream(_xlsPath, FileMode.Create);
                _workBook.Write(file);
                file.Close();
            }
    
            /// <summary>
            /// 创建Sheet
            /// </summary>
            /// <param name="sheetName">sheet名称</param>
            /// <param name="tbl">DataTable数据表,当行数大于65536时,自动分割成几个sheet,sheet名称为sheetName_i</param>
            public void CreatExcelSheet(string sheetName, DataTable tbl)
            {
                string sName = this.CheckSheetName(sheetName);
    
                int rowMax = 65535;
                int intNum = tbl.Rows.Count / rowMax;
                int remainder = tbl.Rows.Count % rowMax;
    
                for (int i = 0; i < intNum; i++)
                {
                    DataTable subTbl = tbl.Clone();
                    for (int j = 0; j < 65535; j++)
                    {
                        int rowIndex = i * rowMax + j;
                        subTbl.Rows.Add(tbl.Rows[rowIndex].ItemArray);
                    }
                    string subSheet = sName + "_" + (i + 1);
                    ISheet sheet = _workBook.CreateSheet(subSheet);
                    this.DataTableToExcel(subTbl, sheet);
                }
                if (remainder > 0)
                {
                    DataTable subTbl = tbl.Clone();
                    for (int j = 0; j < remainder; j++)
                    {
                        int rowIndex = intNum * rowMax + j;
                        subTbl.Rows.Add(tbl.Rows[rowIndex].ItemArray);
                    }
                    string subSheet = sName + "_" + (intNum + 1);
                    if (intNum < 1)
                    {
                        subSheet = sName;
                    }
                    ISheet sheet = _workBook.CreateSheet(subSheet);
                    this.DataTableToExcel(subTbl, sheet);
                }
            }
    
            /// <summary>
            /// 检查sheet名称是否合法,并去掉不合法字符
            /// </summary>
            /// <param name="sheetName"></param>
            private string CheckSheetName(string sheetName)
            {
                string rlt = sheetName;
                string[] illegalChars = { "*", "?", """, @"", "/" };
                for (int i = 0; i < illegalChars.Length; i++)
                {
                    rlt = rlt.Replace(illegalChars[i], "");
                }
                return rlt;
            }
    
            /// <summary>
            ///  检查xls路径是否合法,并去掉不合法字符
            /// </summary>
            /// <param name="filePath"></param>
            private string CheckFilePath(string filePath)
            {
                string dir = Path.GetDirectoryName(filePath);
                string fileName = Path.GetFileNameWithoutExtension(filePath);
                string ext = Path.GetExtension(filePath);
    
                string[] illegalChars = { ":", "*", "?", """, "<", ">", "|", @"", "/" };
                for (int i = 0; i < illegalChars.Length; i++)
                {
                    fileName = fileName.Replace(illegalChars[i], "");
                }
                string rlt = Path.Combine(dir, fileName + ext);
                return rlt;
            }
        }
    }
  • 相关阅读:
    Oracle入门第六天(下)——高级子查询
    Oracle入门第六天(中)——SET运算符(交并差集)
    Oracle入门第六天(上)——用户控制
    数据库理论——数据库3范式
    Oracle入门第五天(下)——数据库其他对象
    Oracle入门第五天(上)——数据库对象之视图
    PHP PDO函数库详解
    python访问纯真IP数据库的代码
    有关linux磁盘分区优化
    Nginx日志深入详解
  • 原文地址:https://www.cnblogs.com/macT/p/11606690.html
Copyright © 2011-2022 走看看