2

XMLを解析してxlsxファイルからデータを読み取るコードを使用しています。日付セルを除いて、すべて非常に簡単です。

日付は整数として格納され、スタイルシートへのインデックスである "s" 属性を持ち、日付の書式設定文字列を取得するために使用できます。以下にリンクされている以前のスタックオーバーフローの質問の例をいくつか示します。

19 = 'h:mm:ss AM/PM';

20 = 'h:mm';

21 = 'h:mm:ss';

22 = 'm/d/yy h:mm';

これらは ooxml 標準の組み込みの日付書式設定文字列ですが、Excel は組み込みの代わりにカスタム書式設定文字列を使用する傾向があるようです。Excel 2007 スプレッドシートの形式の例を次に示します。164 より大きい numFmtId はカスタム形式です。

<numFmt formatCode="MM/DD/YY" numFmtId="165"/>

セルを日付としてフォーマットする必要があるかどうかを判断するのは困難です。これは、見つけることができる唯一の指標が formatCode であるためです。これは明らかに日付ですが、セルはさまざまな方法でフォーマットできます。私の最初の試みは、formatCode で M、D、および Y を探すことですが、これには問題があるようです。

この問題で運が良かった人はいますか?現時点では、標準の Excel 読み取りライブラリでは xlsx がサポートされていないようです。私は標準を読み、多くの xlsx ファイルを掘り下げましたが、あまり運がありませんでした。

最良の情報は、このスタックオーバーフローの質問から得られるようです:

Office Open xml セルに日時値が含まれていることを示すもの

ありがとう!

4

2 に答える 2

5

日付は整数として格納されます

Excel データ モデルには、整数のようなものは実際にはありません。すべてがフロートです。日付と日時は float であり、可変エポックからの日数と端数を表します。時間は 1 日の分数です。

現時点では、標準の Excel 読み取りライブラリでは xlsx がサポートされていないようです。

グーグル(「xlsxrd」)。最新情報を入手するには、python-excel グループに参加してください。

編集すでに質問されているようです。これと同じくらい具体的な質問をしたり、私の質問に回答したりした場合は、2 週間以上前にこの情報を入手していたことでしょう。

xlrd のドキュメントを参照してください。最初に、Excel の日付に関する議論があります。これらはすべて、Excel 2007 およびそれ以前のバージョンに適用されます。特に、カスタム形式を解析する必要があります。日付形式用の「標準」形式インデックスのテーブルが必要です。一部の場所にリストされている「標準」形式には、CJK ロケールで使用される形式が含まれていません。

あなたのためのオプション:

(1) xlrdxldate_as_tuple 関数を含むソース コードから借用します。

(2) オプション (1) +xlsxrdボルトオン キットを入手し、そのソース コードを借用します。

(3) [推奨]xlsxrdボルトオン キットを入手して使用すると、Excel バージョン 2.0 ~ 2007 および Python バージョン 2.1 ~ 2.7 で動作する一連の API が得られます。

于 2011-02-09T21:14:03.083 に答える
0

数値形式コードで M、D、および Y を探すだけでは十分ではありません

[Red]#,##0 ;[Yellow](#,##0)

Y と D の両方を含む完全に有効な数値形式ですが、日付形式ではありません。特に、角括弧 ('[' '] ')。それでも、主に会計と通貨の形式に関連するいくつかの誤検知がすり抜けていることに気付きました。これらは通常、アンダースコア ('_') またはスペースの後にゼロ (' 0') で始まるため (どちらも日付形式で遭遇したことがないため、明示的にこれらの値を除外します.

フォーマットマスクが日付かどうかを判断するための私の(PHP)コードの一部:

private static  $possibleDateFormatCharacters = 'ymdHis';

//  Typically number, currency or accounting (or occasionally fraction) formats
if ((substr($pFormatCode,0,1) == '_') || (substr($pFormatCode,0,2) == '0 ')) {
    return false;
}
// Try checking for any of the date formatting characters that don't appear within square braces
if (preg_match('/(^|\])[^\[]*['.self::$possibleDateFormatCharacters.']/i',$pFormatCode)) {
    return true;
}

// No date...
return false;

私が見逃している例外がまだあるかもしれないと確信していますが、(もしそうなら)それらはおそらく極端なケースです

于 2011-02-10T09:07:03.360 に答える