从EPPLUS

时间:2015-10-14 15:25:26

标签: c# asp.net excel date 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/1512/31/15,并且在应用格式后仍然保持这种状态。

我很确定这是因为我已将 text 值添加到单元格中。 (虽然它看起来就像一个日期,它仍然只是一串字符。)但是从我的阅读中,我需要将 double 放入单元格符合Excel的期望,即日期存储为double。由于单元格包含字符串而不是double,因此不会应用格式字符串,而是保留原始的无格式文本。

我想添加一些代码

  1. 检查我应用范围内每个单元格中的数据类型 日期格式。
  2. 如果不是双倍,请尝试将其转换为日期。
  3. 如果日期转换成功,则将.NET日期转换为OADate并将其重新放回单元格。
  4. 我的问题是:这是最好的(或至少是合理的)方法,如果是,我该怎么做?

    此代码不起作用:

    foreach (OfficeOpenXml.ExcelRangeBase oneCell in range)
    {
        if (typeof(oneCell.Value) == "System.String")
        {
            // date manipulations here
        }
    }
    

    oneCell调用中的typeof(oneCell.Value)下方显示红线,并显示消息“无法找到类型或命名空间'oneCell'。(您是否缺少using指令或程序集引用?)

    请注意,我无法事先知道日期字段的位置,因为数据和单元格格式都是从外部源提供的。 (外部单元格格式确实指示何时应用的格式是日期格式,而不是常规数字格式或字符串。)

1 个答案:

答案 0 :(得分:1)

正如@mason建议的那样,我发布了我用来解决这个问题的代码。

(我没有得到我原来问题的答案,这是如何迭代范围内的单元格并检查每个单元格内容的数据类型,但是使用此解决方案,我不再需要这样做。)< / p>

相反,我修改了从制表符分隔的文本文件加载数据的循环,以使用一些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++;
}

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