あなたが戻ってファイルへの書き込みの代わりにMemoryStream
にワークブックを書いているので、あなたが変更を見ていない主な理由です。あなたがやるべきことはこれです:
- 完全にスプレッドシートファイルを読むために
FileStream
Read
モードを使用しました。これはのためのより良いかもしれ - あなたがオリジナルを破壊したくない場合は、ファイルへの書き戻し(または必要に応じて別のファイルに書き込むFileStream
Write
モードを使用して、次に必要な変更、
- を作る
- テスト)。
はまた、(すべてのStreams
が行う)IDisposable
を実装するクラスを操作する場合using
ステートメントを使用することをお勧めします注意してください。これにより、ファイルが閉じられ、ストリームによって使用されるすべてのリソースが適切にクリーンアップされます。
は、私はあなたのコードで見る別の問題があり、それはあなたが明らかに.xlsx
ファイルでHSSFWorkbook
を使用しようとしているです。それは動作しません。 HSSFWorkbook
(およびすべてHSSF
クラス)は、.xls
ファイル用です。 .xlsx
ファイルで作業する必要がある場合は、代わりにXSSFWorkbook
と関連するXSSF
クラスを使用する必要があります。クラスの両方のフレーバーは、IWorkbook
,ISheet
、IRow
などの共通インターフェイスを実装して、両方のタイプのファイルをサポートする必要がある場合はコードの重複を減らすのに役立ちます。私はそれらを可能な限り使用することをお勧めします。しかし、インタフェースでカバーされていない特定の機能にアクセスするために、時々ダウンキャストする必要があることがあります。
もう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);
}
インターネット全体にNPOIのC#で、既存のファイルに書き込む方法を示すための最良の例:ここでは
は、改訂されたコードです。 – Jarkid