2013-05-01 99 views
0

我有一个Excel工作簿,我尝试使用DocumentFormat.OpenXml.Spreadsheet; 使用DocumentFormat.OpenXml.Packaging;读XLSX文件在C#

阅读,但我如何知道什么时候该值是一个日期不确定。共享字符串和数字都很好,但与单元格关联的类型(Cell.DataType)始终是共享字符串。

我已经看过替代产品,但他们似乎都涵盖字符串和数字,但不包括日期。

任何想法。?

回答

2

Open XML将日期存储为1900年1月1日以来的天数。您需要做的是从单元中获取字符串,然后将该字符串解析为DateTime对象。

下面的片段说明了这一点。请注意使用DateTime.FromOADate过载

public static string GetCellValue(WorkbookPart wbPart, Cell cell) 
{ 
    string value = string.Empty; 
    if (cell != null && cell.CellValue != null) 
    { 
     value = cell.InnerText; 
     if (cell.DataType != null) 
     { 
      switch (cell.DataType.Value) 
      { 
       case CellValues.SharedString: 
        var stringTable = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault(); 
        if (stringTable != null) 
        { 
         value = stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText; 
        } 
        break; 

       case CellValues.Boolean: 
        if (value == "0") 
         value = "FALSE"; 
        else 
         value = "TRUE"; 

        break; 
      } 
     } 
    } 
    return value; 
} 


string value = GetCellValue(wbPart,cell); 
var date = DateTime.FromOADate(double.Parse(value)); 
+0

感谢您的回应,这是朝着正确方向迈出的一步。问题是我不知道细胞值是否是日期。我希望这是在xlsx的xml文件中指定的。 – mattpm 2013-05-01 10:12:05

0

我相信我有各种答案。在Styles文件中,有一个dxfs节点,其中包含一个或多个提供格式的dxf节点。我还没有弄清楚如何从工作表中的单元格到dxf节点。但是,一旦确定了这种关系,那么应该可以使用单元格的格式。

话虽如此,看起来至多,你不太可能知道一个单元格是否是一个日期,但在代码中的一些测试,你可能会给它一个合理的最佳猜测。

我选择在映射文档中捕获模式信息,所以我确实知道。