C#OPEN XML:从EXCEL向DATATABLE获取数据时跳过空单元格
任务 将数据从C#OPEN XML:从EXCEL向DATATABLE获取数据时跳过空单元格,c#,datatable,openxml,openxml-sdk,spreadsheetml,C#,Datatable,Openxml,Openxml Sdk,Spreadsheetml,任务 将数据从excel导入到DataTable 问题 将跳过不包含任何数据的单元格,并将行中包含数据的下一个单元格用作空列的值。 例如 A1为空A2具有值Tom,然后在导入数据时A1获取A2的值,并且A2保持为空 为了清楚起见,我在下面提供了一些屏幕截图 这是excel数据 这是从excel导入数据后的数据表 代码 public class ImportExcelOpenXml { public static DataTable Fill_dataTable(string file
excel
导入到DataTable
问题
将跳过不包含任何数据的单元格,并将行中包含数据的下一个单元格用作空列的值。
例如
A1为空A2具有值Tom
,然后在导入数据时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<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
string relationshipId = sheets.First().Id.Value;
WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
Worksheet workSheet = worksheetPart.Worksheet;
SheetData sheetData = workSheet.GetFirstChild<SheetData>();
IEnumerable<Row> rows = sheetData.Descendants<Row>();
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<Cell>().Count(); i++)
{
tempRow[i] = GetCellValue(spreadSheetDocument, row.Descendants<Cell>().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;
}
}
}
或
如果使用子体获取行数
IEnumerable<Row> rows = sheetData.Descendants<<Row>();
int colCnt = rows.ElementAt(0).Count();
IEnumerable<Row> rows = sheetData.Descendants<<Row>();
int rowCnt = rows.Count();`
IEnumerable rows=sheetData.subjectionspublic void Read2007Xlsx()
{
尝试
{
DataTable dt=新的DataTable();
使用(SpreadsheetDocument SpreadsheetDocument=SpreadsheetDocument.Open(@“D:\File.xlsx”,false))
{
WorkbookPart WorkbookPart=电子表格文档.WorkbookPart;
IEnumerable sheets=spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild().Elements();
string relationshipId=sheets.First().Id.Value;
工作表部件工作表部件=(工作表部件)电子表格文档.WorkbookPart.GetPartById(relationshipId);
工作表=工作表零件工作表;
SheetData SheetData=工作表.GetFirstChild();
IEnumerable rows=sheetData.subjects();
foreach(行中的单元格。ElementAt(0))
{
添加(GetCellValue(电子表格文档,单元格));
}
foreach(Row-in-rows)//这还将包括标题行。。。
{
DataRow tempRow=dt.NewRow();
int columnIndex=0;
foreach(行中的单元格。子体())
{
//获取包含数据的单元格的列索引
int-cellColumnIndex=(int)GetColumnIndexFromName(GetColumnName(cell.CellReference));
cellColumnIndex--;//从零开始的索引
if(columnIndex=0;i--)
{
编号+=(名称[i]-“A”+1)*功率;
功率*=26;
}
返回号码;
}
公共静态字符串GetCellValue(电子表格文档、单元格)
{
SharedStringTablePart stringTablePart=document.WorkbookPart.SharedStringTablePart;
if(cell.CellValue==null)
{
返回“”;
}
字符串值=cell.CellValue.InnerXml;
if(cell.DataType!=null&&cell.DataType.Value==CellValues.SharedString)
{
返回stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
}
其他的
{
返回值;
}
}
试试这段代码,我做了一些修改,它对我很有用
公共静态数据表填充\u数据表(字符串文件路径)
{
DataTable dt=新的DataTable();
使用(SpreadsheetDocument文档=SpreadsheetDocument.Open(文件路径,false))
{
工作表=doc.WorkbookPart.Workbook.Sheets.GetFirstChild();
工作表工作表=doc.WorkbookPart.GetPartById(sheet.Id.Value)作为工作表部件工作表;
IEnumerable rows=工作表.GetFirstChild().subjects();
DataTable dt=新的DataTable();
List columnRef=新列表();
foreach(行中的行)
{
if(row.RowIndex!=null)
public void Read2007Xlsx()
{
try
{
DataTable dt = new DataTable();
using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(@"D:\File.xlsx", false))
{
WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
string relationshipId = sheets.First().Id.Value;
WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
Worksheet workSheet = worksheetPart.Worksheet;
SheetData sheetData = workSheet.GetFirstChild<SheetData>();
IEnumerable<Row> rows = sheetData.Descendants<Row>();
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();
int columnIndex = 0;
foreach (Cell cell in row.Descendants<Cell>())
{
// Gets the column index of the cell with data
int cellColumnIndex = (int)GetColumnIndexFromName(GetColumnName(cell.CellReference));
cellColumnIndex--; //zero based index
if (columnIndex < cellColumnIndex)
{
do
{
tempRow[columnIndex] = ""; //Insert blank data here;
columnIndex++;
}
while (columnIndex < cellColumnIndex);
}
tempRow[columnIndex] = GetCellValue(spreadSheetDocument, cell);
columnIndex++;
}
dt.Rows.Add(tempRow);
}
}
dt.Rows.RemoveAt(0); //...so i'm taking it out here.
}
catch (Exception ex)
{
}
}
/// <summary>
/// Given a cell name, parses the specified cell to get the column name.
/// </summary>
/// <param name="cellReference">Address of the cell (ie. B2)</param>
/// <returns>Column Name (ie. B)</returns>
public static string GetColumnName(string cellReference)
{
// Create a regular expression to match the column name portion of the cell name.
Regex regex = new Regex("[A-Za-z]+");
Match match = regex.Match(cellReference);
return match.Value;
}
/// <summary>
/// Given just the column name (no row index), it will return the zero based column index.
/// Note: This method will only handle columns with a length of up to two (ie. A to Z and AA to ZZ).
/// A length of three can be implemented when needed.
/// </summary>
/// <param name="columnName">Column Name (ie. A or AB)</param>
/// <returns>Zero based index if the conversion was successful; otherwise null</returns>
public static int? GetColumnIndexFromName(string columnName)
{
//return columnIndex;
string name = columnName;
int number = 0;
int pow = 1;
for (int i = name.Length - 1; i >= 0; i--)
{
number += (name[i] - 'A' + 1) * pow;
pow *= 26;
}
return number;
}
public static string GetCellValue(SpreadsheetDocument document, Cell cell)
{
SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart;
if (cell.CellValue ==null)
{
return "";
}
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 static DataTable Fill_dataTable(string filePath)
{
DataTable dt = new DataTable();
using (SpreadsheetDocument doc = SpreadsheetDocument.Open(filePath, false))
{
Sheet sheet = doc.WorkbookPart.Workbook.Sheets.GetFirstChild<Sheet>();
Worksheet worksheet = doc.WorkbookPart.GetPartById(sheet.Id.Value) as WorksheetPart.Worksheet;
IEnumerable<Row> rows = worksheet.GetFirstChild<SheetData>().Descendants<Row>();
DataTable dt = new DataTable();
List<string> columnRef = new List<string>();
foreach (Row row in rows)
{
if (row.RowIndex != null)
{
if (row.RowIndex.Value == 1)
{
foreach (Cell cell in row.Descendants<Cell>())
{
dt.Columns.Add(GetValue(doc, cell));
columnRef.Add(cell.CellReference.ToString().Substring(0, cell.CellReference.ToString().Length - 1));
}
}
else
{
dt.Rows.Add();
int i = 0;
foreach (Cell cell in row.Descendants<Cell>())
{
while (columnRef(i) + dt.Rows.Count + 1 != cell.CellReference)
{
dt.Rows(dt.Rows.Count - 1)(i) = "";
i += 1;
}
dt.Rows(dt.Rows.Count - 1)(i) = GetValue(doc, cell);
i += 1;
}
}
}
}
}
return dt;
}
row.Descendants<Cell>().Count()
GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i));
for (int i = 0; i < row.Descendants<Cell>().Count(); i++)
{
tempRow[i] = GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i));
}
for (int i = 0; i < row.Descendants<Cell>().Count(); i++)
{
Cell cell = row.Descendants<Cell>().ElementAt(i);
int actualCellIndex = CellReferenceToIndex(cell);
tempRow[actualCellIndex] = GetCellValue(spreadSheetDocument, cell);
}
private static int CellReferenceToIndex(Cell cell)
{
int index = 0;
string reference = cell.CellReference.ToString().ToUpper();
foreach (char ch in reference)
{
if (Char.IsLetter(ch))
{
int value = (int)ch - (int)'A';
index = (index == 0) ? value : ((index + 1) * 26) + value;
}
else
{
return index;
}
}
return index;
}