
现象:
是这种情况. 公司的系统添加了一项新功能,该功能允许用户在页面上生成报告时选择自己喜欢的时间格式. 有四种时间格式可供选择:
默认选项: yyyy-mm-dd
描述性(07年1月1日)
短日期: 年/月/日
短日期: dd / mm / yy
此外,用户可以选择报告是页面格式还是导出为Excel文件. 原始处理显示页面上的时间格式没有问题,但是昨天我发现如果导出Excel,则时间格式有误: (
原因:
经过长时间的探索,我终于有了一些线索. 以下是我首先发现的有关信息:
---------------------------甚至传说中的华丽分隔线Lala ~~~ --------- --------------------
当我们将网页上的数据导入excel格式时,有时我们的数据需要以特定的格式显示,这时我们需要向单元格中添加一些样式规范.

首先,让我们了解从网页导出excel的原理. 当我们将数据发送给客户端时,我们希望客户端程序(浏览器)以excel格式读取数据,因此将MIME类型设置为: application / vnd.ms-excel,当excel读取文件时数据将以每个单元格的格式. 如果该单元格没有规定的格式,Excel将以默认格式显示该单元格的数据. 这为我们提供了自定义数据格式的空间,当然,我们必须使用excel支持的格式. 以下是一些常用格式:
1)文本: vnd.ms-excel.numberformat: @
2)日期: vnd.ms-excel.numberformat: yyyy / mm / dd
3)数字: vnd.ms-excel.numberformat: #,## 0.00
4)货币: vnd.ms-excel.numberformat: ¥#,## 0.00
5)百分比: vnd.ms-excel.numberformat: #0.00%
您还可以自定义这些格式. 例如,您可以将年和月定义为: yy-mm等. 因此,了解这些格式后,如何将这些格式添加到单元格中?非常简单,我们只需要将样式添加到相应的标签对(即封闭标签)即可. 例如,
类似地,我们还可以向
| 542 td> | 0.25 td>
tr> table> 是的,当我们同时向父标签对和子标签对添加样式时,数据将以哪种样式显示?经过测试后,它将以最接近数据的样式呈现,这也符合我们的意愿(这似乎与一句话相符: 县官员不如当前官员). 可以通过更改样式来更改数据在Excel中的显示方式(这些样式规范可以添加到首页或背景代码中,以将这些样式添加到相应的控件中,例如: DataGrid等). 如果您的应用程序相对简单,则足以满足您的需求. 但是,如果您的应用程序更复杂,那么您还可以采用一种方法来实现不同的数据表示效果. 下面,我将引用一个稍微复杂的应用程序. 例如: 您的数据应该呈现给不同国家和地区的用户,这样呈现的数据格式将有所不同,那么我们如何解决这个问题?当然,您可以手动处理这些数据,但这毕竟不是最佳方法,因为如果我们添加其他国家或地区的用户,则我们需要以客户要求的格式处理所有数据. 当数据量很大时,这无疑是非常繁琐的工作. 那么我们应该如何解决这样的问题呢?让我说说我的看法: 程序运行时,将这些格式化的信息提取到xml文件中,根据不同的客户端读取不同的格式化信息,然后将这些格式化的信息动态添加到我们的数据中. 添加来自其他国家或地区的用户,我们只需要再添加一个xml文件,将相应的格式设置信息写入此xml文件中,然后从该国家或地区查看用户时,只需读取相应的格式设置信息并应用即可数据. 上面的例子突然传给我. 我相信跨国公司的公司也会遇到类似的问题. 解决方案只是为您提供一个想法,希望能发挥作用. DataGrid: 在Asp.Net WebForm中导出DataGrid时,它位于ItemDataBound中 if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) {
e.Item.Cells [0] .Attributes.Add(“ style”,“ vnd.ms-excel.numberformat: @”); } 如果您使用WinForm,则可以 Excel.Range range =(Excel.Range)worksheet.Cells [1,1]; range.NumberFormat = Excel.XlParameterDataType.xlParamTypeUnknown; VB: 如果e.Item.ItemType = ListItemType.Item或e.Item.ItemType = ListItemType.AlternatingItem然后 e.Item.Cells(1).Attributes.Add(“ style”,“ vnd.ms-excel.numberformat: @”) 如果结束 如果它是标签,则添加 | 的样式: |
如果是Gridview,(07.12.13更新) 您需要在后台打印单击事件代码中添加两个句子: //更多代码 字符串样式= @“ <样式> .text {mso-number-format: \ @;} script>”; Response.Write(style); Response.Output.Write(oStringWriter.ToString()); --------------------------------------------------- ---------------- 以下内容开始处理此问题的过程: 首先,按照上述文章所述,将样式属性添加到 | td>标记中,然后根据用户选择的时间格式进行设置: | ... td>
然后开始测试. 因此,前三种时间格式都可以. 最后一个: dd / mm / yy,有些时候是正确的,有些是错误的,而所有错误都是dd> 12的时间. 为什么会这样呢?经过反复测试,我终于弄清楚了: 事实证明,当我们使用导出的数据到Excel时,Excel会停止它!不仅如此,无论您输入哪种格式,我们都可以尝试在Excel中输入时间,这会将时间强制为mm / dd / yyyy格式. 当我将过去的日期(例如: 30/10/08)传递给它时,它是愚蠢的,因为它不知道,并且当它显示在单元格中时,它也会诚实地显示为30/10/08,这是歪曲的(实际上是错误的). 但是如果它是1/10/08(我转换的dd / mm / yy格式)怎么办?可以忽略不计,认为此(1/10/08)是mm / dd / yy格式,无论三七二十一转换为1/10/2008,请注意,此(1/10/2008)表示2008年1月10日,我完全偏离了意愿: ( 忘了说些什么,当我们从中取出日期数据时,我们将根据用户选择的格式(上面列出的4种格式)对其进行格式化. 目前,我想到了一个技巧,即,如果用户选择dd / mm / yy的格式,则我不会将日期格式设置为dd / mm / yy,而是将mm / dd / yy格式化,以便当数据到达Excel可以区分. 同时,由于我指定了 | 的样式属性,因此excle将严格按照该格式显示(无论Excel中显示的时间格式如何,当您编辑时间时,您都会看到可以编辑的格式为始终为mm / dd / yyyy.
至此,问题已得到令人满意的解决.
相关阅读
发表评论 请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论
每日福利
|