c# を使用して Open XML 2.0 を操作し、大きな Excel ファイルを解析します。私が直面している問題は、解析しているセルに DataType がないことです。次に、NumberFormatId をチェックして、10 進数、数値、または日付かどうかを判断します。数値/小数と日付の正確な NumberFormatId 範囲を探しています。一部の数値/小数の形式は189,212,214,305で、日付の値は185、194、278などです。仕様でこれらの範囲が定義されているかどうかは誰にもわかりませんか?
編集済み - 詳細情報
以下は、xl フォルダー内の style.xml ファイルからの 194 の数値形式の例です。
Excelシートは世界のさまざまな地域のものなので、数値の形式が異なると思いますが、重複していますか? numFmtId 194 は、異なるカルチャ設定の日付以外のものになりますか?
以下は、「40574」のような c.CellValues を日付に変換する方法ですが、問題は「40574」が数値ではなく日付であるかどうかをどのように知るかです。
DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));
現在、CellFormatをチェックするよりもDataTypeがないかどうかをチェックすることでこれを行っていますが、NumberFormatIdの一部がチェックされていない場合に問題があります。
private Object FormatCellValue(Cell c, SharedStringTable ssTable, CellFormats cellFormats)
{
if (c.CellValue != null)
{
// If there is no data type, this must be a string that has been formatted as a number
if (c.DataType == null)
{
CellFormat cf;
if (c.StyleIndex == null)
{
cf = cellFormats.Descendants<CellFormat>().ElementAt<CellFormat>(0);
}
else
{
cf = cellFormats.Descendants<CellFormat>().ElementAt<CellFormat>(Convert.ToInt32(c.StyleIndex.Value));
}
if ((cf.NumberFormatId >= 14 && cf.NumberFormatId <= 22) ||
(cf.NumberFormatId >= 165 && cf.NumberFormatId <= 180) ||
cf.NumberFormatId == 278 || cf.NumberFormatId == 185 || cf.NumberFormatId == 196 ||
cf.NumberFormatId == 217 || cf.NumberFormatId == 326) // Dates
{
try
{
DateTime dt;
dt = DateTime.FromOADate(Convert.ToDouble(c.CellValue.Text));
...CODE CONTINUES
編集
私の更新された投稿では、style.xml ファイルで見つけた値を投稿するのを忘れていました。
<numFmt numFmtId="323" formatCode="mmm/yy;@"/>
これで私の質問は、どのように formatCode を取得し、それを解析して日付かどうかを判断するのですか?
以下は、numberformat 323 の即時デバッグ ウィンドウからの出力です。
{DocumentFormat.OpenXml.Spreadsheet.CellFormat}
base {DocumentFormat.OpenXml.OpenXmlCompositeElement}: {DocumentFormat.OpenXml.Spreadsheet.CellFormat}
Alignment: {DocumentFormat.OpenXml.Spreadsheet.Alignment}
ApplyAlignment: "1"
ApplyBorder: "1"
ApplyFill: "1"
ApplyFont: "1"
ApplyNumberFormat: "1"
ApplyProtection: "1"
BorderId: "64"
ExtensionList: null
FillId: "0"
FontId: "83"
FormatId: "37992"
LocalName: "xf"
NumberFormatId: "323"
PivotButton: null
Protection: {DocumentFormat.OpenXml.Spreadsheet.Protection}
QuotePrefix: "1"