Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何将数据流excel文件转换为数据表C#?_Asp.net_Excel_Xlsx_Epplus - Fatal编程技术网

Asp.net 如何将数据流excel文件转换为数据表C#?

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

我使用Epplus从流中读取xlsx文件

它有一个错误,无法读取我工作簿中的某些列。没有ePlus,如何将xlsx文件从流读取到datatable

我的旧代码:

 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”);