首页 > 其他分享 >NPOI读取模板文件生成Excel

NPOI读取模板文件生成Excel

时间:2024-05-14 17:19:22浏览次数:24  
标签:cellStyle int items Excel NPOI dataIndex workbook 模板

前不久实现了用NPOI组件替代Microsoft.Office.Interop.Excel 原生组件实现导出数据到Excel的需求,其中踩了几个坑,这里记录一下。

  • 不能使用wps创建模板文件
  • 不能使用一个文件流,对已存在Excel文件进行修改
  • NPOI中sheet、row、cell都是以0作为起始序号,Office原生组件是以1作为起始序号。

使用WPS创建的模板文件可以导出数据到Excel文件,但如果使用Office打开则可能出现 部分内容出错,询问是否修复的提示。用WPS打开时正常的。

使用一个文件流,对已存在Excel文件进行修改在保存时会出现异常,可以使用两个六对象,一个负责读取和修改,另外一个只负责写入,如下方代码所示。

        public void ExportData(IList<IList<string>> items, string fullPathFileName, int startRowNumber, string title = "")
        {
            Debug.Assert(items != null && items.Count > 0 && !string.IsNullOrWhiteSpace(fullPathFileName));

            IWorkbook workbook = null;
            try
            {
                using (FileStream fileStream = new FileStream(fullPathFileName, FileMode.Open, FileAccess.Read))
                {
                    if (Path.GetExtension(fullPathFileName) == ".xlsx")
                    {
                        workbook = new XSSFWorkbook(fileStream);
                    }
                    else
                    {
                        workbook = new HSSFWorkbook(fileStream);
                    }
                    ISheet worksheet = workbook.GetSheetAt(0);

                    worksheet.DefaultRowHeightInPoints = 17f;// 设置默认行高

                    if (!string.IsNullOrWhiteSpace(title))
                    {
                        worksheet.Header.Center = title;
                    }

                    int rowIndex = 0;
                    int columnIndex = 0;
                    var firstCellStyle = worksheet.GetRow(rowIndex).GetCell(columnIndex).CellStyle;

                    IFont font = workbook.CreateFont();
                    font.FontHeightInPoints = 12;// 设置字体大小
                    ICellStyle cellStyle = workbook.CreateCellStyle();
                    cellStyle.SetFont(font);
                    cellStyle.WrapText = true;// 自动换行
                    cellStyle.BorderTop = firstCellStyle.BorderTop;
                    cellStyle.BorderBottom = firstCellStyle.BorderBottom;
                    cellStyle.BorderLeft = firstCellStyle.BorderLeft;
                    cellStyle.BorderRight = firstCellStyle.BorderRight;
                    cellStyle.VerticalAlignment = VerticalAlignment.Center;

                    int rowsCount = items.Count;
                    IRow currentRow;
                    for (int dataIndex = 0; dataIndex < rowsCount; dataIndex++)
                    {
                        rowIndex = dataIndex + startRowNumber - 1;
                        currentRow = worksheet.GetRow(rowIndex, true);
                        currentRow.RowStyle = cellStyle;
                        ICell currentCell;
                        for (int j = 0; j < items[dataIndex].Count; j++)
                        {
                            currentCell = currentRow.GetCell(j, true);
                            currentCell.SetCellType(CellType.String);// 设置单元格类型为字符串
                            currentCell.SetCellValue(items[dataIndex][j]);
                        }
                    }
                }

                // 保存
                using (FileStream outFileStream = new FileStream(fullPathFileName, FileMode.Create, FileAccess.Write))
                {
                    workbook.Write(outFileStream);
                }
            }
            catch (OutOfMemoryException ex)
            {
                // LoggerFactory.CreateLog().LogError("Export data failed : {0}. Process.WorkingSet64: {1} MB.", ex.Message, Process.GetCurrentProcess().WorkingSet64 / 1024 / 1024);
                throw;
            }
            catch (Exception ex)
            {
                // LoggerFactory.CreateLog().LogError("Export data failed:" + ex.Message);
                throw;
            }
            finally
            {
                workbook.Close();
            }
        }

  

标签:cellStyle,int,items,Excel,NPOI,dataIndex,workbook,模板
From: https://www.cnblogs.com/FreeLoopPowter/p/18191781

