#vb.net #openxml
Вопрос:
Я использую openxml в vb.net проект для анализа данных в файле Excel с большим количеством строк в объект DataTables. Каждая строка в файле excel анализируется и добавляется в качестве объекта DataRow в DataTable.
Если задание не удастся, я хочу пропустить все строки, которые уже были проанализированы. Однако мне все еще нужно проанализировать первую строку, потому что она используется для настройки имен столбцов в таблице данных.
Я ищу способ удалить строки со 2 по X в объекте openxml IEnumerable(Из строки).
'open the excel doc
Dim doc As SpreadsheetDocument = SpreadsheetDocument.Open(FilePath, False)
'Read the first Sheet from Excel file.
Dim sheet As Sheet = doc.WorkbookPart.Workbook.Sheets.GetFirstChild(Of Sheet)()
'Get the Worksheet instance.
Dim worksheet As Worksheet = TryCast(doc.WorkbookPart.GetPartById(sheet.Id.Value), WorksheetPart).Worksheet
'Fetch all the rows present in the Worksheet.
Dim rows As IEnumerable(Of Row) = worksheet.GetFirstChild(Of SheetData)().Descendants(Of Row)()
' set a starting row value
Dim startingRow as Integer = 125000
'Remove rows 2 through startingRow from the "rows" IEnumerable(Of Row) variable..
'** this is where I am stuck!!!!!!!!!!!!!!!!
К вашему сведению, C# добавлен в качестве тега, так как активных программистов VB больше не так много. Я с радостью конвертирую любые решения/советы на C# в VB.
Комментарии:
1. Невозможно удалить элементы из an
IEnumerable
, потому что, по определению, anIEnumerable
-это объект, который можно перечислить, и это все. Что касается интерфейсов, тоIList
именно они обеспечивают произвольный доступ и, следовательно, добавление, вставку и удаление. Все, что вы можете сделать, это перечислить объект и игнорировать элементы, которые вам не нужны. Вы можете создать новыйIEnumerable
с первого и включать только нужные вам элементы различными способами, в том числе сWhere
помощью или, если это имеет значение, сSkip
помощью и, если это индексыTake
.
Ответ №1:
Вместо того , чтобы «удалять» строки только для чтения IEnumerable
, более простым способом было бы просто перебирать нужные вам строки, а именно строку 1, затем строки X 1 до конца:
rows = rows.Take(1).Concat(rows.Skip(startingRow))
Комментарии:
1. Делает именно то, о чем я прошу. Спасибо!