private void isHaveA2Comment()
        {
            string file = templateTree.SelectedNode.Tag.ToString();//得到路径
           
            Excel.Range rngA2;
            workbook = ExcelEngine.Current.GetWorkbook(file);//得到workBook
            Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];
            rngA2 = worksheet.get_Range("A2", Missing.Value);
            if (rngA2.Comment == null)//如果sheet1的rngA2为空,则给每个sheet的A2加上批注
            {
               for (int i = 1; i < workbook.Worksheets.Count + 1; i++)
                {
                    worksheet = (Worksheet)workbook.Sheets[i];
                    string worksheetName = worksheet.Name.ToString();
                    rngA2 = worksheet.get_Range("A2", Missing.Value);
                    if (...)
                    {
                        rngA2.AddComment("1,unitId");
                    }
                    else if (...)
                    {
                        rngA2.AddComment("2,rows");
                    }
                    else if (...)
                    {
                        rngA2.AddComment("3,rows");
                    }
                    else
                    {
                        rngA2.AddComment("0,");
                    }
                }
                workbook.Close(true, Missing.Value, Missing.Value);
                //workbook.Save();
            }
        }

解决方案 »

  1.   

    我的问题:我每次运行,编辑,退出,等等都是没有问题的.都是可以运行,并且运行结果良好.
    退出之后,在WINDOWS资源管理器里也不存在未释放的EXCEL进程.
    但是就是打开不了我的EXCEL的模板文件.打开就抱错,叫我恢复......请教各位高手.
    十分感谢
      

  2.   

    貌似处理Excel的内容都在ExcelEngine里,什么代码?
      

  3.   

    excelapp用完了quit一下试试
    excelApp.Quit();
      

  4.   

    excel不用quit的啊.要不重装下EXCEL看看吧
      

  5.   

    没有见过 这样的问题:
       会不会是 保存 的方式 出错了扼
    //保存方式一:保存WorkBook
                          //workbook.SaveAs(@"F:\CData.xls",
                          // Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,
                          // Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,Missing.Value,Missing.Value,Missing.Value,
                          // Missing.Value,Missing.Value);                      //保存方式二:保存WorkSheet
                          // worksheet.SaveAs(@"F:\CData2.xls",
                          // Missing.Value, Missing.Value, Missing.Value, Missing.Value,
                          // Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);                     ////保存方式三
                         //workbook.Saved = true;
                         //workbook.SaveCopyAs(sfd.FileName);
                                        System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
                        worksheet = null;
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
                        workbook = null;
                        workbooks.Close();
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
                        workbooks = null;
                        excelApp.Quit();
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
                        excelApp = null;
                        MessageBox.Show("导出Excel完成!");
                    }
                }
      

  6.   

    你用 office 打开其他  excel 文件有问题吗  ?
     没有的话,就是你代码 的问题 。
      

  7.   

    我自己写的程序 ,测试 OK给你参考一下/// <summary>
            ///  导出数据到Excel+backgroundWorker1
            /// </summary>
            /// <param name="TasksData">数据源</param>
            /// <param name="HeadName">显示标题的集合</param>
            /// <param name="ColumnName">显示的列的结合</param>
            /// <param name="WorkBookName">工作表的名字</param>
            /// <param name="FileName">保存Excel文件的名字</param>
            public void ExportTasks(DataSet TasksData, ArrayList heads, ArrayList columns, string WorkBookName, string FileName)
            {
                // 定义要使用的Excel 组件接口
                // 定义Application 对象,此对象表示整个Excel 程序
                Microsoft.Office.Interop.Excel.Application excelApp = null;
                // 定义Workbook对象,此对象代表工作薄
                Microsoft.Office.Interop.Excel.Workbook workBook;
                // 定义Worksheet 对象,此对象表示Execel 中的一张工作表
                Microsoft.Office.Interop.Excel.Worksheet ws = null;
                //定义Range对象,此对象代表单元格区域
               // Microsoft.Office.Interop.Excel.Range r;            int row = 1; int cell = 1;
                int dcell = 1;
                try
                {
                    //初始化 Application 对象 excelApp
                    excelApp = new Microsoft.Office.Interop.Excel.Application();
                    //在工作薄的第一个工作表上创建任务列表
                    workBook = excelApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
                    ws = (Worksheet)workBook.Worksheets[1];                // 命名工作表的名称为
                    ws.Name = WorkBookName;
                    //创建标题             
                    for (int headindex = 0, headcount = heads.Count; headindex < headcount; headindex++)
                    {
                        ws.Cells[row, cell] = heads[headindex].ToString();
                             
                        //设置Excel 标题样式
                        //Range rghead = r = (Range)ws.get_Range(ws.Cells[row, cell], ws.Cells[row, cell]);
                        //rghead.EntireColumn.Font.Bold = true;
                        //rghead.EntireColumn.Font.Size = 14;
                        //rghead.EntireColumn.Font.ColorIndex = 3;
                        //rghead.EntireColumn.HorizontalAlignment = XlHAlign.xlHAlignLeft;
                        //rghead.EntireColumn.AutoFit();                    cell++;
                    }                              // 创建行,把数据视图记录输出到对应的Excel 单元格             
                  
                    for (int i = 0, rowcount = TasksData.Tables[0].Rows.Count; i < rowcount; i++)
                    {
                        dcell = 1;
                       
                            for (int k = 0, columnNamecount = columns.Count; k < columnNamecount; k++)
                            {
                                for (int j = 0, columncount = TasksData.Tables[0].Columns.Count; j < columncount; j++)
                                {
                                    if (TasksData.Tables[0].Columns[j].ColumnName==columns[k].ToString())
                                    {
                                        ws.Cells[i + 2, dcell] = TasksData.Tables[0].Rows[i][j].ToString() + "\r";                                    Range rg = (Range)ws.get_Range(ws.Cells[i + 2, dcell], ws.Cells[i + 2, dcell]);
                                        //设置为文本格式
                                        if (TasksData.Tables[0].Rows[i][j].GetType().Name == "DateTime")
                                        {
                                            rg.NumberFormat = "yyyy-MM-dd HH:mm:ss";
                                        }
                                        else
                                        {
                                            rg.NumberFormatLocal = "@";
                                        }
                                        rg.EntireColumn.AutoFit();
                                        dcell++;
                                        break;
                                    }
                                }
                                
                            }
                       // }
                    }                //显示 Excel
                    //excelApp.Visible = true;
                    // 或者直接保存    
                    workBook.Saved = true;
                    workBook.SaveCopyAs(FileName);
                    ws = null;
                    workBook = null;
                    excelApp = null;                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
                //页面调用
                //private void button1_Click(object sender, EventArgs e)
                //{
                //    backgroundWorker1.RunWorkerAsync();
                //}            //private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
                //{   
                //    Print p = new Print();
                //    p.ExportTasks(ds, "客户编号,员工编号,船名字", "CustomerID,EmployeeID,OrderDate", "s", "e:\\1.XLS");
                //}            //private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
                //{
                //    MessageBox.Show("数据导出成功!");
                //}
            }
        }
    }
      

  8.   

    ExcelEngine里面就是对一些方法进行了封装,其实都是workbook里面所自带的方法.另外加一点点参数,得到workbook,worksheet,保存work,worksheet等.其实没什么大的不同的地方.
      

  9.   

    这里不能QUIT(),因为我处理完毕后,还需要进行别的操作,所以不能推出.
    但是程序全部推出之后自然调用这个QUIT().
    退出之后,我的WINDOW资源管理器里并没有EXCEL进程.
    但是就是所操作的EXCEL文件打不开.总是报错.
    但是用程序读,程序写这个模板文件,都没有任何问题.
      

  10.   

    肯定是我的代码有问题.就是找不出来.
    OFFICE是肯定没有问题的.
    打开其他的EXCEL,并进行操作,比如新建立一个项目,完全COPY上面代码
    可以在EXCEL里面的SHEET全部加上COMMENT,
    但是就是我的在项目里面的这些代码不顶事.实在是烦恼啊
      

  11.   

    点看不懂:为什么要先从sheet[1](workbook.Worksheets[1])开始,应该从sheet[0]开始吧
      

  12.   

    那就说明这段代码没什么问题,是你项目中其他部分代码有问题。而且ExcelEngine应该也没什么问题,你在看看其它部分的代码吧,看看在执行这些代码前和代码后到底做了什么事情.
      

  13.   

    http://www.cnblogs.com/Files/viki117/ExeclTool.rar
    试下这个人家做好的EXECL的DLL工具。。
    方法里面也写了。。方便多了。。
      

  14.   

    Excel里面的第一个SHEET表单是从1开始的,和平时我们大家用的数组不太一样(从0开始).