2017-06-05 268 views
1

特定のディレクトリのExcelスプレッドシートをタブ付きのExcelブックにマージするアプリケーションを作成しようとしています。私はVS Community 2015にしかアクセスできないので、VSTOは問題ありません。代わりにInteropとNPOI 2.1.3.1を使用しています。NPOIコピーシートを使用してExcelワークシートをコピーする。コピーは常に空白です

ここに私のコードです:

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ファイル形式)の2種類のソリューションを試してください。これらのソリューションは、フォルダ内のExcelファイルを取得し、Excelファイルを読み込んで、シートを新しいExcelファイルにコピーします。

NPOIを使用して
// 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(); 

// 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ソリューションのために、私は、代わりにXSSFのHSSFを使用するxlsに私のxlsxファイルを変換することをInterop.Excelを使用して

XSSFSheetCopyToメソッドが利用可能です。この方法は、最新のNPOIバージョン2.3.0以降のHSSFSheetでのみ利用可能です。

関連する問題