【发布时间】: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