【问题标题】:Loading dates from a text file in EPPLUS从 EPPLUS 中的文本文件加载日期
【发布时间】: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/1512/31/15,并且在应用格式后保持不变。

我很确定这是因为我已将 text 值放入单元格中。 (虽然它看起来像一个日期,但它仍然只是一串字符。)但根据我的阅读,我需要在其中放入一个 double满足 Excel 将日期存储为双精度的期望的单元格。因为单元格包含字符串而不是双精度,所以不应用格式字符串,留下原始的、未格式化的文本。

我想添加一些代码

  1. 检查应用范围内每个单元格中的数据类型 日期格式。
  2. 如果不是双精度,请尝试将其转换为日期。
  3. 如果日期转换成功,则将 .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


【解决方案1】:

正如@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++;
}

在单元格中正确输入数据后,格式就会产生预期的效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2010-10-16
    相关资源
    最近更新 更多