10

私は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リーダーは列の値を正しく読み取ることができません。

4

2 に答える 2

17

「バグがあり、ブックの一部の列を読み取ることができません」

バグについて説明していただけますか、報告しましたか、それともすでにわかっていますか、どのバージョンを使用していますか?

DataTableこれは、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;
    }
}
于 2012-06-28T07:25:44.617 に答える
0

これはかなり過去のことですが、それでも誰かを助けることができます。どうやら私のワークシートのいくつかの列がマージされたようです。たとえば、列AとBがマージされた場合、列Aは値を持つものとしてのみ認識されるため、特定のセルの値を呼び出すと、列Bは空として返されます。 B)。これを乗り越えるには、どのセルがマージされているかを確認してから、最初のセルのみを取得し、マージされた残りのセルをnullと見なします。

于 2017-08-07T16:55:33.460 に答える