【问题标题】:Import a CSV or XLSX Into A DataTable Using EPPLus使用 EPPLus 将 CSV 或 XLSX 导入数据表
【发布时间】:2018-08-01 12:53:26
【问题描述】:

我在 SO 上找到了一个线程,并试图将 csv 或 xls 或 xlsx 导入 C# DataTable - 但我收到以下堆栈跟踪错误:

    System.Runtime.InteropServices.COMException
  HResult=0x8003001D
  Message=A disk error occurred during a write operation. (Exception from HRESULT: 0x8003001D (STG_E_WRITEFAULT))
  Source=EPPlus

这是我试图用来导入文件的代码 - 我需要更改哪些内容才能正常执行?

        private OpenFileDialog openFileDialog1 = new OpenFileDialog();
    public static DataTable GetDataTableFromExcel(string path, bool hasHeader = true)
    {
        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();
            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 (int rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
            {
                var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
                DataRow row = tbl.Rows.Add();
                foreach (var cell in wsRow)
                {
                    row[cell.Start.Column - 1] = cell.Text;
                }
            }
            return tbl;
        }
    }

    private void btnImportSpreadsheet_Click(object sender, EventArgs e)
    {
        DataTable spreadsheetImport = new DataTable();
        openFileDialog1.Filter = "Excel Files|*.xls;*.xlsx;*.csv;";
        DialogResult result = openFileDialog1.ShowDialog();

        if (result == DialogResult.OK)
        {
            string file = openFileDialog1.FileName;
            spreadsheetImport = GetDataTableFromExcel(file);
        }
    }

【问题讨论】:

  • @Magnetron - 引发错误的代码行是 - pck.Load(stream)
  • 只有读取csv才会出现这个错误?因为epplus不支持csv,只支持xlsx
  • @Magnetron - 等待 EPPlus 可以写入 csv 但无法将其读回?
  • 是的,只是不要使用DataTypes 属性

标签: c# datatable epplus epplus-4


【解决方案1】:

要使用 csv,您必须使用 LoadFromText。另请注意,EPPlus 不能与 xls 一起使用,它可以读取 xlsx 和 xlsm 并写入 xlsx。

char csvDelimiter = ';';
using(var pck = new ExcelPackage())
{
    ExcelWorksheet ws = null;
    if(path.EndsWith(".csv"))
    {
        ws = pck.Workbook.Worksheets.Add("Sheet1");
        ExcelTextFormat format = new ExcelTextFormat()
        {
            Delimiter = csvDelimiter 
        };
        ws.Cells[1, 1].LoadFromText(File.ReadAllText(path), format);
    }
    else
    {
        using (var stream = File.OpenRead(path))
        {
            pck.Load(stream);
        }
        ws = pck.Workbook.Worksheets.First();
    }

    //The rest of your code

}

另一个选项是使用ExcelDataReader,因为它可以读取 xls、xlsx 和 csv,但不能写入。它有一个extension that converts a file to a DataSet

【讨论】:

  • 未来视图需要注意的一点是,变量 csvDelimter 应设置为 csv 中的任何定界符。在我的例子中,分隔符是','而不是';' - :)
猜你喜欢
  • 1970-01-01
  • 2018-02-16
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 2018-07-25
  • 1970-01-01
  • 2013-09-03
相关资源
最近更新 更多