如何使用 C# 在 Excel 中为单元格设置本地化的短日期格式
本文关键字:本地化 设置 格式 日期 单元格 何使用 Excel | 更新日期: 2023-09-27 18:34:30
使用 C# 和 VSTO,可以使用以下代码设置 Excel 中单元格的类型:
worksheet.Cells[i, j].NumberFormat = magicString;
,其中 worksheet
是 Microsoft.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 类型(如"常规"、"文本">和"百分比"(一样?或者,也许有人知道其他简单的方法来达到这种普遍性?
你应该能够这样做:
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);
Application
有International
属性。可以使用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();