Asp.net 如何将数据流excel文件转换为数据表C#?
我使用Epplus从流中读取xlsx文件 它有一个错误,无法读取我工作簿中的某些列。没有ePlus,如何将xlsx文件从流读取到datatable 我的旧代码:Asp.net 如何将数据流excel文件转换为数据表C#?,asp.net,excel,xlsx,epplus,Asp.net,Excel,Xlsx,Epplus,我使用Epplus从流中读取xlsx文件 它有一个错误,无法读取我工作簿中的某些列。没有ePlus,如何将xlsx文件从流读取到datatable 我的旧代码: public static DataSet ReadExcelFile(Stream stream) { try { //2. Reading from a OpenXml Excel file (2007 format; *.xlsx) IExc
public static DataSet ReadExcelFile(Stream stream)
{
try
{
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
IExcelDataReader excelReader =
ExcelReaderFactory.CreateOpenXmlReader(stream);
//...
DataSet result = excelReader.AsDataSet();
return result;
}
catch (Exception x)
{
throw x;
}
}
我并没有报告它,但我尝试了太多的组合。若工作表中有空列,epplus阅读器无法正确读取列值
它有一个错误,无法读取我工作簿中的某些列
你能描述一下这个bug吗,你知道还是已经知道了,你使用的是什么版本
下面是一种使用EPPlus将excel文件加载到数据表中的简单方法
public static DataTable getDataTableFromExcel(string path)
{
using (var pck = new OfficeOpenXml.ExcelPackage())
{
using (var stream = File.OpenRead(path))
{
pck.Load(stream);
}
var ws = pck.Workbook.Worksheets.First();
DataTable tbl = new DataTable();
bool hasHeader = true; // adjust it accordingly( i've mentioned that this is a simple approach)
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);
}
return tbl;
}
}
公共静态数据表getDataTableFromExcel(字符串路径)
{
使用(var pck=new OfficeOpenXml.ExcelPackage())
{
使用(var stream=File.OpenRead(path))
{
pck.负荷(流);
}
var ws=pck.Workbook.Worksheets.First();
DataTable tbl=新的DataTable();
bool hasHeader=true;//相应地调整它(我已经提到这是一种简单的方法)
foreach(ws.Cells[1,1,1,ws.Dimension.End.Column]中的var firstRowCell)
{
添加(hashreader?firstRowCell.Text:string.Format(“Column{0}”,firstRowCell.Start.Column));
}
var startRow=hasHeader?2:1;
对于(var rowNum=startRow;rowNum来说,这已经过去了,但是它仍然可以帮助某些人。
显然,我的工作表中的某些列被合并了,因此,例如,如果A列和B列被合并,它只会将A列识别为具有该值的列,因此当我调用该特定单元格的值(B)时,它将B列返回为空。若要解决此问题,请确保您知道合并了哪些单元格,然后仅获取第一个单元格,并将其余合并单元格视为空我在var ws=pck.Workbook.Worksheets[“Worksheet1”];有什么想法吗?@Mennan:试试var ws=pck.Workbook.Worksheets.first();
而不是(相应地编辑了我的答案)。我使用的是Epplus版本3.0.0.2,而pck.Workbook.Worksheets没有First()方法抱歉,我也尝试了Worksheets[0],仍然是空的。我不明白,谢谢你,帮了我很多忙。不过,我有一些关于空列的问题,必须将它们从excel中删除才能正常工作。@fishmong3r:是的,你可以使用FirstOrDefault
来获取第一张具有该名称的工作表(如果没有,则为空):var ws=pck.Workbook.Worksheets.FirstOrDefault(sheet=>sheet.Name==“Name”);