收录日期:2021/01/17 15:18:28 时间:2016/08/28 06:42:45 标签:C#
我现在想要的功能是,点击按钮,进行计算,把计算结果放到excel中并打开,自动保存(没有提醒,自动覆盖),直到用户关闭后释放进程。

现在可以成功生成excel文件并打开,但是保存时不能指定文件夹,只可以保存文件名到默认文件夹。
worksheet.SaveAs(name, miss, miss, miss, miss, miss, miss, miss, miss, miss);

可以,但是
worksheet.SaveAs(floder+"//"name, miss, miss, miss, miss, miss, miss, miss, miss, miss);

不行。

还有导出excel后,excel进程一直在内存中,尽管我关闭打开的excel后也仍然在内存中。如果进行垃圾处理,又会关闭新打开excel。

完整代码如下
private void btCalculate_Click(object sender, EventArgs e)
        {
            object ms = Type.Missing;

            Microsoft.Office.Interop.Excel.Application xlApp=new Microsoft.Office.Interop.Excel.Application();

            if(xlApp==null)
            {
                MessageBox.Show("Cannot use this function, install Microsoft Office Excel first.");
                return;
            }
            Microsoft.Office.Interop.Excel.Workbook workbook = xlApp.Workbooks.Add(true);
            Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
            Microsoft.Office.Interop.Excel.Range range;

            worksheet.Cells[1,1] = "Description";
            worksheet.Cells[1, 2] = "Price";
            worksheet.Cells[1, 3] = "date";

            worksheet.Application.ActiveWindow.SplitRow = 1;
            worksheet.Application.ActiveWindow.FreezePanes = true;

            range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 3]);
            range.Activate();
            range.Select();
            range.AutoFilter(1, Type.Missing, Microsoft.Office.Interop.Excel.XlAutoFilterOperator.xlAnd, Type.Missing, true);
            range.Font.Bold = true;
            range.Font.Color  = 10;
            range.Font.Size = 14;

            try
            {
                int count = 2;
                for (int i = 0; i < 6; i++)
                {
                    for (int j = 0; j < 7; j++)
                    {
                        if (btns[i, j].Visible == true)
                        {
                            if (btns[i, j].Font.Italic)
                            {
                                ds = d.ExecDataSet("select * from note where username='" + user + "' and year = '" + currentDate.Year.ToString() + "' and month= '" + currentDate.Month.ToString() + "' and day ='" + btns[i, j].Text + "'");
                                String memory = ds.Tables[0].Rows[0][7].ToString();
                                String[] temp1 = memory.Split(new char[] { '\n' });
                                for (int k = 0; k < temp1.Length; k++)
                                {
                                    String[] temp2 = temp1[k].Split(new char[] { ':' });
                                    worksheet.Cells[count, 1] = temp2[0];
                                    worksheet.Cells[count, 2] = double.Parse(temp2[1]);
                                    worksheet.Cells[count, 3] = currentDate.Month.ToString() + "/" + btns[i, j].Text + "/" + currentDate.Year.ToString();
                                    count++;
                                }
                            }
                        }
                    }
                }
                worksheet.Cells[count, 2] = "Total:";
                range = worksheet.get_Range(worksheet.Cells[count + 1, 2], worksheet.Cells[count + 1, 2]);
                range.Formula = "=sum(" + "B2:" + "B" + count + ")";
                range.Font.Color = 150;
                range.Font.Bold = true;
                range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[count + 1, 3]);
                range.EntireColumn.AutoFit();
                range = worksheet.get_Range(worksheet.Cells[2, 1], worksheet.Cells[count + 1, 3]);
                range.HorizontalAlignment = Microsoft.Office.Interop.Excel.XlHAlign.xlHAlignCenter;
                xlApp.Visible = true;
                String name = "c:\\Bills" + this.user + "\\" + currentDate.Month.ToString() + "_" + currentDate.Year.ToString() + ".xls";
                worksheet.SaveAs(name, ms, ms, ms, ms, ms, ms, ms, ms, ms);
                xlApp = null;
            }
            catch (Exception exc)
            {
                xlApp.Quit();
                xlApp = null;
                GC.Collect();
                MessageBox.Show(exc.Message);
            }
        }


我要如何编写?
需要用ReleaseComObject释放Excel的对象。

例如:

Worksheets sheets = excelApp.Worksheets; 
Worksheet sheet = sheets.Open(...);
...
Marshal.ReleaseComObject(sheets);
Marshal.ReleaseComObject(sheet);
SaveAs没有出现过你说的情况,只要路径是合法的路径并且拥有读写权限即可,至于第2个问题有两种方式,一种是1L说的释放非托管的资源,最好是卸载finally中,不要写在catch中,很多时候调试直接退出的时候是不会执行catch中的方法.
finally
{
  System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheetData);
  System.Runtime.InteropServices.Marshal.ReleaseComObject(workbookData);
  System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel);
}

或者使用API直接关掉指定的进程
[DllImport("user32.dll", SetLastError = true)]
static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

public void KillSpecialExcel(Excel.Application m_objExcel)
 {
   try
     {
       if (m_objExcel != null)
         {
           int lpdwProcessId;
           GetWindowThreadProcessId(new IntPtr(m_objExcel.Hwnd), out lpdwProcessId); 
           System.Diagnostics.Process.GetProcessById(lpdwProcessId).Kill();
          }
      }
  catch (Exception ex)
   {
     MessageBox.Show(ex.Message);
   }
}
把你 catch 块的代码放到 finally 块中试试看看,
如果不行,在试试1L的方法 

STRUTS 用ID3DXFont的DrawText计算空格符的宽度,结果为什么是0 API中SendMessage的问题 下午有事出去了,那么多散分贴都错过了,太郁闷了。 用过log4net的进来帮忙 散点分给游击大队长 大队长来接分 关于交换机访问控制列表的语句的意思! 请问大家,windows.ext 和msdos.bat ,还有会感染exe的病毒如何清除? 具有数据绑定的组合框如何设置不相干的初始默认值,烦请多多指点! 为什么用2003编译的dll 在2005下使用会找不到一些符号??? 对控件有高深研究的请帮一下忙! 有用就给100分 ocx 的怪事情 工作两年了,技术的瓶颈,难以突破,困惑,有谁可以提提建议! 一段奇怪的TRACE信息,请大侠帮忙看看 请教 老妖及各位专家 Activex 控件如何接收html上参数 信息表设计问题(浏览权问题) 关于系统时间和星期显示问题.. 【编程游戏】编写一个会划拳的机器人参加擂台赛,规则内详。路过有分。(之js盗版) 怎么突然冒出来这么多老贴 sql约束 SQL多条件查询 Hibernate警解决办法 求linux@usb 错误信息\"could not find installable ISAM\" (别人Access 2003的就可以,我Access 2007就不行) 管理科学与功能专业 :) 一个号一天回复2w张贴时,会不会被版主发现并封掉啊? 帮我分析该程序的复杂度!! 考考你,在不用C库函数的情况下,怎么产生随机数?要求不可重性,达到真正的随机 媒体格式为mjpg的摄像头,捕获的每帧数据,保存为jpg文件时,文件却打不开