2016-07-20 35 views
0

私は次のコードでExcelシートを修正しようとしています。 4thの行に、testという文字列のセルを追加していますが、ファイルが更新されていません。私はNPOIライブラリに関する多くの記事を読んでおり、xlsxファイルの書き出しをサポートしていないバージョンはほとんどないことがわかりました。しかし、私は2.2.1を使用していると思います。私を助けてください。C#NPOIライブラリ:変更後にxlsxファイルが更新されない

enter code here 

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data; 
using System.IO; 
using Excel; 
using NPOI.SS.UserModel; 
using NPOI.XSSF.UserModel; 
namespace PantheonProject 
{ 
    public class test 
    { 
     public static void testMethod() 
     { 
      XSSFWorkbook hssfwb; 
      using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Read)) 
      { 
       hssfwb = new XSSFWorkbook(file); 
       file.Close(); 
      } 

      ISheet sheet = hssfwb.GetSheetAt(0); 
      IRow row = sheet.GetRow(4); 

      //sheet.CreateRow(row.LastCellNum); 
      ICell cell = row.CreateCell(row.LastCellNum); 
      cell.SetCellValue("test"); 

      for (int i = 0; i < row.LastCellNum; i++) 
      { 
       Console.WriteLine(row.GetCell(i)); 
      } 

      using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Write)) 
      { 
       hssfwb.Write(file); 
       file.Close(); 
      } 
     } 
    } 
} 

答えて

0

コードfrom this answerを実行しようとしている可能性があります。あなたのコードで:

  1. FileMode.Openモードでファイルに書き込もうとしています。それをFileMode.OpenOrCreateまたはFileMode.CreateNewに変更します。
  2. 入力ファイル(場合によってはsource.xlsx)を変更/編集すると、ファイルが破損する可能性があります。これは、NPOIのバグです。出力ファイルに別の名前を付けてください(例:source2.xlsx)。

次のコードを試してください。わたしにはできる。

public static void testMethod() 
{ 
    XSSFWorkbook hssfwb; 
    using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Read)) 
    { 
     hssfwb = new XSSFWorkbook(file); 
     file.Close(); 
    } 

    ISheet sheet = hssfwb.GetSheetAt(0); 
    IRow row = sheet.GetRow(4); 

    //sheet.CreateRow(row.LastCellNum); 
    ICell cell = row.CreateCell(row.LastCellNum); 
    cell.SetCellValue("test"); 

    for (int i = 0; i < row.LastCellNum; i++) 
    { 
     Console.WriteLine(row.GetCell(i)); 
    } 

    using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source2.xlsx", FileMode.OpenOrCreate, FileAccess.Write)) 
    { 
     hssfwb.Write(file); 
     file.Close(); 
    } 
} 

あなたは、ファイル名を変更し、入力ファイルを削除して、同じファイル名で新しいファイルを作成したくない場合はソリューション。

public static void testMethod() 
{ 
    XSSFWorkbook hssfwb; 
    using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Read)) 
    { 
     hssfwb = new XSSFWorkbook(file); 
     file.Close(); 
    } 

    ISheet sheet = hssfwb.GetSheetAt(0); 
    IRow row = sheet.GetRow(4); 

    //sheet.CreateRow(row.LastCellNum); 
    ICell cell = row.CreateCell(row.LastCellNum); 
    cell.SetCellValue("test"); 

    for (int i = 0; i < row.LastCellNum; i++) 
    { 
     Console.WriteLine(row.GetCell(i)); 
    } 

    File.Delete(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx"); 

    using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.OpenOrCreate, FileAccess.Write)) 
    { 
     hssfwb.Write(file); 
     file.Close(); 
    } 
} 

解決策3:その場合は、ファイルを削除して再作成する必要はありません(溶液2よう

、代わりに手動でファイルをエクセル作成する(下の画像を参照)、おNPOIでファイルを作成する必要があります。

enter image description here

あなたはNPOIでファイルをエクセル作成する場合は、同じファイルを変更/編集することができます。今回は壊れません。次のコードを正しく処理するために、私はあなたがNPOIで既にsource.xlsxを作成していると仮定しています。

public static void testMethod() 
    { 
     XSSFWorkbook hssfwb; 
     using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.Open, FileAccess.Read)) 
     { 
      hssfwb = new XSSFWorkbook(file); 
      file.Close(); 
     } 

     ISheet sheet = hssfwb.GetSheetAt(0); 
     IRow row = sheet.GetRow(4); 

     //sheet.CreateRow(row.LastCellNum); 
     ICell cell = row.CreateCell(row.LastCellNum); 
     cell.SetCellValue("test"); 

     for (int i = 0; i < row.LastCellNum; i++) 
     { 
      Console.WriteLine(row.GetCell(i)); 
     } 


     using (FileStream file = new FileStream(@"/Users/harshloomba/Documents/workspace/PantheonProject/source.xlsx", FileMode.OpenOrCreate, FileAccess.Write)) 
     { 
      hssfwb.Write(file); 
      file.Close(); 
     } 
    } 
0

私が示唆されたものを変更しましたが、何も、私はXamarinスタジオにポートのApache POIにIKVM.netを使用し、それは絶対にうまく働い起こりませんでした。試してみてください。

関連する問題