复制Excel工作表与NPOI CopySheet; 副本总是空白

我试图创build一个应用程序,将Excel电子表格在一个给定的目录合并到一个单一的,标签式的Excel工作簿。 我只能访问VS社区2015,所以VSTO是不可能的。 我正在使用Interop和NPOI 2.1.3.1。

这是我的代码:

files = Directory.GetFiles(sourcePath); XSSFWorkbook test = new XSSFWorkbook(); try { string fPath = files[0]; FileStream fs2 = new FileStream(fPath, FileMode.Open, FileAccess.ReadWrite); XSSFWorkbook myBook = new XSSFWorkbook(fs2); test.CreateSheet(myBook.GetSheetName(0)); var sheet1 = myBook.GetSheetAt(0).CopySheet(test.GetSheetName(0)); test.Write(new FileStream("testFile.xlsx", FileMode.Create, FileAccess.ReadWrite)); } catch { } 

我并不想做任何奇怪的事情,只需获取由GetFiles函数返回的第一个文件,复制第一个工作表上的所有内容,然后在新的工作簿“test”中创build一个新的工作表。 我知道正在find源文件,因为输出文件“testFile.xlsx”的sheet1正在获取源工作表的唯一表名 – 它不是“Sheet1”。 但是,表格的其余部分是空白的,我不知道为什么。

我正在使用Excel 2016,如果这有所作为。

请尝试两种不同的解决scheme:一个用于Interop(xlsx文件格式),另一个用于NPOI(xls文件格式)。 这些解决scheme可以获得文件夹中的excel文件,读取excel文件并将表格复制到新的excel文件中。

使用Interop.Excel:

 // using Microsoft.Office.Interop.Excel; Application app = new Application(); app.Visible = false; app.DisplayAlerts = false; string[] files = Directory.GetFiles(@"c:\temp\excel"); foreach (string file in files) { app.Workbooks.Add(file); } for (int i = 2; i <= app.Workbooks.Count; i++) { for (int j = 1; j <= app.Workbooks[i].Worksheets.Count; j++) { Worksheet ws = app.Workbooks[i].Worksheets[j]; ws.Copy(app.Workbooks[1].Worksheets[1]); } } app.Workbooks[1].SaveCopyAs(@"c:\temp\excel\output\testFile.xlsx"); app.Quit(); 

使用NPOI:

 // using NPOI.HSSF.UserModel; string[] files = Directory.GetFiles(@"c:\temp\excel"); HSSFWorkbook workbookMerged = new HSSFWorkbook(); foreach (string file in files) { HSSFWorkbook workbook; using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read)) { workbook = new HSSFWorkbook(fs); for (int i = 0; i < workbook.NumberOfSheets; i++) { ((HSSFSheet)workbook.GetSheetAt(i)).CopyTo(workbookMerged, workbook.GetSheetName(i), true, true); } } } using (FileStream fs = new FileStream(@"c:\temp\excel\output\testFile.xls", FileMode.Append, FileAccess.Write)) { workbookMerged.Write(fs); } 

请注意,对于NPOI解决scheme,我将xlsx文件转换为xls以使用HSSF而不是XSSF,因为没有可用于XSSFSheet CopyTo方法。 此方法仅适用于HSSFSheet ,截至最新的NPOI版本2.3.0。