【发布时间】:2019-07-16 18:46:19
【问题描述】:
我有一个需要能够导入的 Excel 电子表格。该电子表格在一张表中有许多命名表,这些表具有一些不同的模式以及整个表中的一些其他随机数据。我需要能够读取每个单独的表中的数据。
我已经弄清楚如何获取可用表的列表以及如何读取它们的列标题,但我不确定如何访问数据。
以下是我用于读取标题的代码示例。我真的不需要这些信息(因为我会将这些信息放入模型中并且已经知道列的顺序),它确实显示了我正在使用的内容。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using System.Data;
...
public static DataTable GetNamedDataTable(SpreadsheetDocument spreadsheetDocument, string cellRange, string DataTableName)
{
var dataTable = new DataTable();
Workbook woorkbook = spreadsheetDocument.WorkbookPart.Workbook;
//Sheet
var bustedCellRange = BustCellRange(cellRange);
Sheet sheet = woorkbook.Descendants<Sheet>().Where(s => s.Name == bustedCellRange["sheetName"]).FirstOrDefault();
SharedStringTable sharedStringTable = woorkbook.WorkbookPart.SharedStringTablePart.SharedStringTable;
List<SharedStringItem> allSharedStringItems= sharedStringTable.Descendants<SharedStringItem>().ToList();
WorksheetPart worksheetPart = (WorksheetPart)spreadsheetDocument.WorkbookPart.GetPartById(sheet.Id);
TableDefinitionPart tableDefinitionPart = worksheetPart.TableDefinitionParts.FirstOrDefault(r => r.Table.Name == DataTableName);
QueryTablePart queryTablePart = tableDefinitionPart.QueryTableParts.FirstOrDefault();
Table excelTable = tableDefinitionPart.Table;
int columnCounter = 0;
foreach(TableColumn column in excelTable.TableColumns)
{
DataColumn dataColumn = dataTable.Columns.Add(column.Name);
dataColumn.SetOrdinal(columnCounter);
columnCounter++;
}
return dataTable;
}
【问题讨论】:
-
This thread 有点老了,但我认为这里的内容仍然与您相关。
-
@JacobH 的问题在于它正在读取整个工作表,我所拥有的是一张包含许多表格和一些随机数据的工作表。我将更新问题,使其更加明确。
-
数据是否与表头在工作表的同一区域/表中?比如,数据是否已经在
excelTable中?如果是这样,只需遍历rows并将它们作为新数据行添加到dataTable。 -
@JacobH,除非我遗漏了 DocumentFormat.OpenXml.Spreadsheet.Table 对象没有行集合的内容。你知道我如何访问它,因为这将是一个完美的解决方案。
-
你可以通过将表传递给它的构造函数来使用 sheetdata 类吗? (其实我也不知道,我只用过Excel XML方法)。
标签: c# openxml openxml-sdk