.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],这样导致根本就无法创建这个单元格就更别谈什么插入内容了。所以这样看来,微软的大牛把我给忽悠了一番啊!哈哈

 

     问题二:

 

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

 

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

 

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

 

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

 

           使用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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/118452.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Java之Lambda表达式详解

    Java之Lambda表达式详解Lambda表达式,也可称为闭包,它是推动Java8发布的最重要新特性。Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用Lambda表达式可以使代码变的更加简洁紧凑。一、lambda表达式的语法格式如下:标准格式:(形式参数)->{代码块}Lambda表达式的代码分析●():里面没有内容,可以看成是方法形式参数为空●->:用箭头指向后面要做的事情●{}:包含一段代码,我们称之为代码块,可以看成是方法体中的内容实例.

  • 【Java基础知识 1】Java入门级概述

    【Java基础知识 1】Java入门级概述1991年成立了一个称为Green的项目小组,帕特里克、詹姆斯·高斯林、麦克·舍林丹和其他几个工程师一起组成的工作小组在加利福尼亚州门洛帕克市沙丘路的一个小工作室里面研究开发新技术,专攻计算机在家电产品上的嵌入式应用。由于C++所具有的优势,该项目组的研究人员首先考虑采用C++来编写程序。但对于硬件资源极其匮乏的单片式系统来说,C++程序过于复杂和庞大。为了解决困难,他们首先着眼于语言的开发,对于新语言的设计,Sun公司研发人员并没有开发一种全新的语言,而是根据嵌入式软件的要求,对C++进行了…

  • 0-1多重背包(单调队列+多重背包)[通俗易懂]

    0-1多重背包(单调队列+多重背包)[通俗易懂]原题链接有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V (0<N≤1000, 0<V≤20000),用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表示最大价值。数据范围0<N≤1

  • 来自IT公司速查手册的各大IT公司薪资和待遇内幕

    来自IT公司速查手册的各大IT公司薪资和待遇内幕来自IT公司速查手册的各大IT公司薪资和待遇内幕

  • 5G信道建模

    5G信道建模5G毫米波一般认为毫米波波段的信道具有稀疏性,即径数远小于天线数,因此直接在角度域上通过估计各条径的AoD/AoA和增益系数做信道估计,比起在天线域上做信道估计更简单。但这么做还隐含了每条可分辨径的角度扩展很小这样的假设,在mmWavemMIMO系统中,信道估计等同于估计AoA和AoD以及每条path的散射系数,就是毫米波波段的情况。而在低频NLoS情况下,由于散射传播路径非常丰富,信道不存在稀疏性,也没有一个清晰的几何结构,因此一般建模为随机的比如Rayleigh信道。对于这种信道我们就对其整体进行估

  • Numeric Keypad

    Numeric Keypad题目描述Thenumberickeypadonyourmobilephonelookslikebelow:123456789 0 supposeyouareholdingyourmobilephonewithsinglehand.Yourthumbpointsatdigit1.Eachtimeyoucan1)press

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号