如何使用C#为Excel单元格设置本地化的短日期格式?

3
使用C#和VSTO,可以使用以下代码设置Excel中单元格的类型:
worksheet.Cells[i, j].NumberFormat = magicString;

在这里,worksheetMicrosoft.Office.Interop.Excel.Worksheet类的一个对象,i是单元格的行号,j是单元格的列号,magicString是定义单元格类型的字符串(注意:Excel将类型称为“格式”,但下面我使用了“类型”一词)。

以下magicString定义以下Excel类型:

  • string magicString = ""; - 定义“通用”Excel类型;
  • string magicString = "@"; - 定义“文本”Excel类型;
  • string magicString = "0%"; - 定义“百分比”Excel类型。

当我想设置“日期”Excel类型时,情况会更加复杂。这种复杂性与Excel的本地化以及Windows系统的本地化有关。

例如,我有俄语版的Excel(特别是所有类型在Excel中都是用俄语编写的),并且我的Windows系统具有以下短日期格式:“dd.MM.yyyy”(可以在控制面板>区域和语言>格式中找到此设置)。我有英文版的Windows,但这完全没有任何影响。

因此,如果我在代码中使用以下magicString,则单元格的类型将设置为短日期类型:

  • string magicString = "ДД.ММ.ГГГГ"; - 定义“日期”(或更准确地说是“短日期”)Excel类型;

如您所见,在这里,magicString是俄语字母(因为Excel是俄语的)和Windows设置中的格式的组合。

如果我使用等于“DD.MM.YYYY”(即英文字母)的magicString,则会出现错误。

因此,如果我希望我的Excel插件能够为所有(英语、俄语、德语和所有其他)版本的Excel以及Windows的所有本地化设置正确设置“短日期”类型,则必须能够使用某些通用的magicString,该字符串独立于两个提到的因素。

作为一种选择,我可以使用以下代码从Windows设置中读取短日期格式:

string shortDatePattern = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;

然后,将获取的 shortDatePattern 字符串中的字母替换为与 Excel 语言相对应的字母。然而,这种方式对我来说似乎太复杂了。
我的问题是:是否存在一些通用的 magicString,适用于所有 Excel 语言和所有 Windows 本地化设置,就像其他 Excel 类型(如“常规”,“文本”和“百分比”)一样?或者,也许有人知道其他简单的方法来实现这种普遍性?
2个回答

5
你应该能够像这样做:
Application xlApp = new Application();
Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet ws = wb.Worksheets[1];

var yearCode = xlApp.International[XlApplicationInternational.xlYearCode];
var monthCode = xlApp.International[XlApplicationInternational.xlMonthCode];
var dayCode = xlApp.International[XlApplicationInternational.xlDayCode];

ws.Cells[1, 1].NumberFormat = string.Format("{0}{1}.{2}{3}.{4}{5}{6}{7}", dayCode, dayCode, monthCode, monthCode, yearCode, yearCode, yearCode, yearCode);

应用程序 上有 国际化 属性。您可以使用 XlApplicationInternational 枚举来查询它。例如,对我来说 xlYearCode 返回 é。而对于您来说应该是 Г
然后,您可以使用先前查询的格式代码构建您的 NumberFormat

谢谢!它有效!但我决定提供更完整的答案来回答我的问题,该答案基于您的代码,请见下文。 - Jordan

4
感谢Szabolcs Dézsi提供的提示。但它只解决了我的问题的一部分。另一个问题是如何从Windows系统本地化设置中提取日期格式代码?我在互联网上没有找到答案,并提供了自己的解决方案,结合了Szabolcs Dézsi的解决方案。
首先,让我们创建以下类:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;

using Excel = Microsoft.Office.Interop.Excel;

namespace MyNamespace
{
    internal sealed class DateFormatComponentCodes
    {
        private readonly char year;
        private readonly char month;
        private readonly char day;

        // Constructs the object based on the system localization.
        public DateFormatComponentCodes()
        {
            DateTimeFormatInfo dateTimeFormatInfo = CultureInfo.CurrentCulture.DateTimeFormat;

            var yearMonth = new HashSet<char>(new HashSet<char>(dateTimeFormatInfo.YearMonthPattern.ToCharArray()).Where(c => char.IsLetter(c)));
            var monthDay = new HashSet<char>(new HashSet<char>(dateTimeFormatInfo.MonthDayPattern.ToCharArray()).Where(c => char.IsLetter(c)));

            var monthHashSet = new HashSet<char>(yearMonth);
            monthHashSet.IntersectWith(monthDay);
            this.month = monthHashSet.First();

            yearMonth.ExceptWith(monthHashSet);
            this.year = yearMonth.First();

            monthDay.ExceptWith(monthHashSet);
            this.day = monthDay.First();
        }

        // Constructs the object based on the Excel localization.
        public DateFormatComponentCodes(Excel.Application application)
        {
            this.year = application.International[Excel.XlApplicationInternational.xlYearCode].ToString()[0];
            this.month = application.International[Excel.XlApplicationInternational.xlMonthCode].ToString()[0];
            this.day = application.International[Excel.XlApplicationInternational.xlDayCode].ToString()[0];
        }

        public char Year
        {
            get
            {
                return this.year;
            }
        }

        public char Month
        {
            get
            {
                return this.month;
            }
        }

        public char Day
        {
            get
            {
                return this.day;
            }
        }
    }
}

现在,让我们创建两个此类对象,并使用它们生成Excel的短日期格式模式(以上称为“魔术字符串”):

private string ConstructExcelShortDatePattern()
{
    var systemDateComponentCodes = new DateFormatComponentCodes();
    var excelDateComponentCodes = new DateFormatComponentCodes(this.application);

    string systemShortDatePattern = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
    string excelShortDatePattern = systemShortDatePattern.Replace(systemDateComponentCodes.Year, excelDateComponentCodes.Year).Replace(systemDateComponentCodes.Month, excelDateComponentCodes.Month).Replace(systemDateComponentCodes.Day, excelDateComponentCodes.Day);

    return excelShortDatePattern;
}

返回的字符串可以用于设置所有 Windows 和 Excel 本地化的短日期格式,例如:
worksheet.Cells[i, j].NumberFormat = ConstructExcelShortDatePattern();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接