有什么办法可以像在C#中一样在具有不变文化的Excel中格式化日期单元格

时间:2019-07-11 09:04:36

标签: c# excel excel-formula epplus cell-formatting

我面临的问题是在Excel工作表的单元格中写入了日期。单元格使用自定义格式进行格式化,例如:

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

但是只有(dddd)部分得到处理后才给我“ Sonntag”(德语为星期日)。

即使我已将自定义格式的区域性写为“ de”,日期时间格式也不是固定的。有什么方法可以在不更改日期时间格式(yyyy-mm-dd)的情况下获得以下结果?

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 :(得分:0)

假设您的日期从A1开始,请尝试在另一列/单元格中使用以下公式

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

希望有帮助!

您可以将文本字符串类型从“ /”更改为“”。或更改此元素[$ -fr]

答案 1 :(得分:0)

由于您要在字符串(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()
{
    //https://stackoverflow.com/questions/56985491/is-there-any-way-to-format-date-cell-in-excel-with-invariant-culture-like-in-c-s
    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