Пустые строки пропускаются при получении данных из Excel в DataTable - PullRequest
0 голосов
/ 31 января 2020

Задача

Импорт данных из Excel в DataTable

Проблема

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

Например,

В Excel Всего 37 строк, когда я использую open xml для преобразования Excel в Datatable, пропускает пустые строки и читает 29 только строки

WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
Worksheet workSheet = worksheetPart.Worksheet;
SheetData sheetData = workSheet.GetFirstChild<SheetData>();
IEnumerable<Row> rows = sheetData.Descendants<Row>();
foreach (Row row in rows) //this will also include your header row...
{
    DataRow tempRow = dt.NewRow();
    int ko = row.Descendants<Cell>().Count();
    for (int i = 0; i < row.Descendants<Cell>().Count(); i++)
    {
        tempRow[i] = GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i));
    }
    dt.Rows.Add(tempRow);
}

1 Ответ

2 голосов
/ 01 февраля 2020

Если вы посмотрите на разметку Open XML на листе Excel, вы увидите, что пустые строки даже не существуют в разметке. Это означает, что когда вы читаете ваши строки в вашем foreach l oop, вы пропустите эти пустые несуществующие строки прямо здесь.

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

Обновление 2020-02-03

Чтобы узнать, как вы можете определить номера строк, вы должны посмотреть на разметку Open XML образца рабочего листа. Например, следующая разметка показывает уменьшенный и упрощенный пример рабочего листа, содержащий только элемент sheetData и несколько дочерних элементов row. Вы увидите, что каждый элемент row (экземпляр класса Row) имеет атрибут с именем r (свойство RowIndex класса Row), который определяет индекс строки. В этом примере мы видим строки 2, 3, 5 и 8, поэтому мы видим, что строки 4, 6 и 7 отсутствуют.

<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
  <sheetData>
    <row r="2" spans="2:2" x14ac:dyDescent="0.25">
      <c r="B2">
        <v>2</v>
      </c>
    </row>
    <row r="3" spans="2:2" x14ac:dyDescent="0.25">
      <c r="B3">
        <v>3</v>
      </c>
    </row>
    <row r="5" spans="2:2" x14ac:dyDescent="0.25">
      <c r="B5">
        <v>5</v>
      </c>
    </row>
    <row r="8" spans="2:2" x14ac:dyDescent="0.25">
      <c r="B8">
        <v>8</v>
      </c>
    </row>
  </sheetData>
</worksheet>
...