【问题标题】:open xml sdk 2.0 read excel cell value with formula打开 xml sdk 2.0 使用公式读取 excel 单元格值
【发布时间】:2018-06-04 18:40:35
【问题描述】:

我正在使用 openXML sdk 读取 excel 文件。一些 excel 单元格包含公式,我想读取单元格的值,但是当我使用下面的代码时,它正在获取我的公式。如何获取价值。

WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id));
using(SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
{
  WorkbookPart wbPart = document.WorkbookPart;
  Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).FirstOrDefault();
  WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id));
  Cell theCell = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == "D16").FirstOrDefault();
  value = theCell.InnerText;
}

在这里,我正在阅读包含公式的特定单元格“D16”。

需要更多帮助,无法读取单元格的日期。我得到了一些数字。 对于日期单元格数据类型为 Null,因此下面的代码不起作用。 如何从单元格中获取日期值

  if (theCell != null)
                {
                    value = theCell.CellValue.InnerText;
                    if (theCell.DataType != null)
                    {
                        switch (theCell.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:
                                switch (value)
                                {
                                    case "0":
                                        value = "FALSE";
                                        break;
                                    default:
                                        value = "TRUE";
                                        break;
                                }
                                break;
                        }
                    }
                }

【问题讨论】:

    标签: c# openxml-sdk


    【解决方案1】:

    尝试CellValue 单元格的属性。

    WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id));
    using(SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
    {
      WorkbookPart wbPart = document.WorkbookPart;
      Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).FirstOrDefault();
      WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id));
      Cell theCell = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == "D16").FirstOrDefault();
      value = theCell.CellValue;
    }
    

    我假设您为调试目的对单元格引用进行了硬编码。否则我强烈建议不要这样做。

    【讨论】:

    • “无法获取日期”是什么意思?你没有得到你期望的格式?您使用的是哪个单元格属性?您可能想用您尝试过的代码示例将其作为一个不同的问题。
    • 您好,我已经用代码示例更新了问题。请检查。我得到了 4233 的价值
    【解决方案2】:

    试试这个:

    WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id));
    using(SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
    {
        WorkbookPart wbPart = document.WorkbookPart;
        Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).FirstOrDefault();
        WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id));
        Cell theCell = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == "D16").FirstOrDefault();
        var value = theCell.CellValue.InnerText;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多