Есть ли способ отформатировать ячейку даты в Excel с инвариантной культурой, как в C # - PullRequest
2 голосов
/ 11 июля 2019

Проблема, с которой я сталкиваюсь, заключается в том, что в ячейке листа Excel записывается дата. Ячейка отформатирована в произвольном формате, например:

[$-de]dd/mm/yyyy (dddd)

Но только часть (dddd) обрабатывается, чтобы дать мне "Sonntag" (воскресенье на немецком языке).

Формат даты и времени не является фиксированным, хотя я и написал культуру как «де» для пользовательского формата. Есть ли способ достичь следующего результата без изменения формата datetime (гггг-мм-дд)?

Tried                       Output                   Expected output
--------                  -----------------------   -------------------
[$-fr]yyyy-mm-dd (dddd) => 2019-07-31 (dimanche)    31/7/2019 (dimanche)  
[$-de]yyyy-mm-dd (dddd) => 2019-07-31 (Sonntag)     31.7.2019 (Sonntag)
[$-en]yyyy-mm-dd (dddd) => 2019-07-31 (Sunday)      7.31.2019 (Sunday)

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

Поскольку вы указываете точный формат данных в строке (yyyy-mm-dd), Excel должен будет соблюдать его при открытии.AFAIK, Excel не имеет истинного формата по умолчанию, который соответствует тому, что вы ищете.Если вы откроете Excel и укажете формат ячейки, вы можете установить Культуру / Страну, но вам все равно придется выбирать формат - первый обычно использует / в качестве разделителя.

Но если вы хотите использоватьчто в .NET, вы могли бы использовать CultureInfo.DateTimeFormat, чтобы получить то, что вы, как я думаю, после:

CultureInfo c;
var dt = new DateTime(2019,7,31);

c = new CultureInfo("fr-FR");
Console.WriteLine($"{c}: {c.DateTimeFormat.ShortDatePattern}");
Console.WriteLine(dt.ToString($"{c.DateTimeFormat.ShortDatePattern} (dddd)", c.DateTimeFormat));
Console.WriteLine();

c = new CultureInfo("de-DE");
Console.WriteLine($"{c}: {c.DateTimeFormat.ShortDatePattern}");
Console.WriteLine(dt.ToString($"{c.DateTimeFormat.ShortDatePattern} (dddd)", c.DateTimeFormat));
Console.WriteLine();

c = new CultureInfo("en-EN");
Console.WriteLine($"{c}: {c.DateTimeFormat.ShortDatePattern}");
Console.WriteLine(dt.ToString($"{c.DateTimeFormat.ShortDatePattern} (dddd)", c.DateTimeFormat));
Console.WriteLine();

даст вам это в выходных данных:

fr-FR: dd/MM/yyyy
31/07/2019 (mercredi)

de-DE: dd.MM.yyyy
31.07.2019 (Mittwoch)

en-EN: M/d/yyyy
7/31/2019 (Wednesday)

Для использования вExcel сделать это:

[TestMethod]
public void Culture_Info_Data_Format_Test()
{
    ///9772062/est-li-sposob-otformatirovat-yacheiku-daty-v-excel-s-invariantnoi-kulturoi-kak-v-c
    var fileInfo = new FileInfo(@"c:\temp\Culture_Info_Data_Format_Test.xlsx");
    if (fileInfo.Exists)
        fileInfo.Delete();

    using (var pck = new ExcelPackage(fileInfo))
    {
        var dt = new DateTime(2019, 7, 31);
        var workbook = pck.Workbook;
        var worksheet = workbook.Worksheets.Add("Sheet1");
        worksheet.Column(1).Width = 50;

        var c = new CultureInfo("fr-FR");
        var format = $"[$-fr]{c.DateTimeFormat.ShortDatePattern} (dddd)";
        worksheet.Cells[1, 1].Value = dt;
        worksheet.Cells[1, 1].Style.Numberformat.Format = format;

        c = new CultureInfo("de-DE");
        format = $"[$-de]{c.DateTimeFormat.ShortDatePattern} (dddd)";
        worksheet.Cells[2, 1].Value = dt;
        worksheet.Cells[2, 1].Style.Numberformat.Format = format;

        c = new CultureInfo("en-EN");
        format = $"[$-en]{c.DateTimeFormat.ShortDatePattern} (dddd)";
        worksheet.Cells[3, 1].Value = dt;
        worksheet.Cells[3, 1].Style.Numberformat.Format = format;

        pck.Save();

    }

}

, что дает это:

enter image description here

0 голосов
/ 11 июля 2019

Попробуйте использовать приведенную ниже формулу в другом столбце / ячейке, предполагая, что у вас есть дата, начинающаяся с A1

=TEXT(A1,"mm/dd/yyy (dddd[$-fr])")

Надеюсь, это поможет!

Вы можете изменить тип текстовой строки с "/ "к". "или что вы хотите, и языковой формат, изменив этот элемент [$ -fr]

...