从 EPPLUS 中的文本文件加载日期
Loading dates from a text file in EPPLUS
我正在尝试使用制表符分隔的文本文件作为数据源在我的 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 指令或程序集引用?)"
请注意,我无法提前知道日期字段的位置,因为数据和单元格格式都是从外部来源提供的。 (外部单元格格式确实指示所应用的格式何时适用于日期格式,而不是常规数字格式或字符串。)
正如@mason 所建议的,我发布了我用来解决这个问题的代码。
(我没有得到我最初问题的答案,即如何迭代一个范围内的单元格并检查每个单元格内容的数据类型,但有了这个解决方案,我不再需要这样做。 )
相反,我修改了从制表符分隔的文本文件加载数据的循环,以使用一些 TryParse()
调用来检测日期、数字或常规文本数据,然后将适当类型的数据加载到细胞。请注意,如果单元格实际上是文本,它如何检查前导单引号字符以抑制数据键入,但 看起来 像数字或日期:
// 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++;
}
在单元格中正确键入数据后,格式会产生预期的效果。
我正在尝试使用制表符分隔的文本文件作为数据源在我的 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 指令或程序集引用?)"
请注意,我无法提前知道日期字段的位置,因为数据和单元格格式都是从外部来源提供的。 (外部单元格格式确实指示所应用的格式何时适用于日期格式,而不是常规数字格式或字符串。)
正如@mason 所建议的,我发布了我用来解决这个问题的代码。
(我没有得到我最初问题的答案,即如何迭代一个范围内的单元格并检查每个单元格内容的数据类型,但有了这个解决方案,我不再需要这样做。 )
相反,我修改了从制表符分隔的文本文件加载数据的循环,以使用一些 TryParse()
调用来检测日期、数字或常规文本数据,然后将适当类型的数据加载到细胞。请注意,如果单元格实际上是文本,它如何检查前导单引号字符以抑制数据键入,但 看起来 像数字或日期:
// 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++;
}
在单元格中正确键入数据后,格式会产生预期的效果。