Ядро 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; } } 
  • Вставка новых строк и перемещение существующих с помощью OpenXML SDK 2.0
  • Чтение даты из файла Excel с использованием OpenXML
  • создать отчет из шаблона с использованием C # excel OpenXML API
  • Программно (C #) конвертировать Excel в список изображений
  • Open XML SDK - динамически создавать строки
  • Создание пользовательских ширины столбцов в OpenXML (excel)
  • Как применить шрифт и цвет текста в ячейках файла Excel с помощью openxml
  • Как получить доступ к флажку FormControl в листе Excel с помощью OpenXML SDK
  • Как я могу получить таблицы «uncollapse» электронной таблицы Open XML в электронной таблице?
  • Проверка / формула таблицы Excel не копируется в новую строку таблицы
  • Цикл Foreach с использованием Regex для поиска шаблона XML
  • Interesting Posts

    Генерация чисел из вероятностей в файле csv в python

    Странная ошибка при попытке изменить имя листа в c #

    Я хочу подсчитать количество записей, сделанных в определенном столбце, в нескольких листах Excel в настоящее время. Что может быть возможным решением?

    ShowSeriesName с меткой Y value

    чтение данных из xls, создание файла xls, поврежденного в селене

    Проверьте, существуют ли два разных значения ячейки в одной строке и возвращают другой элемент из этой строки

    Получение списка проверки данных для заполнения таблицы

    Найти частичный текст в диапазоне, вернуть значение ячейки

    Ошибка времени выполнения 8000fff в VBA CreateObject

    Программное усечение больших имен файлов (zipped) для разных выпусков Windows

    есть ли способ синхронизировать строку с листа excel с другим без использования кода VB?

    Перечислить надстройки и отключить их

    Формула Excel: рассчитать статистику опроса

    Поиск нескольких столбцов и возврата заголовка

    Почему все элементы в моем массиве одинаковы?

    Давайте будем гением компьютера.