2012-01-18 2 views
3

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

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-запрос, он возвращает только те ячейки, которые имеют значение для данной строки. Поэтому, если есть строка данных, которая имеет «John», «», «173 Sycamore», тогда запрос linq возвращает только «John» и «173 Sycamore» в перечислении, что, в свою очередь, делает невозможным узнать, «173 Sycamore» - это SSN или поле «Адрес».

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

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

ответ

4

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

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

Я использовал ClosedXML для экспорта таблиц Excel, но я не думал, что он вообще импортировал. Имеет ли это? Сегодня я даже выглядел очень эффектно сегодня на своем веб-сайте и не видел, чтобы это было (хотя это был очень быстрый взгляд). Однако я посмотрю на EPPlus. На самом деле, каждый раз, когда я пытаюсь что-то делать с OpenXML, я поражен тем, что, казалось бы, должно быть простым, заканчивается чем-то другим! – Jagd

+0

Если при импорте вы имеете в виду способность читать и писать данные, тогда OpenXML и EPPlus могут это сделать. Я согласен с тем, что попытка сделать что-либо прямо с OpenXML - это боль в королевстве, но с такими инструментами, как те, что указаны выше, и Document Explorer как часть SDK, его soooooo намного лучше, чем предыдущий COM Interop, с которым нам приходилось иметь дело! – jklemmack

+1

ClosedXML работал отлично. Хотелось бы, чтобы я использовал его только с первого, а не с помощью OpenXML. Еще раз спасибо! – Jagd

3

С 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

Удивительный! Я проверю это! – Jagd

+0

Ах, столько усилий сгустили до такого маленького кода. благодаря –

0

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