Ядро Openxml возвращает InnerText не фактическое значение

Я разрабатываю код многократного использования для чтения значения ячейки excel. Мой код выглядит следующим образом:

private string ReadCellValue(WorksheetPart worksheetPart, string cellAddress) { string value = null; Cell theCell = worksheetPart.Worksheet.Descendants<Cell>(). Where(c => c.CellReference == cellAddress).FirstOrDefault(); // If the cell does not exist, return an empty string. if (theCell != null) { value = theCell.InnerText; if (theCell.DataType != null) { switch (theCell.DataType.Value) { case CellValues.SharedString: var stringTable = worksheetPart.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; } } } return value; } 

Я вызываю этот метод из следующего кода:

 public string IsPackingListValid() { // Open the spreadsheet document for read-only access. using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false)) { // Retrieve a reference to the workbook part. WorkbookPart wbPart = document.WorkbookPart; // Find the sheet with the supplied name, and then use that // Sheet object to retrieve a reference to the first worksheet. Sheet theSheet = wbPart.Workbook.Descendants<Sheet>(). Where(s => s.Name == sheetName).FirstOrDefault(); // Throw an exception if there is no sheet. if (theSheet == null) { throw new ArgumentException("Could not find work sheet: " + sheetName); } // Retrieve a reference to the worksheet part. WorksheetPart worksheetPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id)); return ReadCellValue(WorksheetPart worksheetPart, "B2") } } 

Метод не возвращает фактическое значение для некоторых ячеек. Для некоторых ячеек он возвращает значение, а для некоторых ячеек он возвращает внутренний текст. Я отлаживал и проверял

 var stringTable = worksheetPart.GetPartsOfType<SharedStringTablePart>() .FirstOrDefault(); 

приведенный выше код возвращает null.

Я не могу найти, почему он работает на некоторые ячейки и не работает для некоторых. Любой помогает решить эту проблему.

Из моего понимания (по крайней мере, это верно для документа, который я проверил), SharedStringTablePart является потомком WorkbookPart, а не WorksheetPart. Так что вы можете исправить свой код, чтобы получить список общих строк из wbPart в методе IsPackingListValid ():

 List<SharedStringItem> sharedStrings = wbPart.SharedStringTablePart.SharedStringTable.ChildElements.OfType<SharedStringItem>().ToList(); 

Затем передайте его в метод ReadCellValue в качестве дополнительного аргумента:

 return ReadCellValue(worksheetPart, "B2", sharedStrings); 

После этого вы можете получить фактическое значение вашей общей строки внутри вашего коммутатора в методе ReadCellValue ():

 value = cell.InnerText; int sharedStringIndex; if (int.TryParse(cell.InnerText, out sharedStringIndex) && sharedStrings.Count > sharedStringIndex && sharedStrings[sharedStringIndex].Text != null) { value = sharedStrings[sharedStringIndex].Text.Text; } 

Также необходима дополнительная проверка типа данных SharedString (подробнее см. http://msdn.microsoft.com/en-us/library/office/ff921204(v=office.14).aspx для получения дополнительной информации):

  private static string ReadCellValue(WorksheetPart worksheetPart, string cellAddress, List<SharedStringItem> sharedStrings) { try { string value = null; var cell = worksheetPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == cellAddress).FirstOrDefault(); value = cell.InnerText; if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString) { int sharedStringIndex; if (int.TryParse(cell.InnerText, out sharedStringIndex) && sharedStrings.Count > sharedStringIndex && sharedStrings[sharedStringIndex].Text != null) { value = sharedStrings[sharedStringIndex].Text.Text; } } return value; } catch (Exception ex) { throw ex; } } 
  • Отсутствует схема при вставке изображения в файл .xlsx через OpenXML
  • чтение Excel Open XML игнорирует пустые ячейки
  • Поля страницы Open XML SDK
  • c #: Как сделать типизированный набор данных или какую-либо другую структуру во время выполнения?
  • открыть xml sdk прочитать ячейку формулы excel
  • Open XML SDK v2.0 Проблема с производительностью при удалении первой строки в 20 000 + строк файла Excel
  • Excel нашел нечитаемый контент в * .xslx
  • C # Open XML SDK записывает данные по определенной ссылке на ячейку
  • OpenXML для создания DataTable из Excel - значение денежной ячейки неверно
  • Чтение данных из ячеек Excel с использованием OpenXML SDK 2.0
  • Какие фреймворки построены на Open XML SDK?
  • Interesting Posts
    Давайте будем гением компьютера.