C# OpenXML仅读取4列
我在一个更大的OpenXMLExcel阅读器中有以下代码。此读取器获取分配给数据集的信息,然后显示在datagridview中:C# OpenXML仅读取4列,c#,datagridview,openxml,import-from-excel,C#,Datagridview,Openxml,Import From Excel,我在一个更大的OpenXMLExcel阅读器中有以下代码。此读取器获取分配给数据集的信息,然后显示在datagridview中: public static DataTable ExtractExcelSheetValuesToDataTable(string xlsxFilePath, string sheetName, int startingRow) { DataTable dt = new DataTable(); using (Spreads
public static DataTable ExtractExcelSheetValuesToDataTable(string xlsxFilePath, string sheetName, int startingRow) {
DataTable dt = new DataTable();
using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Open(xlsxFilePath, true)) {
//Access the main Workbook part, which contains data
WorkbookPart workbookPart = myWorkbook.WorkbookPart;
WorksheetPart worksheetPart = null;
if (!string.IsNullOrEmpty(sheetName)) {
Sheet ss = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName).SingleOrDefault<Sheet>();
worksheetPart = (WorksheetPart)workbookPart.GetPartById(ss.Id);
} else {
worksheetPart = workbookPart.WorksheetParts.FirstOrDefault();
}
SharedStringTablePart stringTablePart = workbookPart.SharedStringTablePart;
if (worksheetPart != null) {
Row lastRow = worksheetPart.Worksheet.Descendants<Row>().LastOrDefault();
#region ColumnCreation
//Returns the columns - come back to this later - may be able to modify this to have
//A checkbox "Column names in first row"
Row firstRow = worksheetPart.Worksheet.Descendants<Row>().FirstOrDefault();
int columnInt = 0;
//if (firstRow != null)
//{
foreach (Cell c in firstRow.ChildElements)
{
string value = GetValue(c, stringTablePart);
dt.Columns.Add(columnInt + ": " + value);
columnInt++;
}
//}
#endregion
#region Create Rows
//if (lastRow != null)
//{
//lastRow.RowIndex;
for (int i = startingRow; i <= 150000; i++)
{
DataRow dr = dt.NewRow();
bool empty = true;
Row row = worksheetPart.Worksheet.Descendants<Row>().Where(r => i == r.RowIndex).FirstOrDefault();
int j = 0;
if (row != null)
{
foreach (Cell c in row.ChildElements)
{
//Get cell value
string value = GetValue(c, stringTablePart);
if (!string.IsNullOrEmpty(value) && value != "")
empty = false;
dr[j] = value;
j++;
if (j == dt.Columns.Count)
break;
}
if (empty)
break;
dt.Rows.Add(dr);
}
}
}
#endregion
}
// }
return dt;
}
public static string GetValue(Cell cell, SharedStringTablePart stringTablePart) {
if (cell.ChildElements.Count == 0) return null;
//get cell value
string value = cell.ElementAt(0).InnerText;//CellValue.InnerText;
//Look up real value from shared string table
if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
value = stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
return value;
}
public void GetSheetInfo(string fileName)
{
Sheets theSheets = null;
// Open file as read-only.
using (SpreadsheetDocument mySpreadsheet = SpreadsheetDocument.Open(fileName, false))
{
S sheets = mySpreadsheet.WorkbookPart.Workbook.Sheets;
WorkbookPart wbPart = mySpreadsheet.WorkbookPart;
theSheets = wbPart.Workbook.Sheets;
foreach (Sheet item in theSheets)
{
cmbSheetSelect.Items.Add(item.Name);
}
}
}
公共静态数据表ExtractExcelSheetValuesToDataTable(字符串xlsxFilePath、字符串sheetName、int startingRow){
DataTable dt=新的DataTable();
使用(SpreadsheetDocument myWorkbook=SpreadsheetDocument.Open(xlsxFilePath,true)){
//访问包含数据的主工作簿部分
WorkbookPart WorkbookPart=My工作簿.WorkbookPart;
工作表部件工作表部件=空;
如果(!string.IsNullOrEmpty(sheetName)){
Sheet ss=workbookPart.Workbook.Subjections()。其中(s=>s.Name==sheetName.SingleOrDefault();
worksheetPart=(worksheetPart)workbookPart.GetPartById(ss.Id);
}否则{
worksheetPart=workbookPart.WorksheetParts.FirstOrDefault();
}
SharedStringTablePart stringTablePart=workbookPart.SharedStringTablePart;
如果(工作表部件!=null){
Row lastRow=工作表零件。工作表。子体()。LastOrDefault();
#区域列创建
//返回列-稍后返回此列-可以修改此列使其具有
//复选框“第一行中的列名”
Row firstRow=worksheetPart.Worksheet.subjects().FirstOrDefault();
int columnInt=0;
//如果(第一行!=null)
//{
foreach(第一行中的单元格c.ChildElements)
{
字符串值=GetValue(c,stringTablePart);
dt.Columns.Add(columnInt+“:”+值);
columnInt++;
}
//}
#端区
#区域创建行
//if(lastRow!=null)
//{
//lastRow.RowIndex;
for(int i=startingRow;i i==r.RowIndex).FirstOrDefault();
int j=0;
如果(行!=null)
{
foreach(行中的单元格c.ChildElements)
{
//获取单元格值
字符串值=GetValue(c,stringTablePart);
如果(!string.IsNullOrEmpty(value)&&value!=“”)
空=假;
dr[j]=数值;
j++;
if(j==dt.Columns.Count)
打破
}
if(空)
打破
dt.Rows.Add(dr);
}
}
}
#端区
}
// }
返回dt;
}
公共静态字符串GetValue(单元格单元格,SharedStringTablePart stringTablePart){
if(cell.ChildElements.Count==0)返回null;
//获取单元格值
字符串值=cell.ElementAt(0).InnerText;//CellValue.InnerText;
//从共享字符串表中查找实际值
if((cell.DataType!=null)&&(cell.DataType==CellValues.SharedString))
value=stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
返回值;
}
public void GetSheetInfo(字符串文件名)
{
sheethesheets=null;
//以只读方式打开文件。
使用(电子表格文档mySpreadsheet=SpreadsheetDocument.Open(文件名,false))
{
S sheets=mySpreadsheet.WorkbookPart.Workbook.sheets;
WorkbookPart wbPart=myPreadSheet.WorkbookPart;
theSheets=wbPart.Workbook.Sheets;
foreach(表格中的表格项目)
{
选择.Items.Add(item.Name);
}
}
}
这对基本的电子表格有效,但当我尝试阅读更高级的电子表格时,我会遇到一两个问题
首先,我的工作表有5列:
但是,当我运行我的程序时,它只返回前4列,而不是E列及其所有数据
我的第二个问题是,是否可以使用该代码(或其变体)将我希望程序读取的行指定为datagridview列标题?如果有人需要,我发现正在更改:
Row firstRow = worksheetPart.Worksheet.Descendants<Row>().FirstOrDefault();
Row firstRow=worksheetPart.Worksheet.subjects().FirstOrDefault();
到
Row firstRow=worksheetPart.Worksheet.substanders().ElementAtOrDefault(columnIndex)
成功了。columnIndex是一个变量,我可以根据所选的工作表进行更改 您的代码实际上只处理第一行。它只在第一个单元格中包含数据。你知道吗?2.你说的台词是什么意思?是Excel的行,还是每个单元格中的一行字?您好-很抱歉,我已将代码更新为完整的DataTable函数,以备清除。抱歉,我希望能够在excel中传递行号,比如说15,并使用该行作为datagridview中的标题(目前它只拉A1-A…如果有空白列,则停止)。您知道您要做什么吗?我运行了您的代码,将所有列加载到我指定的起始行的
DataTable
中效果很好。我可能会将其称为rowIndex
,而不是columnIndex。而且索引是从零开始的,因此Excel工作表中的第15行将是worksheetPart.Worksheet.subjects().ElementAtOrDefault(14)
Row firstRow = worksheetPart.Worksheet.Descendants<Row>().ElementAtOrDefault(columnIndex)