Excel中的SQL Serverdate时间对象持久性重新格式化问题

我有一个令人讨厌的问题,在Excel 2013中使用SQL Server DATETIME对象。这个问题已经在这里说过几次了,而且我知道解决方法是只重新格式化Excel中的DATETIME对象,方法是:

  • 右键单击该单元格
  • select格式单元格
  • select自定义
  • 在types:input字段中inputyyyy-mm-dd hh:mm:ss.000

这工作正常,但我讨厌不得不每次这样做。 除了创buildmacros之外,还有一个永久性的工作吗? 我需要维护DATETIME对象的粒度,所以我不能使用SMALLDATETIME 。 我目前正在win7机器上使用Microsoft SQL Server Management Studio 2008 R2。

提前致谢。

-Stelio K.

没有任何代码,很难猜测数据是如何从SQL Server转移到Excel的。 我认为这不是通过数据连接,因为Excel不会有任何问题直接显示数据为date。

数据连接呢?

Excel仅支持数据连接时,不支持任何forms的格式或任何有用的devise器。 该function由Power Query或数据透视表devise器提供。 Power Query集成在Excel 2016中,可作为Excel 2010+下载。

为什么你需要格式化date

Excel不保留types信息。 一切都是一个string或数字,它的显示是由单元格的格式来pipe理的。

date使用OLE自动格式存储为小数 – 整数部分是自1900-01-01以来的date数,小数部分是时间。 这就是为什么System.DateTime具有FromOADateToOADate函数的原因。

要使用date创buildExcel工作表,应该在生成单元格的同时设置单元格格式。

如何格式化单元格

如果您使用Open XML SDK或类似EPPlus的库,则可以做到这一点。 以下示例从客户列表中创build一个Excel工作表:

 static void Main(string[] args) { var customers = new[] { new Customer("A",DateTime.Now), new Customer("B",DateTime.Today.AddDays(-1)) }; File.Delete("customers.xlsx"); var newFile = new FileInfo(@"customers.xlsx"); using (ExcelPackage pck = new ExcelPackage(newFile)) { var ws = pck.Workbook.Worksheets.Add("Content"); // This format string *is* affected by the user locale! // and so is "mm-dd-yy"! ws.Column(2).Style.Numberformat.Format = "m/d/yy h:mm"; //That's all it needs to load the data ws.Cells.LoadFromCollection(customers,true); pck.Save(); } } 

代码使用LoadFromCollection方法直接加载客户列表,而不处理单元格。 true意味着生成一个头文件。

有相当于从其他来源加载数据的方法:LoadFromDatatable,LoadFromDataReader,LoadFromText用于CSV数据,甚至LoadFromArrays用于锯齿形对象数组。

奇怪的是,指定m/d/yy h:mm或者mm-dd-yy格式使用用户的语言环境进行格式化, 而不是 US格式! 这是因为这些格式内置到Excel中,并被视为区域设置相关的格式。 在date格式列表中,它们以星号显示,表示它们受用户语言环境的影响。

造成这种奇怪的原因是,10年前Excel转移到基于XML的XLSX格式时,出于向后兼容性的原因,它保留了较旧的XLS格式的怪癖。

当EPPlus保存xlsx文件时,会检测它们,并存储对内置格式ID(分别为22和14)的引用,而不是存储整个格式string。

查找格式ID

标准格式ID列表显示在Open XML标准的NumberingFormat元素文档页面中。 Excel最初定义了ID 0(一般)到49。

EPPlus不允许直接设置ID。 它检查格式string,并只映射格式0-49,如ExcelNumberFormat的GetBfromBuildIdFromFormat方法所示 。 为了得到ID 22,我们需要将Format属性设置为"m/d/yy h:mm"

另一个技巧是检查现有工作表的样式表。 xlsx是一个压缩的XML文件包,可以用任何解压缩工具打开。 样式存储在xl\styles.xml文件中。