Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 在C中读取XLSX文件#_C#_.net_Openxml Sdk - Fatal编程技术网

C# 在C中读取XLSX文件#

C# 在C中读取XLSX文件#,c#,.net,openxml-sdk,C#,.net,Openxml Sdk,我用DocumentFormat.OpenXml.Spreadsheet阅读Excel工作簿 使用DocumentFormat.OpenXml.Packaging 但我不确定如何知道该值何时为日期。共享字符串和数字可以,但与单元格关联的类型(cell.DataType)始终是共享字符串 我看过其他的产品,但它们似乎都包括字符串和数字,但不包括日期 有什么想法吗?Open XML将日期存储为1900年1月1日起的天数。您需要做的是从单元格中获取字符串,然后将该字符串解析为DateTime对象 下面

我用
DocumentFormat.OpenXml.Spreadsheet阅读Excel工作簿
使用
DocumentFormat.OpenXml.Packaging

但我不确定如何知道该值何时为日期。共享字符串和数字可以,但与单元格关联的类型(
cell.DataType
)始终是共享字符串

我看过其他的产品,但它们似乎都包括字符串和数字,但不包括日期


有什么想法吗?

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));
公共静态字符串GetCellValue(WorkbookPart wbPart,单元格单元格)
{
字符串值=string.Empty;
if(cell!=null&&cell.CellValue!=null)
{
值=cell.InnerText;
if(cell.DataType!=null)
{
开关(cell.DataType.Value)
{
案例CellValues.SharedString:
var stringTable=wbPart.GetPartSoftType().FirstOrDefault();
if(stringTable!=null)
{
value=stringTable.SharedStringTable.ElementAt(int.Parse(value)).InnerText;
}
打破
大小写单元格值。布尔值:
如果(值=“0”)
value=“FALSE”;
其他的
value=“TRUE”;
打破
}
}
}
返回值;
}
字符串值=GetCellValue(wbPart,单元格);
var date=DateTime.FromOADate(double.Parse(value));

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

话虽如此,似乎充其量,您不太可能确定某个单元格是否是日期,但通过代码中的一些测试,您可能会给出合理的最佳猜测


我选择在映射文档中捕获模式信息,因此我可以肯定。

感谢您的回复,这是朝着正确方向迈出的一步。问题是我无法提前知道单元格值是否为日期。我希望这是在xlsx的xml文件中指定的。