从EPPLUS中的文本文件加载date
我正在尝试使用制表符分隔的文本文件作为数据源在我的Web应用程序中创build一个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";
但是,这不会更改单元格中数据的显示。 (date看起来像原始文本文件中的5/1/15
或12/31/15
,并在应用格式后保持这种状态。
我很确定这是因为我把一个文本值放入单元格。 (虽然看起来像一个date,但它仍然只是一串字符)。但是从我的阅读,我需要把一个双重的单元格,以满足Excel的期望date存储为双。 因为单元格包含一个string而不是双精度型,所以不会应用格式string,而保留原始的未格式化文本。
我想添加一些代码
- 检查应用date格式的范围内的每个单元格中的数据types。
- 如果不是双精度,则尝试将其转换为date。
- 如果date转换成功,则将.NETdate转换为OADate并将其放回到单元格中。
我的问题是: 这是最好的(或至less是合理的)方法,如果是这样,我该怎么做?
此代码不起作用:
foreach (OfficeOpenXml.ExcelRangeBase oneCell in range) { if (typeof(oneCell.Value) == "System.String") { // date manipulations here } }
红线出现在oneCell
typeof(oneCell.Value)
调用的typeof(oneCell.Value)
,并且显示“ 找不到types或名称空间”oneCell“(你是否缺lessusing指令或程序集引用?
请注意,我无法预先知道date字段的位置,因为数据和单元格格式都是从外部来源提供的。 (外部单元格格式确实表明所使用的格式是date格式,而不是常规数字格式或string。
正如@masonbuild议,我张贴我用来解决这个问题的代码。
(我没有得到我原来的问题的答案,这是如何迭代范围内的单元格,并检查每个单元格的内容的数据types,但使用这种解决scheme,我不再需要这样做。
相反,我修改了从制表符分隔的文本文件中加载数据的循环,以使用一些TryParse()
调用来检测date,数字或常规文本数据,然后将相应types的数据加载到单元格中。 请注意,如果单元格实际上是文本,但它看起来像一个数字或date,它将如何检查单引号字符以抑制数据types的input:
// 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) { DateTime dateValue; Double doubleValue; if(cellText.StartsWith("'")) { sheet.Cells[rowIdx, colIdx].Value = cellText.Substring(1); } else if(DateTime.TryParse(cellText,out dateValue)) { sheet.Cells[rowIdx, colIdx].Value = dateValue; } else if (Double.TryParse(cellText, out doubleValue)) { sheet.Cells[rowIdx, colIdx].Value = doubleValue; } else { sheet.Cells[rowIdx, colIdx].Value = cellText; } colIdx++; } rowIdx++; }
在单元格中正确input数据的情况下,格式具有所需的效果。