我对c#比较陌生,我还在学习很多东西。我也搜索了stackoverflow类似的问题,但到了一个点,我卡住了。
在我的VSTO Excel项目中,我想输出来自数据库的动态数据,每列都有预定义的数字格式,也来自数据库。用户可以定义自己的报表布局。一切都很好,我只是有问题格式化日期值。
当要输出日期列时,格式应该由程序自动确定,而不是在数据库中预先定义。日期值已经作为十进制数插入到Excel工作表中。这里一切都好。当我在Excel中手动格式化时,它会正确显示。
但是我想用c#格式化日期,就像我手动点击Excel中的短日期格式一样。它应该在每个国家都能工作,不管office软件包是用哪种语言安装的。
我正在处理一个德国装置,我希望格式是" t . mm . jjjjjjjj"。当用这个固定字符串格式化列时,它工作得很好(至少在德国我猜)。
用
格式化没有区别CurrentWorksheet.Columns[queryColumn.Position].NumberFormat = "TT.MM.JJJJ";
或
CurrentWorksheet.Columns[queryColumn.Position].NumberFormatLocal = "TT.MM.JJJJ";
都得到相同的(正确的)结果。第一行也能起作用,这对我来说是出乎意料的,但这不是重点。我尝试通过替换" t . mm . jjjjjj"使用以下行:
// Leads to dd.MM.yyyy
System.Globalization.DateTimeFormatInfo.CurrentInfo.ShortDatePattern;
// Fixed German culture still leads to dd.MM.yyyy
CultureInfo.CreateSpecificCulture("de-DE").DateTimeFormat.ShortDatePattern;
// MM/dd/yyyy - also not helpful
CultureInfo.InvariantCulture.DateTimeFormat.ShortDatePattern;
当使用第一个或第二个shortdatpattern时,日期27.08.2014显示为"dd.08.yyyy">。Excel根本不懂&;或";yyyy"。我认为至少当使用NumberFormat而不是NumberFormatLocal它会工作,因为它是全局格式,但它没有。感觉微软实现的日期格式比想象的要复杂得多。
我如何确定这里正确的日期模式?
答案(它仍然是一种变通方法)几乎可以在另一个问题中找到:
如何为Excel中的单元格设置本地化的短日期格式?
在构造ShortDatePattern
(DateFormatComponentCodes
的Application
参数)的方法中,我必须做一个非常小的改变。
public static string ConstructExcelShortDatePattern()
{
var systemDateComponentCodes = new DateFormatComponentCodes();
var excelDateComponentCodes = new DateFormatComponentCodes(Globals.ThisAddIn.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;
}
Thanks toHeinzi寻找一个很好的答案和Jordan感谢提供这样一个有用的类!