我试图从excel文件中检索数据并存储到datatable.It适用于单张文件.但如果一个excel文件包含多张工作表我必须从工作表中检索所有值.现在我面临的主要问题是一些sheet包含与其他sheet相同的列名.如果我将它存储在单个数据表中,我将获得重复的列名异常.如何解决这个问题.我想通过使用返回每个表的表tuple,params但没有运气任何想法来解决这个问题问题..单张表的代码运作良好如下所示
我创建了一个如下所示的扩展方法
public static DataTable getDataTableFromExcel(string path)
{
using (var pck = new OfficeOpenXml.ExcelPackage())
{
DataTable tbl = new DataTable();
try
{
using (var stream = File.OpenRead(path))
{
pck.Load(stream);
}
var ws = pck.Workbook.Worksheets.First();
bool hasHeader = true; // adjust it accordingly( i've mentioned that this is a simple approach)
string ErrorMessage = string.Empty;
foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
{
tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column));
}
var startRow = hasHeader ? 2 : 1;
for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
{
var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
var row = tbl.NewRow();
foreach (var cell in wsRow)
{
row[cell.Start.Column - 1] = cell.Text;
}
tbl.Rows.Add(row);
}
}
catch (Exception exp)
{
}
return tbl;
}
}
Run Code Online (Sandbox Code Playgroud)
阅读所有的床单,我改变线var ws = pck.Workbook.Worksheets.First();
对var ws = pck.Workbook.Worksheets;和迭代集合但是由于具有多张同一列names.Any代码更改共享重复列例外结束?
UPDATE
对于迭代收集,我确实如下所示
public static DataTable Exceltotable(this string path)
{
using (var pck = new OfficeOpenXml.ExcelPackage())
{
DataTable tbl = new DataTable();
try
{
using (var stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
pck.Load(stream);
}
var wss = pck.Workbook.Worksheets;
foreach (var ws in wss)
{
bool hasHeader = true; // adjust it accordingly( i've mentioned that this is a simple approach)
string ErrorMessage = string.Empty;
foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
{
if ((firstRowCell.Text != "MAXIMO FIELD NAME") && (firstRowCell.Text != "Sr NO") && (firstRowCell.Text != "Sr NO"))
{
tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column));
}
}
var startRow = hasHeader ? 2 : 1;
for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
{
var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
var row = tbl.NewRow();
foreach (var cell in wsRow)
{
row[cell.Start.Column - 1] = cell.Text;
}
tbl.Rows.Add(row);
}
Console.WriteLine();
}
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
调用代码如下所示
DataTable dt = Extensionexcel.Exceltotable(@"D:\ sample.xlsx");
您可以返回DataSet包含表的列表而不是DataTable.DataSet中的每个表都代表excel中的工作表.
你的代码将是这样的:
public static DataSet Exceltotable(this string path)
{
using (var pck = new OfficeOpenXml.ExcelPackage())
{
using (var stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
pck.Load(stream);
}
DataSet dataSet = new DataSet();
var wss = pck.Workbook.Worksheets;
foreach (var ws in wss)
{
DataTable tbl = new DataTable();
//Populate the datatable here
...
dataSet.Tables.Add(tbl);
}
return dataSet;
}
}
Run Code Online (Sandbox Code Playgroud)