私が現在使用している製品では、Delphi の OLE を使用して Excel スプレッドシートが生成されます。スプレッドシートには、アプリケーションがシステム設定から shortdate 形式をロードし、これをセルに適用する多数の日付が含まれています。システム形式が少なくともロシア語、バシキール語、タタール語、ヤクート語、カザック語、ウズベク語のいずれかに設定されている場合を除いて、これは完全に機能します (私が試したことのない他のものがあるかもしれません)。
コードは-
xlws.Cells[irow,icol] := ActivityData.Target_Date;
xlvalidrange := xlws.Range[xlws.Cells[irow,icol],xlws.Cells[irow,icol]];
xlvalidrange.NumberFormat:= LocShortDateFormat;
この場合 (デバッグ中)、ActivityData.Target_Date は 41192 です。これは、Excel が日付と時刻を格納する形式であり、LocShortDateFormat は 'dd.MM.yyyy' に等しくなります。これは、ロシア語の Windows で表示されるストアの日付形式と一致し、次のコードを使用してプログラムで取得されます。
LocShortDateFormat := ShortDateFormat;
この形式のスプレッドシートを開くと、次のメッセージが表示されます-
Excel で Spreadsheet.xlsx に読み取り不能なコンテンツが見つかりました。このブックのコンテンツを復元しますか?
これを行うと、データは単純に数字 41192 として表示され、セルにはフォーマットがありません。さらに興味深いことに、「dd.MM.yyyy」のフォーマット文字列を手動で適用すると、データの代わりにセルに「dd.MM.yyyy」が表示されます。
同じことが、標準の日付/時刻文字列フォーマット文字にも当てはまります。「日付」カテゴリと対応するタイプを形式として選択することにより、データを手動で日付形式に変更し、正しく表示することができます。そのため、これはデータの問題ではなく、形式文字列の問題です。
正しい日付形式を手動で選択するときに Excel で使用される書式文字列は ДД.ММ.ГГГГ です。デバッグ中に使用される書式文字列を手動で変更すると、生成されたスプレッドシートに正しい出力が生成され、判読できないコンテンツ メッセージが表示されなくなります。
奇妙なことに、中国語、日本語、セルビア語、マケンドニア語 (英語以外の文字セット言語のサンプルとして) はすべて、標準の日付/時刻書式設定文字で動作します。
Excel 自体では、スプレッドシートが新しく、プログラムで作成されていない場合、つまり、Excel アプリケーション内から作成された新しいスプレッドシートであっても、標準文字が正常に機能しないようです。
これは事実であり、Delphi または Windows の問題ではないようです (C# Windows フォームは、ロシア語ロケールでも標準文字を使用して日付を正しくフォーマットすることに問題はありませんでした)、正しいフォーマットを返す方法の問題はまだ残っています。 Delphi 内の文字列。
問題があることが知られているロケールをテストする一連の条件付き「if」ステートメントを実行することに熱心ではありませんが、これまでに行った調査に基づいて、この問題に対処する唯一の方法のようです。
書式設定文字列を提供せずに OLE 経由でローカルの日付書式設定を使用するように Excel に依頼する方法、または文字列を正しい形式で提供するために Excel がそのローカリゼーションで日付を書式設定するために使用する文字列を取得する方法はありますか?