首页 > 编程语言 >C# NPOI 合并多个工作簿(Workbook)的第一个工作表(Sheet)

C# NPOI 合并多个工作簿(Workbook)的第一个工作表(Sheet)

时间:2023-08-01 09:24:54浏览次数:36  
标签:Sheet C# mergeWorkBook excelFilePaths NPOI 工作 Workbook XSSFWorkbook

  最近在工作中用到了一些NPOI,发现很好用,但是说明文档比较少,好多人都直接去参考POI?希望NPOI作者或者某位使用NPOI较多的大神能完善相关文档,让这个好用的工具更加好用。回到正题本次项目中主要用到合并多个工作簿(Workbook)的第一个工作表(Sheet)这个功能,一开始的做法是利用XSSFWorkbook.CloneSheet(int sheetNum)这个方法返回一个复制的ISheet,然后用XSSFWorkbook.Add(ISheet item)加入这个复制的ISheet就达到了跨工作簿(Workbook)复制的目的,但是程序运行下来没效果,然后我猜想这个CloneSheet是复制的本工作簿(Workbook)的工作表,不能跨工作簿(Workbook)复制。一番努力找到了跨工作簿(Workbook)复制的方法。记录如下,希望遇到与我一样问题的人能受益。

代码如下:

/// <summary>
/// 将数个Excel文件中的第一个工作表合并至一个Excel文件中
/// </summary>
/// <param name="excelFilePaths">需要合并的数个Excel文件路径</param>
/// <param name="desFilePath">合并成的一个Excel文件路径</param>
private void MergeExcels(string[] excelFilePaths, string desFilePath)
{
    XSSFWorkbook mergeWorkBook = new XSSFWorkbook();

    for (int i = 0; i < excelFilePaths.Length; i++)
    {
        if (File.Exists(excelFilePaths[i]))
        {
            using (FileStream fs = new FileStream(excelFilePaths[i], FileMode.Open, FileAccess.Read, FileShare.Write))
            {
                XSSFWorkbook tmpWorkBook = new XSSFWorkbook(fs);
                XSSFSheet tmpSheet = tmpWorkBook.GetSheetAt(0) as XSSFSheet;
                tmpSheet.CopyTo(mergeWorkBook, Path.GetFileNameWithoutExtension(excelFilePaths[i]), true, true);
            }
        }
        /* 考虑数据量,此处可以限制最多可以合并工作表的数量 */
        //if (mergeWorkBook.NumberOfSheets >= 200)
        //{
        //    break;
        //}
    }

    if (mergeWorkBook.NumberOfSheets != 0)
    {
        FileStream fsDesFile = new FileStream(desFilePath, FileMode.OpenOrCreate, FileAccess.Write);
        mergeWorkBook.Write(fsDesFile);
        fsDesFile.Close();
        mergeWorkBook.Close();
    }
    else
    {
        mergeWorkBook.Close();
    }
}

HSSFSheet 也有CopyTo()方法,并且参数与XSSFSheet一致。

转载:C# NPOI 合并多个工作簿(Workbook)的第一个工作表(Sheet) - lukai - 博客园 (cnblogs.com)

标签:Sheet,C#,mergeWorkBook,excelFilePaths,NPOI,工作,Workbook,XSSFWorkbook
From: https://www.cnblogs.com/winchance/p/17595562.html

相关文章

  • 009 python socket UDP服务端程序,在pycharm正常运行,生成的exe运行有时候接收不到数据,
    写了一个简单的socket服务端程序,在pycharm中正常,生成exe后运行,有时候接收不到数据。经过半天折腾,发现,只要按一下回车,程序又能正常运行了。最终发现,是因为控制台的快速编辑功能打开导致程序假死。在控制台程序的菜单栏右键点击--->默认值--->去掉“快速编辑模式”和“插入模式”......
  • eject
    eject用来退出抽取式设备补充说明eject命令用来退出抽取式设备。若设备已挂入,则eject命令会先将该设备卸除再退出。eject允许可移动介质(典型是cd-ROM、软盘、磁带、或者JAZ以及zip磁盘)在软件控制下弹出。该命令也可以控制一些多盘片CD-ROM控制器,控制一些设备支持的自动弹出功......
  • c指针
    指针变量数据类型*指针变量名;int*p;//定义了一个指针变量p,*是用来修饰变量的,说明p是个指针变量,变量名是p在定义指针变量的时候*代表修饰的意思修饰p是个指针变量。关于指针的运算符:&取地址*取值p=&a;//把a的地址给p赋值&是取地址符eg:p=&a;//p保存了a的地址,也可以......
  • C#删除和清空文件夹的程序
    ///<summary>///清空指定的文件夹,但不删除文件夹///</summary>///<paramname="dir"></param>privatevoidDeleteFolder(stringdir){foreach(stringdinDirectory.GetFileSystemEntries(dir)){if(File.Exists(d))......
  • CDN加速
    概念当我们在使用一些第三方包的时候,势必会导包到我们自己的服务器上,会增加代码体积,同时距离你服务器远的地方,加载会比较慢。vite中使用......
  • Sychronized 原理,锁升级优化
    Java对象头以32位虚拟机为例普通对象所以以Integer和int为例子Integer8字节对象头+4字节int值,所以大小是int的3倍int4字节int值数组对象如Student[]s=newStudent[8],还包括数组长度length其中markword结构为MarkWord被设计成一个非固定的......
  • 建模教程:如何利用3ds Max 和 After Effects 实现多通道渲染和后期合成 - 第 1 部分
     推荐:NSDT场景编辑器助你快速搭建可二次开发的3D应用场景1.创建基本场景步骤1打开 3dsMax。在透视视口。打开3dsMax步骤2做一个茶壶,放在飞机上。制作茶壶步骤3我在场景中应用了几个灯光。我选择了光线追踪阴影作为阴影。光线追踪阴影步骤4按 M 打开材质......
  • Gym104128L Proposition Composition
    很好口胡却不好写。把边分成链边和额外边首先想到分类讨论,显然不能只删额外边,所以有两类情况,删一链边和两链边。如果删一链边,这一链边要么完全没被额外边覆盖,然后其他任选一条;要么被覆盖一次,额外边选覆盖它的边。用线段树简单维护即可。现在难的是删两链边,且这两条链边都至少......
  • 建模教程:如何利用3ds Max 和 After Effects 实现多通道渲染和后期合成 - 第 2 部分
     推荐:NSDT场景编辑器助你快速搭建可二次开发的3D应用场景1.创建基本场景步骤1打开 3dsMax。打开3dsMax。步骤2我做了一个简单的场景。我放了三个彼此之间有一定距离的物体。制作对象步骤3按 Ctrl-C 键在透视视图中创建摄影机。创建相机2.设置对象ID步......
  • Maven打包Scala找不到主类入口问题
    Maven打包Scala项目找不到主类,参考https://blog.csdn.net/weixin_41684423/article/details/115695713后,加上maven-assembly-plugin依赖就OK了,完整的pom文件如下:<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0&q......