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, "错误提示");
} }

解决方案 »

  1.   

    重点检查你的dataTable的数据更新了没有啊。
      

  2.   

    加GC.Collect();
    或者直接杀进程,是不是资源没有完全释放啊。
      

  3.   

    因为这一段:
    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();
    }
    }
    总是以相同的判断方式重复执行.
      

  4.   

    专门用个datadrig绑定用的dataTable看了,数据更新了;昨天加了GC.Collect();试了,加在 excel.Quit();
    excel = null;
    之后,还是一样问题
    这个没明白你意思,这个循环是从datagrid里挨个读数据放到excel里
      

  5.   

    wk.SaveAs(@"D:\CData.xls",Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value ,Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value//,Missing.Value,Missing.Value);//保存方式二:保存WorkSheet
    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);
      

  6.   

    继续求,很困惑,觉得有如下几个原因:1,没释放上次的excel或者工作薄。可是用了GC.Collect();没作用,手动在任务进程里删掉excel。exe也没用。
    2,是不是跟2次保存的工作薄没有命名就直接保存有关。都叫做sheet1
      

  7.   


    谢谢5楼,按这个试了下,报错找不到Missing.Value的using命名空间,很不好意思,能不能再跟我说下要加什么using吧> <
      

  8.   

      把你系统发布到其它机器试试,应该和excel进程有关系
    "是不是跟2次保存的工作薄没有命名就直接保存有关。都叫做sheet1"   这个应该无关
      

  9.   

    5楼用的是不是asp?我是说winform,你说的里面Excel.XlSaveAsAccessMode.xlNoChange也找不到命名空间,愁
      

  10.   

    Microsoft.Office.Interop.Excel.Workbook wk=excel.Application.Workbooks.Add(true);   
      

  11.   

    我觉得也许是关闭工作薄时候概念错了    wk.Close(0,0,0);
    请大家再帮我看看啊
      

  12.   

    终于行了!原来我是wk.Save();//保存excel文件excel.Save(pathchoose);之后改成5楼说的,只用wk.SaveAs存一遍就行了