2016-08-19 26 views
1
以下

を使用してExcelスプレッドシートのセルの列全体に色をしようとすると、私はNPOIを使用してExcelファイル内のカラーセルに使用しているC#プログラムです:はNPOI

string pathSource = @"C:\Users\mvmurthy\Downloads\VOExportTemplate (2).xlsx"; 
HSSFWorkbook templateWorkbook; 
HSSFSheet sheet; 
HSSFRow dataRow; 

using (var fs = new FileStream(pathSource, FileMode.Open, FileAccess.ReadWrite)) 
{ 
    templateWorkbook = new HSSFWorkbook(fs, true); 
    sheet = (HSSFSheet)templateWorkbook.GetSheet("ImportTemplate"); 
    int num = sheet.PhysicalNumberOfRows; 
    for (int i=1; i<num; i++) 
    { 
      dataRow = (HSSFRow)sheet.GetRow(i);     
      HSSFCellStyle hStyle = (HSSFCellStyle)templateWorkbook.CreateCellStyle(); 
      hStyle = (HSSFCellStyle)templateWorkbook.CreateCellStyle(); 
      hStyle.FillForegroundColor = IndexedColors.Red.Index; 
      hStyle.FillPattern = FillPattern.SolidForeground; 
      dataRow.Cells[9].CellStyle = hStyle;     
    } 
} 

using (var fs = new FileStream(pathSource, FileMode.Open, FileAccess.ReadWrite)) 
{ 
    templateWorkbook.Write(fs); 
} 

私は上記のコードを実行するとI次の出力を得ることが、私には、列Kを色付けしたいのです:

enter image description here

私が間違って何をしているのですか?

答えて

2

問題は、この行である:

dataRow.Cells[9].CellStyle = hStyle; 

Cells[n]は、空のセルを無視するので、これは、非空のセル(0系)10を取得します。あなたのスクリーンショットでは、3番目と4番目の行は説明列に値があるので、10番目の空でないセルは列Jにあり、それ以外の行では列Kにあります。

特定の列でセルを取得するには、代わりにGetCell(n)を使用してください。ただし、その列にセルがない場合は、デフォルトでnullが戻されます。必要に応じて、このメソッドに2番目のパラメータを渡して、nullを返すのではなく、その状況で新しいセルを作成するように指定できます。

はこれに問題のある行変更してみてください:余談として

dataRow.GetCell(10, MissingCellPolicy.CREATE_NULL_AS_BLANK).CellStyle = hStyle; 

を、私はあなたがスタイリングのプロパティは、それぞれのすべてが同じであっても、各セルのためのブランドの新しいスタイルオブジェクトを作成している気づきます。 Excelは、限られた数のスタイル(Excel Specifications and Limitsのドキュメントによれば、最大64,000件)しか処理できないため、通常はこれを行うべきではありません。その代わりに、実際のスタイリングプロパティが異なる新しいスタイルオブジェクトを作成し、同じスタイリングを使用するすべてのセルに共有します。言い換えれば

、このようなループの外あなたのhStyleオブジェクトの作成を動かす:

HSSFCellStyle hStyle = (HSSFCellStyle)templateWorkbook.CreateCellStyle(); 
hStyle.FillForegroundColor = IndexedColors.Red.Index; 
hStyle.FillPattern = FillPattern.SolidForeground; 

for (int i = 1; i < num; i++) 
{ 
    dataRow = (HSSFRow)sheet.GetRow(i); 
    dataRow.GetCell(10, MissingCellPolicy.CREATE_NULL_AS_BLANK).CellStyle = hStyle; 
} 
関連する問題