本帖最后由 SK_Aqi 于 2009-07-27 17:20:30 编辑

解决方案 »

  1.   

    因为你每次new一个excel对象,然后再添加一个表,肯定只有一个了,
    先判断一个filename存不存在,如果存在
    workbookData    = exce.WorkBooks.Open(.....
    这样就可以保存多个sheets了。
      

  2.   

    excel在方法体外new出来,你操作的不是同一个excel
      

  3.   


    慕白兄,给指教啊!
    我现在那部分赋值是这样的,好像还不对
                workbookData = appExcel.Workbooks.Add(Missing.Value);
                if ("1".Equals(existfile))
                    workbookData = appExcel.Workbooks.Open(path, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "t", false, false, 0, true, Type.Missing, Type.Missing);
                else
                    worksheetData = (Excel.Worksheet)workbookData.Worksheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value);//添加一个sheet 
                worksheetData.Name = sheetname;//sheet命名 
    就是打开文件时: 名为"...xls"文档已经打开,不能同时打开同名文件.
      

  4.   

    对于excel的操作,哪怕是一个单元格,也要用变量声明出来,用完后设为null,
    否则进程不能正常退出
      

  5.   

    没有退出吗?最后一步还有GC.Collect();垃圾回收呢,
    如果真是要退出进程,我应该怎么做?
      

  6.   

    为有退出。对于excel的操作,哪怕是一个单元格,也要用变量声明出来,用完后设为null, 如:allDataWithTitleRange  用完后,要设为null
      

  7.   

    对,我设置了,
    你看这里:
                workbookData = null;
                appExcel = null;
                worksheetData = null;
                GC.Collect();
      

  8.   

    ASP.NET(C#)技术联盟高级群,欢迎工作中的朋友进来一起探讨并解决工作中遇到的问题!一群37078937(已满)二群37078867三群37078820(欢迎上海地区的朋友并爱好Dota的)
    严禁加多群,群定期清理长期不发言不讨论的朋友,请多包涵。
      

  9.   

    我是举个例子。如:
      appExcel.Cells[rowIndex, colIndex] = ==>Cell cell = appExcel.Cells[rowIndex, colIndex];
    cell==........cell = null;检查一下所有代码,否则excel进程无法退出。
      

  10.   

    好像这个cell不用声明,觉得不是进程的问题,原来导出一个sheet就没有问题,
    还有用exportTest(ds.Tables[0].DefaultView, filename, "testsheet2"); 
    再执行也可以重写,不会形成进程未结束的问题,请慕白兄指教啊!
      

  11.   

    让我哥们解决了,开心散分!
    代码如下:
    private void DataViewExcelBySheetMultipleDt(DataSet ds, string fileName)
        {
            try
            {
                int sheetCount = ds.Tables.Count;
                GC.Collect();
                Application excel;
                _Workbook xBk;
                _Worksheet xSt = null;
                excel = new ApplicationClass();
                xBk = excel.Workbooks.Add(true);            int rowIndex = 0;
                int colIndex = 0;
                for (int sheetIndex = 0; sheetIndex < sheetCount; sheetIndex++)
                {
                    rowIndex = 1;
                    colIndex = 1;
                    xSt = (_Worksheet)xBk.Worksheets.Add(Type.Missing, Type.Missing, 1, Type.Missing);
                    switch (sheetIndex)
                    {
                        case 0:
                            xSt.Name = "test1";
                            break;
                        case 1:
                            xSt.Name = "test2";
                            break;
                        case 2:
                            xSt.Name = "test3";
                            break;
                        case 3:
                            xSt.Name = "test4";
                            break;
                    }
                    foreach (DataColumn col in ds.Tables[sheetIndex].Columns)
                    {
                        xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;
                        xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).Font.Bold = true;
                        excel.Cells[rowIndex, colIndex++] = col.ColumnName;
                    }
                    foreach (DataRow row in ds.Tables[sheetIndex].Rows)
                    {
                        rowIndex++;
                        colIndex = 1;
                        foreach (DataColumn col in ds.Tables[sheetIndex].Columns)
                        {
                            if (col.DataType == System.Type.GetType("System.DateTime"))
                            {
                                if (!"".Equals(row[col.ColumnName].ToString()))
                                    excel.Cells[rowIndex, colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("MM/dd/yyyy");
                                else
                                    excel.Cells[rowIndex, colIndex] = "";
                            }
                            else if (col.DataType == System.Type.GetType("System.String"))
                            {
                                excel.Cells[rowIndex, colIndex] = "'" + row[col.ColumnName].ToString();
                            }
                            else
                            {
                                excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
                            }
                            colIndex++;
                        }
                    }
                    Range allDataWithTitleRange = xSt.get_Range(excel.Cells[1, 1], excel.Cells[rowIndex, colIndex - 1]);
                    allDataWithTitleRange.Select();
                    allDataWithTitleRange.Columns.AutoFit();
                    allDataWithTitleRange.Borders.LineStyle = 1;
                }
                string exportDir = "~/Attachment/";
                string absFileName = HttpContext.Current.Server.MapPath(System.IO.Path.Combine(exportDir, fileName));
                xBk.SaveCopyAs(absFileName);
                xBk.Close(false, null, null);
                excel.Quit();            System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);            xBk = null;
                excel = null;
                xSt = null;
                GC.Collect();
            }
            catch (Exception ex)
            {        }
        }
    上面方法,首先形成一个多个DataTable的DataSet,
    重点还是,1. 生成一个新的xls时,打开方式,总是会提示进程占用,就像楼上说的那样
    2. 用不同的sheet时一定要命名
    3. 使用传入一个datatable时,总是会重写第一个sheet
    谨供大家参考
      

  12.   

    请问不规则EXCEL怎么处理?里面还有图片什么的。可以从表格的单元格颜色上分辨出不同的表格吗?