OpenXmlReader错误地获取了Excel单元格中的某些值

时间:2018-08-10 11:18:31

标签: c# excel cell openxml

我在C#程序中使用OpenXmlReader来读取Excel文件。出于我的目的(值的比较),我需要准确的单元格值,而无需进行任何修改。

但是,OpenXmlReader用一种恼人的方式解释了某些Excel单元格值类型(具体地,百分比,日期和时间),我似乎对此无能为力。

想象一下这是一个Excel行(我希望读取它):

BNK | BNK_DC | GROUP | GROUP | 8 | 0,12% | 0,14% | 0,15% | 0,17% | 0,18% 

这是该行在我的调试控制台上的显示方式:

BNK | BNK_DC | GROUP | GROUP | 8 | 1.1561E-3 | 1.3554245994127801E-3 | 1.5389154190192354E-3 | 1.7010741265663695E-3 |1.8389123386463213E-3

基本上,可以正确读取字符串,也可以读取简单的整数。但是,这些百分比已变成我无法掌握或无法使用的东西。

当我尝试读取日期或时间时,也会发生类似的情况。

excel文件行:

04.04.2018 | Adam Smith | 09:30 | 17:30 | 8,0 | Apr | Q2

OpenXmlReader返回的内容:

43194 | Adam Smith | 0.39583333333333331 | 0.72916666666666663 | 8 | Apr | Q2 

如您所见,日期和时间已转换为我不理解的内容。

我想这可能与Excel在内部存储百分比,时间和日期有关。如果是这样,我如何将这些值转换回可读格式?

这是我用来通过OpenXmlReader类读取Excel文件并将其显示在我的调试控制台上的确切代码:

    using DocumentFormat.OpenXml;
    using DocumentFormat.OpenXml.Packaging;
    using DocumentFormat.OpenXml.Spreadsheet; 
    using System.Diagnostics; 

    public void ExcelReader(SpreadsheetDocument document)
    {
        var wbp = document.WorkbookPart;
        var wsp = wbp.WorksheetParts.First();

        OpenXmlReader reader = OpenXmlReader.Create(wsp);
        string text;
        while (reader.Read())
        {
            if (reader.ElementType == typeof(Row))
            {
                reader.ReadFirstChild();

                do
                {
                    if (reader.ElementType == typeof(Cell))
                    {
                        Cell c = (Cell)reader.LoadCurrentElement();
                        string cellValue;
                        if (c.DataType != null && c.DataType == CellValues.SharedString)
                        {
                            SharedStringItem ssi = wbp.SharedStringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(int.Parse(c.CellValue.InnerText));
                            cellValue = ssi.Text.Text;
                        }
                        else
                        {
                            cellValue = c.CellValue?.InnerText;
                        }

                        Debug.Write($"{cellValue} | ");
                    }
                } while (reader.ReadNextSibling());
                Debug.Write("\n");
            }
        }

        document.Close();
    }

我将这段代码主要从第一个答案带到以下线程: Using OpenXmlReader

那么,如何从Excel获取我的实际百分比,日期,时间,而不是这些奇怪的值? 预先谢谢你。

1 个答案:

答案 0 :(得分:0)

日期

日期存储在01.01.1900之后的天数中

时间

时间存储在24h *数字中,因此24h * 0.395833 = 9,5 => 09:30

百分比

如果您使用Convert.ToSingle(number) 1.1561E-3将变成0.0011561,即0.115%