如何使用NPOI生成excel

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-16浏览:1

如何使用NPOI生成excel

NPOI是一个第三方开源组件,用来生成excel占用内存低,生成速度也较快。金蝶云星空有一些引出是使用NPOI组件来实现的。注意,NPOI代码不是金蝶维护,在NPOI生产excel过程中,产生的错误和异常,金蝶这边无法排查,可以借助搜索引擎或者官方文档进行排查。


以下演示将DataTable类型数据生成excel并下载的过程,由于是演示,没有考虑数据量大的情况。如果数据量较大,需要考虑分批获取数据,然后写入的excel中,避免一次性占用过多内存导致系统无法使用的情况。


引出excel效果

image.webp



以下代码是点击按钮,然后生成excel数据并下载的过程。


using Kingdee.BOS.Core;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Metadata.ControlElement;
using Kingdee.BOS.Excel;
using Kingdee.BOS.Util;
using NPOI.HSSF.Util;
using NPOI.SS.UserModel;
using NPOI.XSSF.Streaming;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cloud.BOS.Support.Bill
{
    [HotUpdate]
    public class NpoiExportPlugin:AbstractBillPlugIn
    {

        public override void BarItemClick(BarItemClickEventArgs e)
        {
            if (e.BarItemKey.EqualsIgnoreCase("tbExportByNpoi"))
            {
                Export();
            }
        }

        private void Export()
        {
            var tb = BuildData();

            var showParameter = new DynamicFormShowParameter();
            showParameter.FormId = "BOS_FileDownLoad";
            showParameter.OpenStyle.ShowType = ShowType.Modal;
            showParameter.CustomParams.Add("url", NPOIExport(tb));
            this.View.ShowForm(showParameter);

        }

        private string NPOIExport(DataTable tb)
        {
            var wb = new SXSSFWorkbook();
            SXSSFSheet sheet = (SXSSFSheet)wb.CreateSheet("demo");
            var tempXmlFile = sheet._writer.TemporaryFilePath();

            string fileName = string.Format("NPOI-demo-{0}.xlsx" , DateTime.Now.ToString("yyyyMMddhhmmss"));
            var filePath = PathUtils.GetPhysicalPath(KeyConst.TEMPFILEPATH, fileName);
            var fileUrl = PathUtils.GetServerPath(KeyConst.TEMPFILEPATH, PathUtils.UrlEncode(fileName));

            try
            {
                for (int i = 0; i < tb.Rows.Count; i++)
                {
                   
                    IRow row = sheet.CreateRow(i);
                   
                    for (int colIndex = 0; colIndex < tb.Columns.Count; colIndex++)
                    {
                        ICell cell = row.CreateCell(colIndex);
                        ICellStyle textCellStyle = wb.CreateCellStyle();
                        textCellStyle.DataFormat = wb.CreateDataFormat().GetFormat("@");
                        cell.CellStyle = textCellStyle;
                        if (i % 2 == 0)
                        {
                            textCellStyle.FillForegroundColor = HSSFColor.LightBlue.Index;
                            textCellStyle.FillPattern = FillPattern.SolidForeground;
                        }
                        cell.SetCellValue(tb.Rows[i][colIndex].ToString());                        
                    }
                }

                //写入Excel
                using (FileStream fs = File.OpenWrite(filePath))
                {
                    wb.Write(fs);
                }
            }
            finally 
            {
                if (wb != null)
                {
                    wb.Close();
                }
                //清理中间临时xml文件
                if (File.Exists(tempXmlFile))
                {
                    File.Delete(tempXmlFile);
                }
                
            }
            return fileUrl;
        }

        private DataTable BuildData()
        {
            var sheetName = "NPOI Demo";

            var tb = new DataTable(sheetName);
            tb.Columns.Add("fbillno");
            tb.Columns.Add("fdate");
            tb.Columns.Add("FDOCUMENTSTATUS");

            //构造表头
            var newRow = tb.NewRow();
            newRow["fbillno"] = "单据编号";
            newRow["FDate"] = "日期";
            newRow["FDOCUMENTSTATUS"] = "状态";
            tb.Rows.Add(newRow);

            for (int i=0;i<=100; i++)
            {
                var row = tb.NewRow();
                row["fbillno"] = string.Format("BillNo-{0}",i.ToString("000"));
                row["FDate"] = DateTime.Now.ToLongDateString();
                row["FDOCUMENTSTATUS"] = "C";
                tb.Rows.Add(row);
            }

            return tb;
        }
    }
}



如何使用NPOI生成excel

NPOI是一个第三方开源组件,用来生成excel占用内存低,生成速度也较快。金蝶云星空有一些引出是使用NPOI组件来实现的。注意,NPOI代码不是...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息