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

哈哈

问题二:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbmZhbmdsaW5jZmw=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="529" height="107" >

看到这个我首先想打的是可能会不会是权限的问题,我非常快否定这个。由于依据代码,我已经创建了这个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-11-14 10:22:06

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

Android实现导出数据库到Excel表格

之前一直在电脑上用Excel表格记录家庭帐单,不久前重装系统不小心干掉了,伤心了好久,那可是我记了五年的帐单呀!这段时间用的是随手记,好用但是不太符合我的习惯,所以我自己写了一个小小的帐单记录APP,App小到只有一个Activity.当然更多的需求我正在研发中,呵呵!现在已经完成了把每天记录的数据保存到Sqilte数据库中,然后可以导出到excel表格.代码也是借助网上的一些资料写成的,代码也比较容易,只需要用到一个jxl.jar包,感谢网友的帮助. 贴上主要代码,再附上文件包: public

Extjs4.0+HSSFWorkbook+SpringMVC实现将数据库中的记录导出到本地Excel格式

Extjs4.0+HSSFWorkbook+SpringMVC实现将数据库中的记录导出到本地Excel格式 自己封装的JS类Share.js var Share = {}; Share.ExportByExcel = function(url) { var appWindow = Share.getWin(); appWindow.open(url); appWindow.focus(); }; 调用的前端js buttons : [{ text : '查询', handler : queryS

excel数据导入导出数据库

第一种方法: 先把Excel另存为.csv格式文件,如test.csv,再编写一个insert.ctl 用sqlldr进行导入! insert.ctl内容如下: load data          --1.控制文件标识 infile ‘my.csv‘          --2.要输入的数据文件名为my.csv append into table "tbl_test"   --3.向表table_name中追加记录 fields terminated by ‘,‘          

java导出数据库里的数据至Excel进行数据备份

调用部分: package com.otdrmsys.action; import com.otdrmsys.util.ResultSetToExcel; public class ExcelExport { public static void main(String[] args) { // String fileName = "otdr";//文件名,不带路径,不带.xls后缀 // String [] coloumItems = {"otdr编号",&quo

导出数据库任意表数据为EXCEL

public class ExportAsExcel { final Logger logger = LoggerFactory.getLogger(getClass()); static SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 公共组件,导出Excel表格数据方法<p> * 使用方法: 数据为List<Object>类型,注意当中object的

Excel向数据库插入数据和数据库向Excel导出数据

为了熟悉java里工作簿的相关知识点,所以找了"Excel向数据库插入数据和数据库向Excel导出数据"的功能来实现. 注意事项:1,mysql数据库: 2,需要导入的jar包有 jxl.jar,mysql-connector-java-5.1.22-bin.jar,ojdbc6.jar 代码如下: 一, 建立数据库名称 javaforexcel,建立表stu DROP TABLE IF EXISTS `stu`;CREATE TABLE `stu` (  `id` int(11) N

PHP慢慢长路之问题与解决方法(2)——用navicat导出数据库出错问题解决

[错误过程]:导出数据库时报出"Cannot load from mysql.proc. The table is probably corrupted." [造成原因]:MySQL升级完成后未对相关数据库执行升级. [解决办法]:在命令行中执行mysql_upgrade -uroot -p 即可~

导出数据库数据制成Excel和txt

引用ICSharpCode.SharpZipLib.dll 1.编写压缩和解压代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ICShaepCode.SharpZipLib; using ICShaepCode.SharpZipLib.Zip; using ICShaepCode.SharpZip

sqlserver 导出数据到Excel

1.导出非正式Excel EXEC master..xp_cmdshell 'bcp t.dbo.tcad out D:\MySelf\output\Temp.xls -c -q -S"." -U"sa" -P"sql2008"'--参数:S 是SQL服务器名:U是用户:P是密码 2.启用/停用xp_cmdshell -- To allow advanced options to be changed. EXEC sp_configure 'sh