none
困扰了自己好几天的用Microsoft.Office.Interop.Excel导出excel问题,请大家指点一二! RRS feed

  • 问题

  • 代码没有发全,所以分开发了,请大家看看下面的!谢谢! 为什么我在本机上调试的时候导出的excel没问题,但放到服务器上,点击导出按钮后,页面刷了一下,就没了,而不是像本机那样,出来一个excel,然后把数据集中的数据写进去!请大家指点啊!!谢谢,谢谢!!
    2009年8月18日 2:34

答案

  •  ex.Visible = true;//显示Excel
    这样的界面在服务器上是无效的。
    客户端不可能看到服务器上的程序界面的。
    你只能生成.xls文件或者采用流的方法输出。
    网上很多GridView输出excel的例子。思路 类似

    Microsoft.Office.Interop.Excel只能生成文件后,输出或者下载到客户端


    【孟子E章】
    2009年8月18日 7:07
    版主

全部回复

  • 建议你最好把问题详细描述下
    2009年8月18日 2:36
  •  /// <summary>
        /// 把指定的DataSet中的内容导出到Excel中.
        /// </summary>
        /// <example>Import2Excel(this.dsData ,"用户名|USERNAME,登录名|LOGINNAME",3,1,"用户名列表|BILL_USER",1,2 ,12);</example>
        // private void Import2Excel(System.Data.DataSet ds, string ImpStr, int locR, int locC, string TitleStr, int TilteLocR, int TitleLocC, int ColTitleColorIndex)
        public struct stru_Para
        {
            public System.Data.DataSet ds;// <param name="ds">ds参数为DateSet对象</param>
            public string ImpStr; // <param name="ImpStr">该字符串用来指定一些字段来导出,其使用格式为:aaa|AAA,bbb|BBB   小写字符串为在Excel表中显示该字段的列标题,大写表示字段名.不同字段使用逗号分隔.</param>
            public int locR; // <param name="locR">数据导出到Excel中的开始行</param>
            public int locC; // <param name="locC">数据导出到Excel中的开始列</param>
            public string TitleStr;// <param name="TitleStr">该字符串用来指定要导出的表和表的标题其格式为:aaa|AAA,bbb|BBB   小写为该表中显示的标题,大写为表名称.不同表使用逗号分隔</param>
            public int TitleLocR;// <param name="TilteLocR">显示标题的行</param>
            public int TitleLocC;// <param name="TitleLocC">显示标题的列</param>
            public int ColTitleColorIndex;// <param name="ColTitleColorIndex">列标题颜色索引</param>
        }

     public void Import2Excel(stru_Para para)
            {
                //加载Excel
                ApplicationClass ex = new ApplicationClass();
               
                ex.Visible = true;//显示Excel
                if (ex == null)
                {
                    //无法显示时报错
                    //弹出错误对话框javascript:alert();
                  //  ClientScriptManager script = Page.ClientScript;
                  //  script.RegisterClientScriptBlock(Page.GetType(), "st", "alert('警告,失败!');", true);
                  //  msgBox(this,"123");
                    HttpContext.Current.Response.Write("<script>alert('加载Excel失败!');</script>");
                    return;
                }
                string[] tles =para.TitleStr.Split(",".ToCharArray());
                string[] Imps = para.ImpStr.Split(",".ToCharArray());
                string[] tlbs = para.TitleStr.Split(",".ToCharArray());
                //获得工作薄
                Workbooks wbs = ex.Workbooks;
                Workbook wb = wbs.Add(XlWBATemplate.xlWBATWorksheet);
               

                int z = 0;//Sheet索引
                foreach (string tblname in tlbs)
                {
                    z += 1;
                    //得到表和工作表一个工作表对应一个表,
                    string[] tbn = tblname.Split("|".ToCharArray());
                    System.Data.DataTable dt =para.ds.Tables[tbn[1].ToUpper()];
                    Worksheet ws = (Worksheet)wb.Worksheets[z];
                    //工作表的第一行标题设置为该表的表名.
                    //从格式字符串中去表名对应的名称.
                    //    int tm1=TitleStr.ToUpper().IndexOf(dt.TableName+"|")+dt.TableName.Length +1;
                    //    string tit=TitleStr.Substring(tm1,TitleStr.IndexOf(",",tm1)-tm1);
                    ws.Cells[para.TitleLocR, para.TitleLocC] = tbn[0];//设置该单元格显示的标题
                    ws.Name = dt.TableName;//设置该Sheet的名称为表名.
                    int n1 = para.locC;
                    //设置字段名称
                    foreach (string imp in Imps)
                    {
                        string[] im = imp.Split("|".ToCharArray());
                        n1 += 1;
                        ws.Cells[para.locR, n1] = im[0];//'字段名称
                        Range rg = (Range)ws.Cells[para.locR, n1];
                        rg.Interior.ColorIndex = para.ColTitleColorIndex;
                        rg.Font.Bold = true;
                    }
                    for (int y = 0; y <= dt.Rows.Count - 1; y += 1)
                    {
                        System.Data.DataRow dr = dt.Rows[y];
                        int n2 = 1;
                        foreach (string imp in Imps)
                        {
                            string[] im = imp.Split("|".ToCharArray());
                            ws.Cells[para.locR + 1 + y, para.locC + n2] = dr[im[1].ToUpper()];
                            n2 += 1;
                        }
                    }
                }
            }

    2009年8月18日 2:36
  • 以下是调用,过程很简单

      DBConnection db = new DBConnection();
            DataSet _ds = db.getDataSet(sqlcmd, "table");
            //Import2Excel(ds,"编号|vis_Code,名称|vis_ItemName",3,1,"导出表|table",1,2,12);
            ExcelAndData DStoExcel = new ExcelAndData();
            stru_Para para = new stru_Para();
            para.ds = _ds;
            para.ImpStr = "编号|Code,项目名称|ItemName";
            para.locR = 3;
            para.locC = 1;
            para.TitleStr = "导出表|table";
            para.TitleLocR = 1;
            para.TitleLocC = 2;
            para.ColTitleColorIndex = 12;
            Session["para"] = para;
            DStoExcel.Import2Excel(para);
    2009年8月18日 2:38
  • 为什么我在本机上调试的时候导出的excel没问题,但放到服务器上,点击导出按钮后,页面刷了一下,就没了,而不是像本机那样,出来一个excel,然后把数据集中的数据写进去!请大家指点啊!!谢谢,谢谢!!
    2009年8月18日 2:40
  •  ex.Visible = true;//显示Excel
    这样的界面在服务器上是无效的。
    客户端不可能看到服务器上的程序界面的。
    你只能生成.xls文件或者采用流的方法输出。
    网上很多GridView输出excel的例子。思路 类似

    Microsoft.Office.Interop.Excel只能生成文件后,输出或者下载到客户端


    【孟子E章】
    2009年8月18日 7:07
    版主
  • 高手就是高手!佩服!
    2009年8月19日 0:40
  • 谢谢,孟兄,困扰了几天的问题,经你一指点,半个小时就搞定!真是滔滔江水,绵绵黄河啊!
    2009年8月19日 2:49
  • 不必激动过多  助人为乐应该的
    2009年8月19日 3:05