我试图从excel文件中检索数据并存储到datatable.It适用于单张文件。但是如果excel文件包含多张工作表我必须从工作表中检索所有值。现在主要问题我是饰面是一些工作表包含与其他工作表相同的列名。如果我将它存储在一个数据表中,我将获得重复的列名异常。如何解决这个问题。我想通过使用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;
}
}
读取所有工作表我更改了行var ws = pck.Workbook.Worksheets.First();
到var ws = pck.Workbook.Worksheets;
和迭代集合但以重复列异常结束,因为多个工作表具有相同的列名。任何代码更改为共享?
更新
对于迭代收集我确实如下所示
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();
}
}
更新
调用代码如下所示
DataTable dt = Extensionexcel.Exceltotable(@&#34; D:\ sample.xlsx&#34;);
答案 0 :(得分:6)
您可以返回包含表格的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;
}
}
答案 1 :(得分:3)
你好peter为什么不直接返回IEnumerable&lt; DataTable&gt; ?
请注意.First是一种在IEnumerable上使用的方法来获取单个项目。 如果你先停止使用然后你就拥有了整个系列。
答案 2 :(得分:3)
为什么不更新方法以返回DataSet,而不是返回DataTable,为什么不返回一个DataSet,它包含Excel文档中每个工作表的DataTable。