2016-08-17 35 views
1

C#とNPOIライブラリを使用してExcelファイルを編集するために、次のコードを記述しました。エラーはありませんが、ファイルを開くとコードを実行すると、セルの値は編集されません。私は間違って何をしていますか?NPOIを使用して既存のExcelファイルのセル値を編集しようとしています

namespace Project37 
{ 
    class Class1 
    { 
     public static void Main() 
     { 
      string pathSource = @"C:\Users\mvmurthy\Downloads\VOExportTemplate.xlsx"; 

      FileStream fs = new FileStream(pathSource, FileMode.Open, FileAccess.ReadWrite); 
      HSSFWorkbook templateWorkbook = new HSSFWorkbook(fs, true); 
      HSSFSheet sheet = (HSSFSheet)templateWorkbook.GetSheet("ImportTemplate"); 
      HSSFRow dataRow = (HSSFRow)sheet.GetRow(4); 

      dataRow.GetCell(1).SetCellValue("foo"); 

      MemoryStream ms = new MemoryStream(); 
      templateWorkbook.Write(ms); 
     }  
    } 
} 

答えて

1

あなたが戻ってファイルへの書き込みの代わりにMemoryStreamにワークブックを書いているので、あなたが変更を見ていない主な理由です。あなたがやるべきことはこれです:

  1. 完全にスプレッドシートファイルを読むためにFileStreamReadモードを使用しました。これはのためのより良いかもしれ - あなたがオリジナルを破壊したくない場合は、ファイルへの書き戻し(または必要に応じて別のファイルに書き込むFileStreamWriteモードを使用して、次に必要な変更、
  2. を作る
  3. テスト)。

はまた、(すべてのStreamsが行う)IDisposableを実装するクラスを操作する場合usingステートメントを使用することをお勧めします注意してください。これにより、ファイルが閉じられ、ストリームによって使用されるすべてのリソースが適切にクリーンアップされます。

は、私はあなたのコードで見る別の問題があり、それはあなたが明らかに.xlsxファイルでHSSFWorkbookを使用しようとしているです。それは動作しません。 HSSFWorkbook(およびすべてHSSFクラス)は、.xlsファイル用です。 .xlsxファイルで作業する必要がある場合は、代わりにXSSFWorkbookと関連するXSSFクラスを使用する必要があります。クラスの両方のフレーバーは、IWorkbook,ISheetIRowなどの共通インターフェイスを実装して、両方のタイプのファイルをサポートする必要がある場合はコードの重複を減らすのに役立ちます。私はそれらを可能な限り使用することをお勧めします。しかし、インタフェースでカバーされていない特定の機能にアクセスするために、時々ダウンキャストする必要があることがあります。

もう1つ言及する必要があります。特定の行xに元のブックにセルが含まれていない場合、GetRow(x)はnullを返します。同様に、セルyが空の場合、GetCell(y)はnullを返します。無関係にセルの値を設定できるようにするには、それぞれのエンティティが確実に存在するようにヌルをチェックし、CreateRow(x)および/またはCreateCell(y)を適切に使用する必要があります。

string pathSource = @"C:\Users\mvmurthy\Downloads\VOExportTemplate.xlsx"; 

IWorkbook templateWorkbook; 
using (FileStream fs = new FileStream(pathSource, FileMode.Open, FileAccess.Read)) 
{ 
    templateWorkbook = new XSSFWorkbook(fs); 
} 

string sheetName = "ImportTemplate"; 
ISheet sheet = templateWorkbook.GetSheet(sheetName) ?? templateWorkbook.CreateSheet(sheetName); 
IRow dataRow = sheet.GetRow(4) ?? sheet.CreateRow(4); 
ICell cell = dataRow.GetCell(1) ?? dataRow.CreateCell(1); 
cell.SetCellValue("foo"); 

using (FileStream fs = new FileStream(pathSource, FileMode.Create, FileAccess.Write)) 
{ 
    templateWorkbook.Write(fs); 
} 
+0

インターネット全体にNPOIのC#で、既存のファイルに書き込む方法を示すための最良の例:ここでは

は、改訂されたコードです。 – Jarkid

関連する問題