首页 > 代码库 > .Net之路(十三)数据库导出到EXCEL

.Net之路(十三)数据库导出到EXCEL

   .NET中导出到Office文档(word,excel)有我理解的两种方法.一种是将导出的文件存放在server某个目录以下,利用response输出到浏览器地址栏,直接打开;还有直接利用javascript来导出html中的标签。

1.javascript导出

function AllAreaWord(areaId) {
            var myDate = new Date(); //日期函数
            try {
                var fileName = myDate.getYear() + (myDate.getMonth() + 1) + myDate.getDate() + myDate.getMinutes() + myDate.getSeconds(); //文件名称
                var areaRes = document.getElementById("showPage"); //指定要输入区域
                //新建word对象
                var wordObj = new ActiveXObject("Word.Application"); //指定输出类型
                var docObj = wordObj.Documents.Add("", 0, 1);
                var oRange = docObj.Range(0, 1);
                var sel = document.body.createTextRange();
                sel.moveToElementText(areaRes);
                sel.select();
                sel.execCommand("Copy");
                oRange.Paste();
                wordObj.Application.Visible = true;
                docObj.saveAs("D://" + fileName + ".doc") //导出文件到指定文件夹
            }
            catch (e) {
                alert("保存失败,请刷新本页面又一次尝试!");
            }
            finally {
                window.location.reload();
            }
        }


   这种方法须要浏览器创建Activex,须要勾选未知签名的Activex控件。可是这样会减少浏览器的安全性,所以总是在打开浏览器时出现这样提示用户还原默认安全设置的提示。假设不是非常了解,还原后还是不能创建ActiveXObject对象就无法创建word的对象;所以这种方法有非常大的局限性。

 

2.利用.NET com组件

     功能:将数据库内的字段导出生成导入英语口语成绩的模板

     

  查询指定数据库字段

 

/// <summary>
        /// 查询数据库表字段
        /// </summary>
        /// <param name="tablename">数据库表名</param>
        /// <returns></returns>
        public DataSet GetTableName(string tablename) {

            //查询数据库表字段sql语句
            StringBuilder str = new StringBuilder("SELECT name FROM syscolumns WHERE (id = (SELECT id FROM sysobjects WHERE name = '"+tablename+"'))");

            //返回表名
            DataSet ds = DBUtility.DbHelperSQL.Query(str.ToString());

            return ds;
        }

   

   核心代码:SELECT name FROM syscolumns WHERE (id = (SELECT id FROM sysobjects WHERE name = tablename)


   这里还有非常多有趣的sql语句,之前没有接触过的。像什么查询出该整个server全部的数据库名称等。

   有兴趣见:http://www.cnblogs.com/eter/archive/2011/08/15/2139063.html

   

   导入到excel

  

/// <summary>
        /// 下载导入成绩的模板
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void DownLoadTemplate(object sender, EventArgs e)
        {
            //找到数据库字段
            QuerySpokenEnglishScoreBLL spokenEnglishScorebll = new QuerySpokenEnglishScoreBLL();
            string strTablename = "T_SpokenScores";
            DataSet ds = spokenEnglishScorebll.QueryTableName(strTablename);
            ArrayList tablename = new ArrayList();

            tablename.Add("学号");
            tablename.Add("分值");
            //for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
            //{
            //    tablename.Add(ds.Tables[0].Rows[i][0]);
            //}

            //将数据库字段写入excel
            //创建excel对象
            Excel.Application excel = new Excel.Application();
            //创建Microsoft Excel 工作簿
            Excel.Workbook Nowbook;
            //推断server未安装Excel应用程序
            if (excel == null)
            {
                throw new Exception("server未安装Excel应用程序,此功能无法使用");
            }

            //新建工作薄赋值给Nowbook
            Nowbook = excel.Workbooks.Add();

            int lengthTableName = 3;
            for (int i = 1; i < lengthTableName; i++)
            {
                Nowbook.Sheets[1].Cells[1, i] = tablename[i - 1];
            }


            //保存在server中指定的物理路径文件
            string strpath = Server.MapPath("~/UploadFile/DownFile") + "/" + "导入口语成绩模板" + ".xls";
            //指定目录存放,事实上是复制一份源文件
            Nowbook.SaveCopyAs(strpath);



            Nowbook.Close(SaveChanges: false);
            Nowbook = null;
            excel.Quit();
            excel = null;


            //直接转向文件路径,直接打开
            Response.Redirect("../../UploadFile/DownFile/" + "导入口语成绩模板.xls");
        }


     当中在測试过程中,遇到一些的问题也是比較有意思的。

 

     问题一:

 

     读取Excel文件时出现错误“HRESULT中的异常:0X800A03EC”。

              查阅MSDN,微软的同志们是这样跟我说的。就是我每次添?到工作薄中的单元格的内容太多,太长导致的。我试了试,由于我之前用的中文最后发现不是这个问题。而是我的循环里面从0開始的。Nowbook.Sheets[1].Cells[1, i],这样导致根本就无法创建这个单元格就更别谈什么插入内容了。所以这样看来,微软的大牛把我给忽悠了一番啊!哈哈

 

     问题二:

 

           

 

            看到这个我首先想打的是可能会不会是权限的问题,我非常快否定这个。由于依据代码,我已经创建了这个xls文件。最后发现我的文件不是放在了指定的我訪问的文件路径,这样就对了。所以我这个用server的路径这样就能够存在指定的物理路径了。

 

           默认情况下:使用Nowbook.saveas保存是在我的文档目录下的。

 

                              

 

           使用server地址

 

            //保存在server中指定的物理路径文件
            string strpath = Server.MapPath("~/UploadFile/DownFile") + "/" + "导入口语成绩模板" + ".xls";
            //指定目录存放,事实上是复制一份源文件
            Nowbook.SaveCopyAs(strpath);

            就能够了。

      总结

             事实上对于后种方式也是有缺陷的,在打开的时候总是会提示我们是否要打开文件格式好扩展名不匹配的文件。这种方法,主要是对于excel这么一个非托管的类来实现的。在以下的链接里面有其它的方法,大家有兴趣的能够研究研究。

         

来自百度文库:  


    MSDN: 怎样使用 Visual C# 2005 或 Visual C# .NET 向 Excel 工作簿数据传输
          http://support.microsoft.com/kb/306023/zh-cn


    怎样:使用 COM Interop 创建 Excel 电子表格(C# 编程指南)
         http://msdn.microsoft.com/zh-cn/library/ms173186(VS.80).aspx


    怎样在 Microsoft Visual C# .NET 中实现 Microsoft Excel 自己主动化
         http://support.microsoft.com/kb/302084/zh-cn

    C#中创建、打开、读取、写入、保存Excel的一般性代码
         http://hi.baidu.com/zhaochenbo/blog/item/f6d70ff7bf32fa2a730eec39.html


   与 XML 一起使用 Visual Basic 和 ASP 生成 Excel 2003 工作簿
       http://msdn.microsoft.com/zh-cn/library/aa203722(office.11).aspx

.Net之路(十三)数据库导出到EXCEL