我使用Epplus从流中读取xlsx文件。
它有一个错误,它无法读取我的工作簿中的某些列。如何在不使用epplus的情况下将xlsx文件从流读取到数据表?
我的旧代码:
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阅读器无法正确读取列值。
答案 0 :(得分:14)
“它有一个错误,它无法读取我的工作簿中的某些列”
你能描述一下这个错误,你有reported它还是已经知道,你使用的是什么版本?
这是一种使用EPPlus将excel文件加载到DataTable
的简单方法。
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;
}
}
答案 1 :(得分:0)
这已成为过去,但它仍然可以帮助某人。 显然,我的工作表中的某些列已合并,因此,例如,如果合并了列A和B,它只将列A识别为具有值的列,因此当我调用该特定单元格的值时,它将列B返回为空( B)。为了解决这个问题,请确保您知道哪些单元格已合并,然后仅抓取第一个单元格并将其余的合并单元格视为空