我尝试创建一个应用程序,将给定目录中的Excel电子表格合并到一个标签式Excel工作簿中。我只能访问VS Community 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&#34 ;用复制的东西。我知道正在找到源文件,因为输出文件的第1页" testFile.xlsx"获取源工作表的唯一工作表名称 - 它不是"#34; Sheet1"。但是,表单的其余部分显示为空白,我不知道原因。
我在Excel 2016上使用它,如果这有所不同。
答案 0 :(得分:0)
请尝试两种不同的解决方案:一种用于Interop(xlsx文件格式),另一种用于NPOI(xls文件格式)。这些解决方案将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解决方案,我将xlsx
文件转换为xls
以使用HSSF而不是XSSF,因为CopyTo
没有XSSFSheet
方法可用。此方法仅适用于HSSFSheet
,从最新的NPOI版本2.3.0开始。