来自 HRESULT 的异常:0x800A03EC 尝试 PasteSpecial datagridview 时出错-excel

Exception from HRESULT: 0x800A03EC Error triying to PasteSpecial a datagridview-excel

我正在尝试将数据网格视图导出到 excel。我找到了一个非常好的解决方案,copy-paste solution,但是出现了这个异常。

这是我的代码,与我找到的解决方案的代码相同。

void botonCP_Click(object sender, EventArgs e)
{
    Microsoft.Office.Interop.Excel.Application xlexcel;
    Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
    Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
    object misValue = System.Reflection.Missing.Value;
    xlexcel = new Microsoft.Office.Interop.Excel.Application();
    xlexcel.Visible = true;
    xlWorkBook = xlexcel.Workbooks.Add(misValue);
    xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
    Microsoft.Office.Interop.Excel.Range CR = (Microsoft.Office.Interop.Excel.Range)xlWorkSheet.Cells[1, 1];
    CR.Select();
    xlWorkSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true);
}

在我看来,如果不需要,互操作性使用起来会令人厌烦。释放资源是一种PIA,似乎经常会遇到这些小问题(诚然,这可能是我对这方面知识的缺乏!)。

对我来说,我只会使用 EPPlus 这样的库来实现。

像这样的东西应该可以很好地服务并且 (IMO) 更容易编写、管理和调试:

//Get DataGridView into a DataTable:
var bindingSource = (BindingSource)dataGridView.DataSource;
var dataView = (DataView)bindingSource.List;
var dataTable = dataView.Table;

//Create a Spreadsheet
using (ExcelPackage excelPackage = new ExcelPackage())
{
    ExcelWorksheet ws = excelPackage.Workbook.Worksheets.Add("DataExport");
    ws.Cells[1,1].LoadFromDataTable(dataTable, PrintHeaders:true);


    //Write to an outputstream:
    excelPackage.SaveAs(outputStream);
    //or filesystem:
    excelPackage.SaveAs(new FileInfo(@"C:\Temp\Export.xlsx"));
}

轻松多了!