0

ネイティブ C++ から Excel COM オートメーションを使用しています。私の目標は、日付の範囲の NumberFormat を設定することです。問題は、Excel が期待する書式文字列がユーザーのロケールに依存することです。

例: ロケールが英語の場合、NumberFormat を「dd.mm.yyyy」に設定する必要があります。ロケールがドイツ語の場合、同じ結果を得るには「TT.MM.JJJJ」を使用する必要があります。

私は .NET の解決策をたくさん見つけましたが、残念ながら私にはその余裕がありません。通常の解決策は、Excel スレッドのロケールを一時的に英語に設定することでしたが、ネイティブ C++ では不可能のようです。

デフォルトのシステム ロケールを読み取ってから、さまざまな形式の文字列をハードコードすることもできますが、明示的に含めていないロケールを誰かが使用するとすぐに機能しないため、これは悪い解決策です。

では、どのロケールが使用されていても機能するように、この問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

考えられる解決策の 1 つは、システム時刻フォーマッター (_tcsftime、strftime、wcsftime など) を使用して、実行中のシステムのロケールに合わせて日付/時刻構造をフォーマットすることです。プログラムと Excel の両方が同じ PC で実行されることが想定されているため、ローカルの日付/時刻文字列がどのように見えるかを知らなくても、正しく動作するはずです。

デフォルトのロケール形式が失敗した場合に備えて、フォールバック ソリューションとして、一連のハードコードされた形式文字列および/またはユーザーが手動で入力した文字列をプログラムのオプション構成セクションに提供する必要がある場合があります。

OPからの最初の返信コメント後の追加情報: --------------

locale 設定は、UI でのみ datetime-binary-object のテキスト表示プレゼンテーションに影響します。このような datetime-binary-object は、Excel (日付/時刻形式のセル)、C++ (さまざまな構造が api に依存する) など、それぞれ異なるコンテキストであっても、ロケール設定に関係なく、常に非常に一貫した方法でバイナリ構造として格納されます。 、VisualBasic (バリアント)。

そのため、datetime バイナリ構造を strng としてではなく Excel にエクスポートする場合は、excel-automation が IDispatch インターフェイスを使用するため、いつでも「バリアント」型を使用して日付値を格納できます。ロケール設定を完全に忘れることができます。

datetime バリアントをエクスポートし、コードでセルをフォーマットするためのコード フラグメントの追加: ----------------

私は MFC を使用しているため、コードは非常に単純です。自分で winapi に変換する必要がある場合があります。

_Application app;
if (!app.CreateDispatch("Excel.Application"))
{   AfxMessageBox("Cannot start Excel !");
    return;
}
app.SetVisible(TRUE);   
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
Workbooks objbooks = app.GetWorkbooks();
_Workbook objbook = objbooks.Add(VOptional);
Worksheets objsheets = objbook.GetWorksheets();
_Worksheet objsheet = objsheets.GetItem(COleVariant((short)1));

// get current date time
COleDateTime timeCurrent = COleDateTime::GetCurrentTime();

// setting date values
Range range;
range = objsheet.GetRange(COleVariant("A2"), COleVariant("B3"));
range.SetValue(COleVariant(timeCurrent));
//  range.SetNumberFormat(COleVariant("dd/mm/yyyy"));
range.SetNumberFormat(COleVariant("dddd, mmmm dd, yyyy"));

AfxMessageBox("Done...");
于 2013-02-25T18:22:52.623 に答える