使用OpenXML解析excel时获取不正确的单元格值

时间:2017-09-18 03:07:36

标签: c# openxml

我正在尝试解析excel并使用C#和openxml在datatable中获取结果。 以下是我的代码段。

   value = cell.CellValue.InnerText;
if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
        {
            return doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements.GetItem(int.Parse(value)).InnerText;
        }
        return value;

但如果单元格值 80.3600 ,则会将其解析为 80.36 。 此外,如果该值 03-Jan-2018 ,则会将其解析为 43103 。 问题是,我试图解析的excel是动态生成的,在运行时我不知道哪个列是日期,哪个列是数字。 有没有办法获取值,或者将每个值作为字符串,即没有格式化?

1 个答案:

答案 0 :(得分:0)

我注意到,数字和日期时间单元格的值具有不同的styleIndex值。 您可以通过doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats中的styleIndex获取单元格格式。

        var doc = SpreadsheetDocument.Open(File.Open("D:\\123.xlsx", FileMode.Open), false);
        var sheet = doc.WorkbookPart.Workbook.Descendants<Sheet>().FirstOrDefault();
        WorksheetPart wsPart = (WorksheetPart)(doc.WorkbookPart.GetPartById(sheet.Id));
        var cells = wsPart.Worksheet.Descendants<Cell>().ToList();


        var numberingFormats = doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.ToList();

        var stringTable = doc.WorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
        foreach (var cell in cells)
        {
            if (cell.DataType == null)
            {
                //DateTime 
                if (cell.StyleIndex != null)
                {
                    var numerFormat = numberingFormats.ElementAt((int) cell.StyleIndex.Value - 1) as NumberingFormat;
                    if (numerFormat.FormatCode.Value == "[$-409]mmmm\\ d\\,\\ yyyy;@")
                    {
                        Console.WriteLine(DateTime.FromOADate(double.Parse(cell.InnerText)).ToString("MMMM dd,yyyy"));
                    }
                    else if (numerFormat.FormatCode.Value == "[$-409]dd\\-mmm\\-yy;@")
                    {
                        Console.WriteLine(DateTime.FromOADate(double.Parse(cell.InnerText)).ToString("dd-MMM-yy"));
                    }
                }
                else
                {
                    //Numeric
                    Console.WriteLine(int.Parse(cell.InnerText));
                }

            }
            else if (cell.DataType.Value == CellValues.SharedString)
            {
                Console.WriteLine(stringTable.SharedStringTable.ElementAt(int.Parse(cell.InnerText)).InnerText);
            }
        }

也可以阅读这个:Excel Interop cell formatting of Dates