Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从EPPLUS中的文本文件加载日期_C#_Asp.net_Excel_Date_Epplus - Fatal编程技术网

C# 从EPPLUS中的文本文件加载日期

C# 从EPPLUS中的文本文件加载日期,c#,asp.net,excel,date,epplus,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 cell

我正试图在我的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”:

range.Style.Numberformat.Format = "mm/dd/yyyy";
但是,这不会更改单元格中数据的显示。(在原始文本文件中,日期看起来像
5/1/15
12/31/15
,并在应用格式后保持不变

我很确定这是因为我在单元格中输入了一个text值(虽然看起来像日期,但它仍然只是一个字符串)但是根据我的阅读,我需要在单元格中放入一个双精度,以满足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++;
    }
    

    在单元格中适当地键入数据后,格式就达到了预期效果。

    我相信您可以直接将
    DateTime
    分配给单元格的值。因此,只需将输入解析为DateTime对象而不是double。我采用了另一种方法,添加了DateTime.TryParse()到最初将单元格数据加载到工作表中的循环。基本上,如果它看起来像一个日期,则将其视为一个日期。(对于数值,我对Double.TryParse()也做了同样的操作。)虽然不是100%,但它足以满足我当前的需要。此外,正如您所指出的,我不必将DateTime转换为OADate。您应该将生成的代码作为答案发布,以帮助未来有类似问题的人。