2017-06-05 663 views
1

我正在尝试创建一个应用程序,它将Excel电子表格在给定目录中合并到一个单独的标签式Excel工作簿中。我只能访问VS社区2015,所以VSTO是不可能的。我正在使用Interop和NPOI 2.1.3.1。复制Excel工作表与NPOI CopySheet;复制始终是空的

这里是我的代码:

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函数返回的第一个文件,在第一个工作表的所有内容复制,并创建一个新的工作表在新的工作手册“测试”中复制了什么内容。我知道正在找到源文件,因为输出文件“testFile.xlsx”的sheet1正在获取源工作表的唯一工作表名称 - 它不是“Sheet1”。但是,该表的其余部分空白,我不知道为什么。

我对Excel 2016使用这个,如果这有所作为。

+0

你为什么同时使用Interop和NPOI? – mason

回答

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。