相关文章

  • P6577 【模板】二分图最大权完美匹配 (KM)
    $\quad$初看就发现不对劲了,模板紫题,一看就不简单,就交了个裸\(KM\),哎,果然\(T\)了。$\quad$然后就是大力卡常(当然\(O(n^4)\))的复杂度不是卡常能解决的。遂看题解,发现一个据说\(O(n^3)\)的复杂度的\(KM\),也是非常抽象。具体解释详见https://www.luogu.com.cn/article/ip2m1gu......
  • Vue模板语法、属性绑定、条件渲染的学习
    Vue模板语法:使用插值表达式的内容必须是有结果的内容才可以,就是需要return出来的才可以显示出来。插值表达式所表现的内容为纯文本模式如何避免即所有的逻辑操作都在js里面实现,不要再templete中实现可以完美的避免这个问题。Vue属性绑定1.使用v-bind进行属性绑定语法:v-b......
  • 一些模板
    之前的模板在我考研时脑子一热删掉了QAQ,现在重新写了点,Python和C++都有。dijkstra\(O(n^2)\)importosimportsysimportmathimportcopyfromcollectionsimportdequefromheapqimport*sys.setrecursionlimit(30000)MAXN=1<<32n,m,st=map(int,input().......
  • 02-Excel基础操作-学习笔记
    01替换场景描述:在excel表中由“部门”列,将其中的’‘一部门’‘改为’‘一车间’‘在excel表中由“地区”列,上面记录着既有“苏州”又有“苏州市”,现在要求将‘’地区‘’所在列中的“苏州”改为“苏州市”。分班:将列表中的63名同学分成2个班级,3个班级又该如何操作......
  • 低开开发笔记(六): 工作台与模板样式开发
    好家伙,仅仅只是实现了样式,完整功能暂未完成 完整代码已开源https://github.com/Fattiger4399/ph-questionnaire.git  1.灵感来源(抄袭对象)刚开始想着随便写个低开项目练练手的,然后就写成这样了1.1.简道云 1.2.问卷星  2.上代码<template><divc......
  • 【VMware vSphere】如何查看 OVF/OVA 模板部署虚拟机所配置的密码。
    当我们从OVF/OVA模板部署虚拟机时,在部署期间可能会要求你对虚拟机进行一些配置,比如IP地址、虚拟机密码等。关于这些配置参数,登录vSphereClient,可以转到该虚拟机-配置-设置-vApp选项-属性中进行参看。当我们部署完这个虚拟机后,如果长时间没有登录,忘记配置期间设置的密码,那该怎......
  • vue 简易导出数据 vue-json-excel
    1、安装插件npminstall-Svue-json-excel2、注册importVuefrom"vue";importJsonExcelfrom"vue-json-excel";Vue.component("downloadExcel",JsonExcel);3、使用<a-buttonv-if="isExport"type="primary&quo......
  • EPAI手绘建模APP工程图模板、投影、剖切、局部放大、中间线、符号、填充
    (4) 工程图① 模板1) 模板包括可以选择修改的模板字段和不可选择修改的固定元素。2) 选择模板字段长按,打开模板字段编辑器,填写模板字段内容,点击工程图空白地方,更新模板字段。图 314 工程图元素编辑器-模板字段② 工程图元素1) 投影a. 选择投影,长按,打开投影元素编......
  • Spring6 的JdbcTemplate的JDBC模板类的详细使用说明
    1.Spring6的JdbcTemplate的JDBC模板类的详细使用说明@目录1.Spring6的JdbcTemplate的JDBC模板类的详细使用说明每博一文案2.环境准备3.数据准备4.开始4.1从数据表中插入(添加)数据4.2从数据表中修改数据4.3从数据表中删除数据4.4从数据表中查询一个对象4.5从数据表中......
  • 厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中
    一、写在开头我们在上一篇文章中提到了通过EasyExcel处理Mysql百万数据的导入功能(一键看原文),当时我们经过测试数据的反复测验,100万条放在excel中的数据,4个字段的情况下,导入数据库,平均耗时500秒,这对于我们来说肯定难以接受,今天我们就来做一次性能优化。二、性能瓶颈分析一般的......