.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

时间: 2024-07-30 20:28:35

.Net之路(十三)数据库导出到EXCEL的相关文章

php将数据库导出成excel的方法

<?php $fname = $_FILES['MyFile']['name']; $do = copy($_FILES['MyFile']['tmp_name'],$fname); if ($do) { echo"导入数据成功<br>"; } else { echo ""; } ?> <form ENCTYPE="multipart/form-data" ACTION="<?php echo&quo

C#将数据库导出成Excel,再从Excel导入到数据库中。

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using System.IO; namespace CindyDatabaseProcess { class Program { static void Main(string[] args) { System.Data.DataTable dt1 = null; S

binbinyang博客----关于Android数据库导出到Excel

版权声明:本文为博主原创文章,未经博主允许不得转载. 可能很多做JAVAWEB 或是C#的工程师.在项目尤其是OA项目中,会用到POI...也就是excel的导入导出...刚好今天在研究安卓APP中,把数据填入到EditText中,然后自动保存数据到excel里面---------------用到了Sqlite及导出到Excel文件 1.首先里面要导入一个包.叫做JXL <span style="font-size:18px;">Jxl使用总结 Jxl是一个开源的Java

【Java EE 学习第17天】【数据库导出到Excel】【多条件查询方法】

一.导出到Excel 1.使用DatabaseMetaData分析数据库的数据结构和相关信息. (1)测试得到所有数据库名: private static DataSource ds=DataSourceUtils_C3P0.getDataSource(); Connection conn=ds.getConnection(); DatabaseMetaData dbmd=conn.getMetaData(); ResultSet rs=dbmd.getCatalogs(); while(rs.

JavaWeb中将数据从数据库导出到Excel表的实例

首先声明此博客基于 http://blog.csdn.net/evangel_z/article/details/7332535 https://github.com/T5750/poi(原著博客中介绍的程序源码) 这个博客里面开发的项目,使用POI导出Excel,经过修改支持文件弹窗选择,在使用中包括以下几步. 1.添加jar包 在刚才的github的项目里可以下载到. 2.添加ExportExcel类 package com.sx2.utils; import java.io.IOExcep

数据库导出到excel

项目结构同上一篇 泛型通用的写法 ExportExcel.java package excel; import java.io.OutputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.apache.poi.hssf

.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

Asp.net--GridView控件--(1)高亮显示当前所在行,(2)高亮显示单击行,(3)绑定数据库数据,(4)分页,(5)导出到excel表格,(6)首列插入序号

//本页代码中的DB类及方法在http://www.cnblogs.com/Deerjiadelu/p/7252769.html中能查询到 (1)Asp.net--GridView控件--高亮显示当前所在行 protected void gvquery_DataBound(object sender, GridViewRowEventArgs e) { //高亮显示光标所在行 if (e.Row.RowType == DataControlRowType.DataRow)//判断当前行是不是数据

使用pentaho工具将数据库数据导入导出为Excel

写在前面:本篇博客讲述的是如何使用pentaho工具快速的将数据库数据导出为Excel文件,以及如何将Excel文件数据导入数据库. 补充:使用此工具并不需要任何一句代码并能快速便捷解决实际问题,此工具功能不仅仅局限这一点,其他功能后续更新. 工具下载:你可以根据你电脑的系统选择不同版本在pentaho官网进行下载: http://www.pentaho.com/download 需求一:将mysql一张表数据导出到Excel 第一步:添加数据库驱动包 注意:由于本例我要将mysql数据库数据导