Настройка Excel NumberFormat для дат, игнорирующих локаль в собственном переполнении стека

Я использую Excel COM автоматизации из родного C ++. Моя цель — установить NumberFormat диапазона для дат. Проблема в том, что строка формата, которую ожидает Excel, зависит от локали пользователя.

Пример:
Если локаль английская, я должен установить NumberFormat на «dd.mm.yyyy». Если локаль немецкая, мне нужно использовать «TT.MM.JJJJ», чтобы получить тот же результат.

Я нашел много решений для .NET, к сожалению, у меня нет такой роскоши. Обычное решение состояло в том, чтобы временно установить языковой стандарт потока Excel на английский, но это не представляется возможным с нативным C ++.

Я мог бы прочитать системный языковой стандарт по умолчанию и затем жестко закодировать строки другого формата, но это не сработает, как только кто-то использует языковой стандарт, который я явно не включил, так что это плохое решение.

Итак, как мне решить эту проблему, чтобы она работала независимо от используемой локали?

0

Решение

Одним из возможных решений является использование средства форматирования системного времени (например: _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...");
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]