public void print(DataGrid datagrid,DataTable dataTable,bool ifopen,string pathchoose)
{
//导出到execl
try
{
//没有数据的话就不往下执行
if (dataTable.Rows.Count == 0)
return;
//实例化一个Excel.Application对象
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
//让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写
excel.Visible = ifopen;
//新增加一个工作簿,Workbook是直接保存,不会弹出保存对话框,加上Application会弹出保存对话框,值为false会报错
Microsoft.Office.Interop.Excel.Workbook wk=excel.Application.Workbooks.Add(true);
//生成Excel中列头名称 for (int i = 0; i < dataTable.Columns.Count; i++)
{
excel.Cells[1, i + 1] = dataTable.Columns[i].ColumnName;
}
//把DataGridView当前页的数据保存在Excel中
for (int i = 0; i < dataTable.Columns.Count ; i++)
{
for (int j = 0; j < dataTable.Rows.Count; j++)
{
if (datagrid[j, i].ToString () == "")
{
excel.Cells[j + 2, i + 1] = "'" + datagrid[j, i].ToString();
}
else
{
excel.Cells[j + 2, i + 1] = datagrid[j, i].ToString();
}
}
} //设置禁止弹出保存和覆盖的询问提示框
excel.DisplayAlerts = ifopen;
excel.AlertBeforeOverwriting = ifopen; //保存工作簿
wk.Save();
//保存excel文件
excel.Save(pathchoose);
wk.Close(0,0,0);
//确保Excel进程关闭 excel.Quit();
excel = null;
if (ifopen)
MessageBox.Show("已保存在"+pathchoose+"!", "完成提示");
else
MessageBox.Show("已保存,请不要随意删除!", "完成提示"); }
catch (Exception ex)
{
if (ex.Message=="HRESULT 中的异常:0x800A03EC。")
MessageBox.Show("请保存后关闭excel!", "错误提示");
else MessageBox.Show(ex.Message, "错误提示");
} }
{
//导出到execl
try
{
//没有数据的话就不往下执行
if (dataTable.Rows.Count == 0)
return;
//实例化一个Excel.Application对象
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
//让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写
excel.Visible = ifopen;
//新增加一个工作簿,Workbook是直接保存,不会弹出保存对话框,加上Application会弹出保存对话框,值为false会报错
Microsoft.Office.Interop.Excel.Workbook wk=excel.Application.Workbooks.Add(true);
//生成Excel中列头名称 for (int i = 0; i < dataTable.Columns.Count; i++)
{
excel.Cells[1, i + 1] = dataTable.Columns[i].ColumnName;
}
//把DataGridView当前页的数据保存在Excel中
for (int i = 0; i < dataTable.Columns.Count ; i++)
{
for (int j = 0; j < dataTable.Rows.Count; j++)
{
if (datagrid[j, i].ToString () == "")
{
excel.Cells[j + 2, i + 1] = "'" + datagrid[j, i].ToString();
}
else
{
excel.Cells[j + 2, i + 1] = datagrid[j, i].ToString();
}
}
} //设置禁止弹出保存和覆盖的询问提示框
excel.DisplayAlerts = ifopen;
excel.AlertBeforeOverwriting = ifopen; //保存工作簿
wk.Save();
//保存excel文件
excel.Save(pathchoose);
wk.Close(0,0,0);
//确保Excel进程关闭 excel.Quit();
excel = null;
if (ifopen)
MessageBox.Show("已保存在"+pathchoose+"!", "完成提示");
else
MessageBox.Show("已保存,请不要随意删除!", "完成提示"); }
catch (Exception ex)
{
if (ex.Message=="HRESULT 中的异常:0x800A03EC。")
MessageBox.Show("请保存后关闭excel!", "错误提示");
else MessageBox.Show(ex.Message, "错误提示");
} }
或者直接杀进程,是不是资源没有完全释放啊。
for (int i = 0; i < dataTable.Columns.Count ; i++)
{
for (int j = 0; j < dataTable.Rows.Count; j++)
{
if (datagrid[j, i].ToString () == "")
{
excel.Cells[j + 2, i + 1] = "'" + datagrid[j, i].ToString();
}
else
{
excel.Cells[j + 2, i + 1] = datagrid[j, i].ToString();
}
}
总是以相同的判断方式重复执行.
excel = null;
之后,还是一样问题
这个没明白你意思,这个循环是从datagrid里挨个读数据放到excel里
wk.SaveAs(@"D:\CData2.xls",Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);保存方式换一下 直接用Workbook保存。如果还不行试试杀进程,一般情况下,进程都结束不了,只有强杀。
直接杀进程直接杀进程 if (xlApp != null)
{ if (xlApp.ActiveWorkbook != null)
{
xlApp.ActiveWorkbook.Close(false, Type.Missing, Type.Missing);
} xlApp.Quit(); //杀进程
IntPtr t = new IntPtr(xlApp.Hwnd);
int k = 0;
GetWindowThreadProcessId(t, out k);
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);
p.Kill();
}
GC.Collect();//调用系统的api 上边代码用的
[DllImport("User32.dll", CharSet = CharSet.Auto)]
private static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
2,是不是跟2次保存的工作薄没有命名就直接保存有关。都叫做sheet1
谢谢5楼,按这个试了下,报错找不到Missing.Value的using命名空间,很不好意思,能不能再跟我说下要加什么using吧> <
"是不是跟2次保存的工作薄没有命名就直接保存有关。都叫做sheet1" 这个应该无关
请大家再帮我看看啊