OpenXML linq запрос - PullRequest
       21

OpenXML linq запрос

3 голосов
/ 19 января 2012

Я использую OpenXML, чтобы открыть электронную таблицу и пройтись по строкам электронной таблицы.У меня есть запрос linq, который возвращает все ячейки в строке.Запрос linq был скопирован прямо с демоверсии MSDN.

IEnumerable<String> textValues =
    from cell in row.Descendants<Cell>()
    where cell.CellValue != null
    select (cell.DataType != null
            && cell.DataType.HasValue
            && cell.DataType == CellValues.SharedString
            ? sharedString.ChildElements[int.Parse(cell.CellValue.InnerText)].InnerText
            : cell.CellValue.InnerText);

Запрос linq отлично подходит для возврата всех ячеек, у которых есть значение, , но он не возвращает ячейки, у которых нет значения .Это, в свою очередь, делает невозможным определить, какая клетка есть какая.Позвольте мне объяснить немного больше.Скажем, например, у нас есть три столбца в нашей электронной таблице: имя, SSN и адрес.Этот запрос linq работает так, что он возвращает только те ячейки, которые имеют значение для данной строки.Таким образом, если в строке данных есть «Джон», «», «173 Сикамор», то запрос linq возвращает только «Джон» и «173 Сикамор» в перечислении, что, в свою очередь, не позволяет мне узнать,«173 Платан» - это поле SSN или адрес.

Позвольте мне повторить здесь: мне нужно, чтобы были возвращены все ячейки, а не только ячейки, содержащие значение .

Я пытался обезьяназапрос linq во всех отношениях, о которых я только мог подумать, но мне не повезло (т. е. удаление предложения where - не уловка).Любая помощь будет оценена.Спасибо!

Ответы [ 3 ]

4 голосов
/ 19 января 2012

Стандарт OpenXML не определяет заполнители для ячеек, которые не имеют данных.Другими словами, это базовое хранилище в XML редко.Вы можете обойти это одним из двух способов:

  1. Создать список всех «доступных» или «возможных» ячеек (возможно, с использованием типа операции CROSS JOIN )затем «левое» присоединение к коллекции row.Descendants<Cell>(), чтобы увидеть, имеет ли ссылка на ячейку значение
  2. Использовать сторонний инструмент, такой как ClosedXML или EPPlus Обертка вокруг данных Excel и запрос их интерфейсов, которые гораздо более удобны для разработчиков.
3 голосов
/ 19 января 2012

С ClosedXML:

var wb = new XLWorkbook("YourWorkbook.xlsx");
var ws = wb.Worksheet("YourWorksheetName");
var range = ws.RangeUsed();
foreach(var row in range.Rows())
{
   // Do something with the row...
   // ...

   foreach(var cell in row.Cells())
   {
      // Now do something with every cell in the row
      // ...
   }
}
0 голосов
/ 19 января 2012

Единственный способ, который я рекомендую, - заполнить все пустые ячейки пустыми данными, чтобы они были возвращены вашим оператором linq. См. ответ о том, как это сделать.

...