使用NPOI将dataTable导出到Excel(2003).xls的初体验

20180814

之前这篇文章是写NPOI导出到2007的,最后写了个疑惑为啥总是文件有损坏。后来看到网上说建议导2003用NPOI,导2007用EPPLUS,所以改一下吧~哈哈


20180810

NPOI适用于在没有安装Excel的电脑上导出.xls文件。之前一直没有这个需求,今天闲来无事尝试了一下。

快,确实快,不服不行。5000*10的数据,之前用二维数组的方式导出需要5s,今天用NPOI的方式导出只要1.2s,至于cell导出emmm……没试,估计挺慢的。


先是使用手册镇楼。

接下来如何导入NPOI?


引用长这样,我也不知道具体哪个有用,反正都引了

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using NPOI.HPSF;
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.POIFS.FileSystem;
using System.IO;

然后上代码

public void dtToExcel2003(DataTable dt, string filepath, string sheetname)

创建对象,两行就完事~

            HSSFWorkbook hssfworkbook = new HSSFWorkbook();//建立Excel2003对象
            HSSFSheet sheet = (HSSFSheet)hssfworkbook.CreateSheet("sheet1");//新建一个名称为sheet1的工作簿

 设置文件属性(可以不设)。就是在excel里点文件,能看到的信息

            //配置文件属性
            DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
            dsi.Company = "";
            dsi.Category = "";//类别
            dsi.Manager = "";//管理者
            hssfworkbook.DocumentSummaryInformation = dsi;
            SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
            si.Subject = "";//主题
            si.Title = "";//标题
            si.ApplicationName = "";//不知道是啥
            si.Author = "";//作者
            si.LastAuthor = "";//上一次保存者
            si.Comments = "";//备注
            si.CreateDateTime = DateTime.Now;
            hssfworkbook.SummaryInformation = si;

设置表格的样式。这里的setstyle函数是自己写的,在后面

            //表格设置
            sheet.SetColumnWidth(1, 30 * 256);//第二列较宽 
            sheet.DefaultColumnWidth = 13;
            HSSFCellStyle style0 = setstyle(hssfworkbook, "微软雅黑", 14);
            HSSFCellStyle style1 = setstyle(hssfworkbook,"微软雅黑", 12);

然后就是单元格赋值啦,首行14号字,其他12号字

           //设置列名
            HSSFRow row = (HSSFRow)sheet.CreateRow(0);
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                ICell cell = row.CreateCell(i);
                cell.SetCellValue(dt.Columns[i].ColumnName);
                cell.CellStyle = style0;
            }
            //单元格赋值
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                IRow row1 = sheet.CreateRow(i + 1);
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    ICell cell = row1.CreateCell(j);
                    cell.SetCellValue(dt.Rows[i][j].ToString());
                    cell.CellStyle = style1;
                }
            }

写入文件

            using (System.IO.Stream stream = File.OpenWrite(file))
            {
                //写入文件
                xssfworkbook.Write(stream);
                stream.Close();
            }

这个函数就结束了。

setstyle的函数如下

public HSSFCellStyle setstyle(HSSFWorkbook hssfwb,string fontname, short fontsize)
        {
            HSSFFont font = (HSSFFont)hssfwb.CreateFont();
            HSSFCellStyle style = (HSSFCellStyle)hssfwb.CreateCellStyle();
            style.SetFont(font);
            font.FontName = fontname;
            font.FontHeightInPoints = fontsize;
            return style;
        }

但是我导出之后一直有一个问题:如果是覆盖已有的文件的话,会出现Excel文件损坏的提示,有时候能打开有时候打不开,较为诡异。

参考:文章1

            文章2

没有更多推荐了,返回首页