我正在尝试将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);
}
答案 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"));
}
更容易!