2017-12-11 48 views
0

NPOIを使用しています。 私は生成する結果ブックの "テンプレート"として機能する2枚のシートを含むExcelブックを読みました。シート0はいくつかのヘッダー行を除いて空であり、シート1は数行の数式を有する。数式は一般にシート0を参照し、シート0からデータを引き出します。式の後にセル書式が適用されない

私はテンプレートのワークブックに直接書き込むことはできません。なぜなら、行を途中で動かす必要があり、コードが醜いので、2枚のシートで新しい結果ワークブックを作成するからです。プリセットされた構成ファイルに基づいて、この結果ワークブックのシート0にデータを行単位で移入し、テンプレートブックから特定の行のスタイルと数式を複製します。シート0はデータで満たされ、シート1は基本的に相対的にコピーされ、調整された式の行であり、通常はシート0からのデータをここやそこで小さな計算で引っ張る。 シート0のすべてのデータはテキストであり、数値、日付などと解釈できないため、データセルタイプをStringとして設定します。

コードでは、シート1とEvaluateInCellのすべてのセルをループします。 私は明らかに数式を評価するだけでなく、数式を削除し、コピー/計算結果を残すためにこれを行います。これは私がやっている仕事の必須条件です。我々は最終結果を提供し、数式は提供しない。 結果ブックを保存します。

一般的には、セルの書式設定がある場合を除き、書式設定は適用されないようです。 Excelでセルの書式プロパティを取得すると、書式設定が行われます。 たとえば、次のように表示されるデータの日時であるテキストデータがある可能性があります。 7/7/2016 9:54:55 AM これは元のデータテキストですが、カスタムセルフォーマットyyyymmddを持つ。 さらに、セルはまだ表示されます:7/7/2016 9:54:55 AM Excelで、最後に 'M'を削除して 'M'を再入力してEnterキーを押すなど、そのセルは目的のフォーマットに変更され、次のように表示されます。ここでもフォーマットはそのままです。

セルを手動で編集する必要はなく、顧客がExcelでブックを開いた後は何もしないでください。結果のワークブックを値の書式で開くようにします。 私は、暗闇の中のショットのように思えるいくつかのことを試しました。

this.ResultWorkbook.GetCreationHelper()。CreateFormulaEvaluator()。EvaluateAll(); ((XSSFWorkbook)this.ResultWorkbook).SetForceFormulaRecalculation(true);

しかし、これは役に立たなかった。 考えていますか?

+0

"たとえば、私は日付データであるテキストデータを持っているかもしれません":日付時刻の値はExcelではテキストではなく、日付と小数部の整数部分を持つ倍値(1/24 = 1h、 1/24/60 = 1分、1/24/60/60 = 1秒、...)。そして、Excelはテキストを日付としてフォーマットしません**。したがって、 'SetCellValue(DateTime value)'を使って日付と時刻の値を入力する必要があります。 –

+0

残念ながら私のコードはデータを解釈することができません。それは私のコードの単なる文字列であり、別の処理の結果であり、実行時に日時として解釈することはできません。場合によっては、データがすでにフォーマットされていることもあります。そうでない場合は、Excelのセルの書式設定が解決策として期待されます。これは何とかExcelのinteropのコードを外してNPOIに切り替える前に働いていました。 あなたはSetCellValueについて何を言っているのですか?それはデータが何であるか、それがすでに入っているフォーマットを知るために私のコードを必要とします。 – Buzz

+0

"残念ながら私のコードはデータを解釈できません。"残念ながら、私はそれを助けることはできません。 –

答えて

0

ための式を設定しているときに、私はテンプレートを見終わったこのapprioachのいずれかを試すことができます私が書いているExcelファイルのセル。 DateUtil.IsCellDateFormattedでなく、cellStyle.DataFormatが0x31(BuiltInFormatsに基づくテキスト)でない場合は、数値でなければなりません。 それに基づいて、私は自分のテキストをDateTimeに変換しようとするか、または適切な倍精度に変換しようとし、変換された変数でSetCellValueを呼び出します。それ以外の場合は、テキストを書きます。 これは私が遭遇した場合のために働いているようです。

0

セル

アプローチ1

ICellStyle dateCellStyle = workbook.CreateCellStyle(); 
dateCellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("yyyymmdd"); // Or prefix single quote for data when writing it to excel file like 'yyymmdd ex: '20160707 

アプローチ2

XSSFCellStyle dateCellStyle = (XSSFCellStyle)workbook.CreateCellStyle(); 
XSSFDataFormat dateDataFormat = (XSSFDataFormat)workbook.CreateDataFormat(); 
dateCellStyle.SetDataFormat(dateDataFormat.GetFormat("yyyymmdd")); 
関連する問題