使用NPOI CopySheet复制Excel工作表;副本始终为空白

时间:2017-06-05 20:50:22

标签: c# excel npoi

我尝试创建一个应用程序,将给定目录中的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上使用它,如果这有所不同。

1 个答案:

答案 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开始。