OpenXml 无法读取带百分比符号的整数

问题描述 投票:0回答:1

具有 Open XML 的 Net core。在我的 Excel 中,值是 100%。我正在尝试阅读如下

获取单元格值方法

public static string GetCellValue(SpreadsheetDocument doc, Cell cell)
{
    if (cell.CellValue != null)
    {
        string value = cell.CellValue.InnerText;
        if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
        {
            return doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements.ElementAt(int.Parse(value)).InnerText;
        }
        else
        {
            return value;
        }
    }
    return string.Empty;
}

获取单元格方法

 public static Cell GetCell(Worksheet worksheet, string columnName, uint rowIndex)
 {
     Row row = worksheet.GetFirstChild<SheetData>().Elements<Row>().FirstOrDefault(r => r.RowIndex == rowIndex);

     if (row != null)
     {
         return row.Elements<Cell>().FirstOrDefault(c => string.Compare(c.CellReference.Value, columnName + rowIndex, true) == 0);
     }
     return null;
 }

我正在阅读如下。

 var data = OpenXmlReader.GetCellValue(spreadsheetDocument, OpenXmlReader.GetCell(workSheet, "E", 11));

数据为 1,而我的 Excel 中的实际值为 100%。我不知道为什么这不能正确阅读。有人可以帮帮我吗?任何帮助,将不胜感激。谢谢

c# .net asp.net-core openxml
1个回答
0
投票

在Excel中,单元格的显示格式和实际存储的数据格式可能不同。当您在百分比格式的单元格中输入 75% 时,Excel 将其存储为小数,但在显示时,它仍然显示为百分比。

我们可以从Open XML中读取这样配置的格式,可以看到读取到的

NumberFormatId
是43,
FormatCode
"_ * #,##0.00_ ;_ * \\-#,##0.00_ ;_ * \"-\"??_ ;_ @_ "

但是,在 NumberFormatId list 中预定义的格式中并没有找到这种格式。所以我们可以使用 OpenXml 为返回值设置相应的格式。这里有一个例子供大家参考:

public static string GetCellValue(SpreadsheetDocument doc, Cell cell)
{
     if (cell.CellValue != null)
     {
         string value = cell.CellValue.InnerText;
         if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
         {
             return doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements.ElementAt(int.Parse(value)).InnerText;
         }
         else if (cell.StyleIndex != null)
         {
             var styleIndex = (int)cell.StyleIndex.Value;
             var cellFormat = (NumberingFormat)doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.ElementAt(styleIndex);
             var numberFormat = doc.WorkbookPart.WorkbookStylesPart.Stylesheet.NumberingFormats.Elements<NumberingFormat>()
                 .Where(i => i.NumberFormatId.ToString() == cellFormat.NumberFormatId.ToString()).FirstOrDefault().FormatCode;
             if (numberFormat != null )
             {
                 var cellValue = double.Parse(value);
                 value = (cellValue * 100).ToString("0.00") + "%";
             }
         }
         return value;
     }
     return string.Empty;
}

返回数据:

© www.soinside.com 2019 - 2024. All rights reserved.