none
asp.net如何通过模版导出Excel RRS feed

  • 问题

  • 一般Excel表的标题都是这样或那样的合并。感觉asp.net中合并单元格不是很懂。所以想先建好一个模板,把标题部分设计好。然后以DataTable的格式把数据循环到模板的里。请问应该如何实现呀?

    2011年4月4日 3:39

答案

全部回复

    • 已标记为答案 hkstb 2011年4月12日 6:49
    2011年4月4日 12:00
    版主
  • 孟版主的方法确实运行成功。谢谢。

    不过现在有个问题,并发会不会导致出错呢?

    2011年4月4日 16:28
  • 这是我的导出Excel,不知道为什么模版不管用。

    private void OutputExcel(DataTable dt)
      {
        string Filename = "/Templates.xls";
        GC.Collect();
        Excel.Application excel;
        Excel._Workbook xBk;
        Excel._Worksheet xSt;
    
    
        excel = new Excel.ApplicationClass();
        xBk = excel.Workbooks.Add(true);
        xSt = (Excel._Worksheet)xBk.ActiveSheet;
    
        for (int i = 0; i < dt.Rows.Count; i++)
        {
          //int officeid = Convert.ToInt32(ds.Tables[0].Rows[i][3].ToString());
          //DateTime stdt = Convert.ToDateTime(ds.Tables[0].Rows[i][4].ToString());
    
          excel.Cells[i + 3, 1] = dt.Rows[i][2].ToString();
          excel.Cells[i + 3, 2] = dt.Rows[i][3].ToString();
          excel.Cells[i + 3, 3] = dt.Rows[i][4].ToString();
          excel.Cells[i + 3, 4] = dt.Rows[i][5].ToString();
          excel.Cells[i + 3, 5] = dt.Rows[i][6].ToString();
          excel.Cells[i + 3, 6] = dt.Rows[i][7].ToString();
          excel.Cells[i + 3, 7] = dt.Rows[i][8].ToString();
          excel.Cells[i + 3, 8] = dt.Rows[i][9].ToString();
          excel.Cells[i + 3, 9] = dt.Rows[i][10].ToString();
          excel.Cells[i + 3, 10] = dt.Rows[i][11].ToString();
          excel.Cells[i + 3, 11] = dt.Rows[i][12].ToString();
          excel.Cells[i + 3, 12] = dt.Rows[i][13].ToString();
          excel.Cells[i + 3, 13] = dt.Rows[i][14].ToString();
          excel.Cells[i + 3, 14] = dt.Rows[i][15].ToString();
          excel.Cells[i + 3, 15] = dt.Rows[i][16].ToString();
          excel.Cells[i + 3, 16] = dt.Rows[i][17].ToString();
          excel.Cells[i + 3, 17] = dt.Rows[i][18].ToString();
          excel.Cells[i + 3, 18] = dt.Rows[i][19].ToString();
          excel.Cells[i + 3, 19] = dt.Rows[i][20].ToString();
          excel.Cells[i + 3, 20] = dt.Rows[i][21].ToString();
          excel.Cells[i + 3, 21] = dt.Rows[i][22].ToString();
          excel.Cells[i + 3, 22] = dt.Rows[i][23].ToString();
          excel.Cells[i + 3, 23] = dt.Rows[i][24].ToString();
        }
        excel.Columns.AutoFit();
        //显示效果
        excel.Visible = true;
    
        xBk.SaveCopyAs(Server.MapPath(".") + "\\" + Filename);
        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();
    
        string path = Server.MapPath(Filename);
        System.IO.FileInfo file = new System.IO.FileInfo(path);
        Response.Clear();
        Response.Buffer = true;
        Response.Charset = "";
        Response.AppendHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode("表_" + DateTime.Now.ToShortDateString() + ".xls"));
        Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文
        EnableViewState = false;
        Response.WriteFile(file.FullName);
        Response.End();
      }
    
    2011年4月4日 17:11
  • 不管用是什么意思?没有导出成文件还是文件有了没有效果?

    另外,你的这种方法需要服务器端安装Excel,并且设置执行的权限。


    【孟子E章】
    2011年4月6日 0:43
    版主
  •  不管用是什么意思?

    string Filename = "/Templates.xls";
    就是我这个模版的第一、二行设置了标题内容。可是生成的EXCEL第一、二行是空的。

    2011年4月6日 2:18
  • 内容没保存进去?你看看你的保存的文件和输出的文件是一个文件吗?位置是一样的吗?
    【孟子E章】
    2011年4月6日 5:51
    版主
  • 位置是一样的。因为程序运行完以后,Templates.xls 就会被数据库里的数据重写,只是我手动设置了标题内容变成空的了。

    2011年4月6日 8:39