Я использую Excel COM автоматизации из родного C ++. Моя цель — установить NumberFormat диапазона для дат. Проблема в том, что строка формата, которую ожидает Excel, зависит от локали пользователя.
Пример:
Если локаль английская, я должен установить NumberFormat на «dd.mm.yyyy». Если локаль немецкая, мне нужно использовать «TT.MM.JJJJ», чтобы получить тот же результат.
Я нашел много решений для .NET, к сожалению, у меня нет такой роскоши. Обычное решение состояло в том, чтобы временно установить языковой стандарт потока Excel на английский, но это не представляется возможным с нативным C ++.
Я мог бы прочитать системный языковой стандарт по умолчанию и затем жестко закодировать строки другого формата, но это не сработает, как только кто-то использует языковой стандарт, который я явно не включил, так что это плохое решение.
Итак, как мне решить эту проблему, чтобы она работала независимо от используемой локали?
Одним из возможных решений является использование средства форматирования системного времени (например: _tcsftime, strftime, wcsftime) для форматирования структуры даты / времени в соответствии с языковым стандартом работающей системы. Поскольку и ваша программа, и Excel должны работать на одном и том же ПК, они должны работать должным образом, даже не зная, как выглядит локальная строка даты / времени.
В качестве резервного решения вам, возможно, придется предоставить ряд жестко закодированной строки формата и / или строку, введенную пользователем вручную, в разделе параметров конфигурации вашей программы, на случай, если формат локали по умолчанию не удастся выполнить.
Дополнительная информация после первого ответного комментария от ОП: —————
Настройка языкового стандарта влияет на представление текстового дисплея объекта datetime-binary только в пользовательском интерфейсе. Такой datetime-binary-object всегда хранится в виде двоичной структуры очень непротиворечивым образом, независимо от настроек локали, даже в разных контекстах, будь то в Excel (ячейка формата даты / времени), C ++ (различная структура зависит от API) VisualBasic (вариант).
Поэтому, если вы намерены экспортировать двоичную структуру datetime в excel, а не как strng, вы всегда можете использовать тип варианта для хранения значения даты, так как в excel-автоматизации используется интерфейс IDispatch. Вы можете полностью забыть о настройке локали.
Добавление фрагмента кода в экспортный вариант даты и времени и форматирование ячейки по коду: —————-
Я использую 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...");
Других решений пока нет …