C# OPEN XML: пустые ячейки пропускаются при получении данных из EXCEL в DATATABLEC#

Место общения программистов C#
Ответить
Anonymous
 C# OPEN XML: пустые ячейки пропускаются при получении данных из EXCEL в DATATABLE

Сообщение Anonymous »

Задача

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

Проблема

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

A1 пуст, A2 имеет значение Том затем при импорте данных A1 получит значение A2, а A2 останется пустым

Чтобы было понятнее, я привожу несколько снимков экрана ниже.

Это данные Excel

Изображение


Это таблица данных после импорта данных из Excel
Изображение

Код

Код: Выделить всё

public class ImportExcelOpenXml
{
public static DataTable Fill_dataTable(string fileName)
{
DataTable dt = new DataTable();

using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(fileName, false))
{

WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
IEnumerable sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild().Elements();
string relationshipId = sheets.First().Id.Value;
WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
Worksheet workSheet = worksheetPart.Worksheet;
SheetData sheetData = workSheet.GetFirstChild();
IEnumerable rows = sheetData.Descendants();

foreach (Cell cell in rows.ElementAt(0))
{
dt.Columns.Add(GetCellValue(spreadSheetDocument, cell));
}

foreach (Row row in rows) //this will also include your header row...
{
DataRow tempRow = dt.NewRow();

for (int i = 0; i < row.Descendants().Count(); i++)
{
tempRow[i] = GetCellValue(spreadSheetDocument, row.Descendants().ElementAt(i));
}

dt.Rows.Add(tempRow);
}

}

dt.Rows.RemoveAt(0); //...so i'm taking it out here.

return dt;
}

public static string GetCellValue(SpreadsheetDocument document, Cell cell)
{
SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart;
string value = cell.CellValue.InnerXml;

if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
{
return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
}
else
{
return value;
}
}
}
Мои мысли

Я думаю, что с

Код: Выделить всё

public IEnumerable Descendants() where T : OpenXmlElement;
В случае, если мне нужно количество столбцов с использованием потомков

Код: Выделить всё

IEnumerable rows = sheetData.Descendants

Подробнее здесь: [url]https://stackoverflow.com/questions/36100011/c-sharp-open-xml-empty-cells-are-getting-skipped-while-getting-data-from-excel[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»