2017-06-05 61 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。