使用NPOI实现WEB端报表数据导出到Excel

什么是NPOI

NPOI是一个开源的C#读写Excel、WORD的组件,可以在没有安装Office的情况下对Word或Excel文档进行读写操作。

使用NPOI的优势

(1)完全开源

(2)包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等)

(3)同时支持文件的导入和导出

(4)你不需要在服务器上安装微软的Office,可以避免版权问题

(5)使用起来比Office PIA的API更加方便,更人性化。

....

简单报表导出使用

因为我使用的是DataTable,所以这里仅对如何将DataTable导出到Excel

/// <summary>
        /// 导出数据到excel
        /// </summary>
        /// <param name="dataTable">数据源</param>
        /// <param name="fileName">文件名称</param>
        /// <param name="language">语言</param>
        public string DataTableExcel(DataTable dataTable,string cPath, string fileName,int language)
        {
            try
            {
                //创建EXCEL工作薄
                IWorkbook workBook = new XSSFWorkbook();
                //创建sheet文件表,这里可以改成你希望的sheet命名
                ISheet sheet = workBook.CreateSheet("sheet1");
                #region 创建Excel表头
                //创建表头
                IRow header = sheet.CreateRow(0);
                for (int i = 0; i < dataTable.Columns.Count; i++)
                {
                    //给表创建列单元格并填充列名称,此处只做首行列Columns创建和填充
                    ICell cell = header.CreateCell(i);
                    cell.SetCellValue(SetColumnName(dataTable.Columns[i].ColumnName, language));
                }
                #endregion
                #region 填充Excel单元格中的数据
                //给工作薄中非表头填充数据,遍历行数据并进行创建和填充表格
                for (int i = 0; i < dataTable.Rows.Count; i++)
                {
                    //表示从整张数据表的第二行开始创建并填充数据,第一行已经创建。
                    IRow row = sheet.CreateRow(i + 1);
                    //遍历并创建每个单元格cell,将行数据填充在创建的单元格中。
                    for (int j = 0; j < dataTable.Columns.Count; j++)
                    {
                        //将数据读到cell单元格中
                        ICell cell = row.CreateCell(j);
                        cell.SetCellValue(dataTable.Rows[i][j].ToString());//对数据为null的情况进行处理
                    }
                }
                #endregion
                #region 工作流创建Excel文件
                //工作流写入,通过流的方式进行创建生成文件
                MemoryStream stream = new MemoryStream();
                workBook.Write(stream);
                byte[] buffer = stream.ToArray();
                string filePath = System.Web.HttpContext.Current.Server.MapPath(cPath);
                if (!Directory.Exists(filePath))//如果不存在就创建file文件夹
                    Directory.CreateDirectory(filePath);
                fileName = SetFileName(fileName, language) + ".xlsx";
                string fullName = Path.Combine(filePath, fileName);
                if (System.IO.File.Exists(fullName))
                    System.IO.File.Delete(fullName);
                using (FileStream fs = new FileStream(fullName, FileMode.Create, FileAccess.Write))
                {
                    try
                    {
                        fs.Write(buffer, 0, buffer.Length);
                        fs.Flush();
                    }
                    catch (Exception ex)
                    {
                        Log.Instance.Error("DataTableExcel:"+ex.Message);
                        return "";
                    }
                    finally
                    {
                        //出现异常时,手动释放fs写对象
                        fs.Dispose();
                        //出现异常时,手动释放stream流对象,防止卡死的现象
                        stream.Dispose();
                    }
                }
                return fileName;
            }
            catch (Exception ex)
            {
                Log.Instance.Error("DataTableExcel:" + ex.Message);
                return "";
            }
            #endregion
        }

SetColumnName(string name,int language)方法,是对列表字段名称进行定义,因为我用到了多语言,所以这里传入了一个语言标识字段参数

SetFileName(string name, int language)方法,是对导出的文件进行命名,因为方法做的是封装,所以名称会根据当前导出的报表进行命名,同时因为是多语言版本,所以增加了一个语言标识字段参数

通过NuGet包管理导入我们需要的NPOI包,在项目引用那里点击右键—>管理NuGet程序包

在浏览里面输入NPOI点击右侧的下载即可完成对依赖的导入

批量导入可以参考:https://www.cnblogs.com/yanweidie/p/5881528.html;里面写的比较全,我这里就不做过多的说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大鱼>

一分也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值