【发布时间】:2016-01-12 18:48:46
【问题描述】:
我正在尝试使用制表符分隔的文本文件作为数据源在我的 Web 应用程序中创建 Excel 电子表格。加载我的数据的代码如下所示:
// Load the data into the cells
Int32 rowIdx = 1;
foreach (String line in tab.Lines)
{
String[] cellTexts = line.Split(TAB);
Int32 colIdx = 1;
foreach (String cellText in cellTexts)
{
sheet.Cells[rowIdx, colIdx].Value = cellText;
colIdx++;
}
rowIdx++;
}
这似乎工作正常。然而,后来,我将“mm/dd/yyyy”的 NumberFormat 添加到单元格中:
range.Style.Numberformat.Format = "mm/dd/yyyy";
但是,这不会更改单元格中数据的显示。 (日期在原始文本文件中类似于 5/1/15 或 12/31/15,并且在应用格式后保持不变。
我很确定这是因为我已将 text 值放入单元格中。 (虽然它看起来像一个日期,但它仍然只是一串字符。)但根据我的阅读,我需要在其中放入一个 double满足 Excel 将日期存储为双精度的期望的单元格。因为单元格包含字符串而不是双精度,所以不应用格式字符串,留下原始的、未格式化的文本。
我想添加一些代码
- 检查应用范围内每个单元格中的数据类型 日期格式。
- 如果不是双精度,请尝试将其转换为日期。
- 如果日期转换成功,则将 .NET 日期转换为 OADate 并放回单元格中。
我的问题是:这是最好的(或至少是合理的)方法吗?如果是,我该怎么做?
此代码不起作用:
foreach (OfficeOpenXml.ExcelRangeBase oneCell in range)
{
if (typeof(oneCell.Value) == "System.String")
{
// date manipulations here
}
}
红线出现在typeof(oneCell.Value) 调用中的oneCell 下,并显示消息“找不到类型或命名空间'oneCell'。(您是否缺少 using 指令或程序集引用?)"
请注意,我无法提前知道日期字段的位置,因为数据和单元格格式都是从外部来源提供的。 (外部单元格格式确实表明所应用的格式是日期格式,而不是常规数字格式或字符串。)
【问题讨论】:
-
我相信您可以直接将
DateTime分配给单元格的值。因此,只需将您的输入解析为 DateTime 对象而不是双精度对象。 -
我采用了不同的方式,将 DateTime.TryParse() 添加到最初将单元格数据加载到工作表中的循环中。基本上,如果它看起来像一个约会,那就把它当作一个约会。 (对于数值,我对 Double.TryParse() 做了同样的事情。)它不是 100%,但它足以满足我当前的需求。此外,正如您所指出的,我不必将 DateTime 转换为 OADate。
-
您应该发布生成的代码作为答案,以帮助未来有类似问题的人。
标签: c# asp.net excel date epplus