2017-06-26 12 views
0

私はEPPlusを使用しており、ワークブックの各ワークシートのすべての列を反復処理しています。私は、数値フォーマットとして "NUMBER"という単語を含むヘッダーで各列をフォーマットしようとしています。それは実行され、数値書式を設定するブレークポイントに当たっていますが、スプレッドシートを開くと、列はまだテキストとして書式設定されています。どんな助けでも大歓迎です。Epplusを使用して特定の列を構成していない

private void cleanSpreadSheet(string fileName) 
    { 
     // set all columns with a header of number to numeric type 
     FileInfo existingFile = new FileInfo(fileName); 
     var package = new ExcelPackage(existingFile); 

     ExcelWorkbook wb = package.Workbook; 

     foreach (ExcelWorksheet workSheet in wb.Worksheets) 
     { 
      var start = workSheet.Dimension.Start; 
      var end = workSheet.Dimension.End; 
      for (int col = start.Column; col <= end.Column; col++) 
      { // col by col 
       if (workSheet.Cells[1, col].Text.ToUpper().Contains("NUMBER")) 
       { 
        workSheet.Column(col).Style.Numberformat.Format = "0";       
       } 

      } 
     } 
     package.Save(); 
     package.Dispose(); 
     wb.Dispose(); 
    } 
+0

あなたがオブジェクトでのDisposeを呼び出す必要がある場合、それはコードのにおいです。おそらく、[usingステートメント](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement)を使用しているはずです。 – mason

+1

私はあなたがしたいと思うのは、フォーマットを設定するのではなく、列のデータ型を設定することです。私はEPPlusが、行の値を同じに設定しているオブジェクトのタイプに基づいていると判断します。例については、[私の質問](https://stackoverflow.com/questions/23816043/epplus-date-cell-datatype-not-working)を参照してください。 – mason

+1

既存のワークブックのセルの内容が「テキスト」の場合、@masonの説明に基づいて拡張するには、おそらくint.Parse/double.Parseを実行し、セルの内容を「Numbers」 – sfm

答えて

1

問題は、既存のExcelワークブックのデータがExcelの「テキスト」としてフォーマットされている可能性があります。これが当てはまる場合、Excelが「テキスト」を「数値」に変換する方法を知らないため、各セルの形式を数値に変換することはできません。

代わりに、EPPlusの各列と行を反復処理し、それらをキャストした後に各値を置き換える必要があります。以下のコードは、キャストのエラーチェックを使用することができますが、コンセプトの感覚を与えます。

//foreach row ... foreach column... ExcelRange cell = worksheet.Cells[row, col]; cell.Value = double.Parse((string)cell.Value);

関連する問題