来自 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"));
}
轻松多了!
我正在尝试将数据网格视图导出到 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"));
}
轻松多了!