首页 > 编程语言 >C#使用NPOI 读取并修改 Excel 模版(移动行,增加行)

C#使用NPOI 读取并修改 Excel 模版(移动行,增加行)

时间:2023-11-10 16:45:58浏览次数:34  
标签:sheet C# 模版 单元格 Excel NPOI workbook CopyRow var

准备一下:templatePath 为模版路径,初始化 workbook

var workbook = new XSSFWorkbook(File.OpenRead(templatePath));
var sheet = workbook.GetSheetAt(0);

 

// 1、指定行、列单元格赋值
sheet.GetRow(1).GetCell(2).SetCellValue(companyInfo?.FFullName);

 

// 2、模版内现有行移动(例如需要在中间行查询需要写入的数据行) 这里我们总共需要做三步,将源行移动至指定行、清除源行内容、清除源行单元格格式(如果想后续直接Copy写入数据行且存在合并单元格时,则必须清除,避免合并单元格在CopyRow时重复设置而CopyRow失败)
比如我们现在需要在从第五行(index=4)开始插入我们需要写的数据行:
var addRowCount = 5; // 导出数据行数
var initRowNum = 4; // 模版第4行起为 XX列表

var lastRowNum = sheet.LastRowNum; // 模板中最后的行数  

#region 根据导出数量向后移动至指定行
for (int j = lastRowNum; j >= initRowNum + 1; j--)
{
    // 1、将数据行从 j 行 Copy 到 j + addRowCount 行
    sheet.CopyRow(j, j + addRowCount);

    // 2、移除行(但不包括此行的合并单元格设置,因为合并单元格设置是存储在Sheet中的,而不是行上)
    sheet.RemoveRow(sheet.GetRow(j));

    // 3、移除源数据行的合并单元格设置(从sheet的合并单元格设置中找到当前行的合并单元格设置的 Index,然后干掉)
    var curRowMergedRegions = sheet.MergedRegions.FindAll(x => x.FirstRow == j);

    var curRowMergedRegionIndexs = curRowMergedRegions.Select(x =>
    {
        return sheet.MergedRegions.IndexOf(x);
    }).ToList();

    sheet.RemoveMergedRegions(curRowMergedRegionIndexs);
}
#endregion

 

// 3、向模版中间空行写入业务数据行
if (!dataList.IsNullOrEmpty()) // dataList 为业务需要写入数据行
{
    // 添加数据行
    for (var i = 0; i < dataList.Count; i++)
    {
        var assetAll = assetList[i];

        var row = sheet.GetRow(initRowNum); // 因为模版内已经存在一格空行,所以直接赋值,后续从此行进行 CopyRow 即可
        if (i == 0)
        {
            SetRowCellValue(i + 1, row, assetAll);
            continue;
        }

        var newRow = sheet.CopyRow(initAssetAllRowNum, initAssetAllRowNum + i);
        SetRowCellValue(i + 1, newRow, assetAll); // SetRowCellValue 一个往行中的单元格设置值的方法,例如:newRow.GetCell(0).SetCellValue(serialNo);
    }
}

 

至此,已经Ok,后续保存 workbook 为excel文件即可。对于很多到处审批单或者复杂Excel的需求直接往模版内填值或者增行这样更加简单。

临时记录,主要逻辑和代码如上,仅供参考。

“好记性不如烂代码!”

 

标签:sheet,C#,模版,单元格,Excel,NPOI,workbook,CopyRow,var
From: https://www.cnblogs.com/pengxx/p/17824433.html

相关文章

  • CF1043F Make It One
    题目描述给你一个长度为\(n\)的序列\(A_i\),问你最少能从这个集合中取出多少数使得其\(\gcd=1\)数据范围\(1\leqn\leq3\times10^5\);\(1\leqa_i\leq3\times10^5\).思路:首先观察一下这个数据范围,其中小于\(3\times10^5\)的质因数个数为\(6\)。所以我们可以考虑......
  • 【每日例题】蓝桥杯 c++ 手机尾数
    手机尾数题目30年的改革开放,给中国带来了翻天覆地的变化。2011全年中国手机产量约为11.72亿部。手机已经成为百姓的基本日用品!给手机选个好听又好记的号码可能是许多人的心愿。但号源有限,只能辅以有偿选号的方法了。这个程序的目的就是:根据给定的手机尾号(4位),按照—定的规则......
  • [BalticOI 2019 Day2] 汤姆的餐厅
    [BalticOI2019Day2]汤姆的餐厅题目背景译自BalticOI2019Day2T1.Tom'sKitchen题目描述Tom'sKitchen是一家非常受欢迎的餐厅,其受欢迎的原因之一是每份菜都由至少$K$名厨师进行准备。今天有$N$份菜需要准备,第$i$份菜的准备时间是$A_i$小时。Tom可以......
  • 关于 can 的一些理解。
         我也是在板子上进行了测试,如果没有通讯的情况下,CANH与CANL确实是2.5V左右。 ......
  • docker修改宿主机为容器映射的端口
    1.先关闭容器root1@ubuntu22:~$dockerstop0912.再停止docker服务root1@ubuntu22:~$sudostopdocker3.进入配容器置文件目录修改hostconfig.json文件root@ubuntu22:/var/lib/docker/containers/091302dc373cfa10d414a115276a2a18304052721df6f59c85138......
  • JavaScript--定时器案例
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • 平安人寿基于 Apache Doris 统一 OLAP 技术栈实践
    导读:平安人寿作为保险行业领军企业,坚持技术创新,以数据业务双轮驱动的理念和更加开放的思路来应对不断增长的数据分析和应用需求;以深挖数据价值、保障业务用数效率为目标持续升级大数据产品体系。自2022年起平安人寿开始引入开源实时数据仓库ApacheDoris并基于此统一OLAP技术......
  • leet code 983. 最低票价
    983.最低票价题目描述在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为days的数组给出。每一项是一个从1到365的整数。火车票有三种不同的销售方式:一张为期一天的通行证售价为costs[0]美元;一张为期七天的通......
  • 文件上传-code
       1.导入上传文件gav坐标     <!--https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload-->  <dependency>  <groupId>commons-fileupload</groupId>  <artifactId>commons-fileupload</artifactId>  <v......
  • C++ 杂项.md
    C++杂项大括弧{}在C++中,大括号{}可以用于多种目的,包括但不限于以下几种:初始化列表:大括号可以用于初始化数组、结构体、类和标准库容器等数据结构。例如:intarr[]={1,2,3,4,5};//初始化整型数组std::vector<int>vec={1,2,3,4,5};//初始化整型向量......