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

本文关键字:本地化 设置 格式 日期 单元格 何使用 Excel | 更新日期: 2023-09-27 18:34:30

使用 C# 和 VSTO,可以使用以下代码设置 Excel 中单元格的类型:

worksheet.Cells[i, j].NumberFormat = magicString;

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

以下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代替这个magicString,则会出现错误。

因此,如果我希望我的 Excel 加载项能够为所有(英语、俄语、德语和所有其他(版本的 Excel Windows 的所有本地化设置正确设置"短期"类型,我必须能够使用一些通用magicString,这与提到的两个因素无关。

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

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

然后,将获取的shortDatePattern字符串中的字母替换为与Excel语言对应的字母。但是,在我看来,这种方式太复杂了。

我的问题是:是否有一些适用于所有 Excel 语言和所有 Windows 本地化设置的通用magicString,就像它发生在其他 Excel 类型(如"常规"、"文本">"百分比"(一样?或者,也许有人知道其他简单的方法来达到这种普遍性?

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

你应该能够这样做:

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);

ApplicationInternational属性。可以使用XlApplicationInternational枚举进行查询。例如,对我来说xlYearCode返回é。这对你来说应该是Г的。

之后,您可以使用之前查询的格式代码构建NumberFormat

非常感谢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();