使用opemxml SDK获取单元格格式以检查excel中的日期列值

时间:2015-08-14 13:37:22

标签: c# excel excel-vba openxml openxml-sdk vba

value = string.Empty;
if (cell.StyleIndex != null)
{
    CellFormat cf = document.WorkbookPart.WorkbookStylesPart.Stylesheet.CellFormats.ChildElements[int.Parse(cell.StyleIndex.InnerText)] as CellFormat;
    if (cf.NumberFormatId == 14)
    {
        //value = DateTime.Parse("1900-01-01").AddDays(int.Parse(cell.CellValue.Text) - 2).ToString("yyyy-MM-dd");
        value = Convert.ToString(DateTime.FromOADate(Double.Parse(cell.CellValue.Text)).ToShortDateString());
    }
    if (cf.NumberFormatId == 176 || cf.NumberFormatId == 177)
    {
        //value = DateTime.Parse("1900-01-01").AddDays(int.Parse(cell.CellValue.Text) - 2).ToString("yyyy-MM-dd");
        value = Convert.ToString(DateTime.FromOADate(Double.Parse(cell.CellValue.Text)));
    }
}

我使用上面的代码检查excel中是否有任何日期列,然后将单元格的值转换为等效日期。默认情况下NumberFormatID为14,但excel中有更多日期格式对于特定日期格式,有时NumberFormatID为165,有时显示为176。 这些都没有修复。所以当我选择日期时间格式有时它是176,有时它是不同的,所以我的代码不工作。我如何区分特定的日期和日期时间格式?

1 个答案:

答案 0 :(得分:0)

就像你说的那样,有很多" dateformat",人们可以自定义这个领域(我不知道你的情况如何)。

如果您唯一的问题是"解析日期",只需使用DateTime.TryParse

value = string.Empty;
if (cell.StyleIndex != null)
{
    DateTime res;
    if (DateTime.TryParse(cell.CellValue.Text, out res))
    {
        value = res.ToString("yyyy-MM-dd");
    }
}

如果单元格采用"日期格式",TryParse将成功