来自HRESULT的异常:0x800A03EC错误地向PasteSpecial求一个datagridview-excel

时间:2015-04-28 08:43:40

标签: c# excel datagridview copy-paste

我正在尝试将datagridview导出到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);
}

1 个答案:

答案 0 :(得分:0)

在我看来,如果你不需要,互操作就会令人愤怒地使用。释放资源是一种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"));
}

更容易!