.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的更多相关文章
- php将数据库导出成excel的方法
<?php $fname = $_FILES['MyFile']['name']; $do = copy($_FILES['MyFile']['tmp_name'],$fname); if ($ ...
- 【Java EE 学习 17 下】【数据库导出到Excel】【多条件查询方法】
一.导出到Excel 1.使用DatabaseMetaData分析数据库的数据结构和相关信息. (1)测试得到所有数据库名: private static DataSource ds=DataSour ...
- ThinkPHP中,运用PHPExcel,将数据库导出到Excel中
1.将PHPExcel插件放在项目中,本人位置是ThinkPHP文件夹下,目录结构如下/ThinkPHP/Library//Vendor/...2.直接根据模型,配置三个变量即可使用./** * Ex ...
- 数据库导出到excel
项目结构同上一篇 泛型通用的写法 ExportExcel.java package excel; import java.io.OutputStream; import java.lang.refle ...
- 从数据库导出到excel
在项目 扬中 News shenbaocreateall //选中的id string cc = Request["IDcheck"]; Response.C ...
- .Net路(十三)导出数据库到EXCEL
.NET出口Office文件(word,excel)有两种方法我明白.一个存储在导出的文件中server录以下.利用response输出到浏览器地址栏,直接打开:还有直接利用javascript来导出 ...
- 如何使用NPOI 导出到excel和导入excel到数据库
近期一直在做如何将数据库的数据导出到excel和导入excel到数据库. 首先进入官网进行下载NPOI插件(http://npoi.codeplex.com/). 我用的NPOI1.2.5稳定版. 使 ...
- 数据库多张表导出到excel
数据库多张表导出到excel public static void export() throws Exception{ //声明需要导出的数据库 String dbName = "hdcl ...
- java 对excel操作 读取、写入、修改数据;导出数据库数据到excel
============前提加入jar包jxl.jar========================= // 从数据库导出数据到excel public List<Xskh> outPu ...
随机推荐
- 替换Avada主题的Google字体
刚玩WP的时候图省事,在themeforest买了排行第一的主题Avada,虽然强大,但对我目前的Blog应用而言实在太'重'了.而且老外的主题很多方面不接地气,比如谷歌字体.本文指导各位如何在Ava ...
- JS图表组件 highcharts 简单的介绍
把highcharts拿来做个简单的介绍,希望更多的朋友可以用到这个用来做图表的js插件. preparation Highcharts Highcharts是一个制作图表的纯Javascript类库 ...
- 深入理解C/C++数组和指针
C语言中数组和指针是一种很特别的关系,首先本质上肯定是不同的,本文从各个角度论述数组和指针. 一.数组与指针的关系数组和指针是两种不同的类型,数组具有确定数量的元素,而指针只是一个标量值.数组可以在某 ...
- Problem A: 走迷宫问题
Problem A: 走迷宫问题Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 9 Solved: 3[Submit][Status][Web Board] ...
- UVa 10806 Dijkstra,Dijkstra(最小费用最大流)
裸的费用流.往返就相当于从起点走两条路到终点. 按题意建图,将距离设为费用,流量设为1.然后增加2个点,一个连向节点1,流量=2,费用=0;结点n连一条同样的弧,然后求解最小费用最大流.当且仅当最大流 ...
- C++内联函数、函数模板之于头文件
一.基本说明 C++标准中提到,一个编译单元是指一个.cpp文件以及它所include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件 ...
- Hadoop学习笔记(3)hadoop伪分布模式安装
为了学习这部分的功能,我们这里的linux都是使用root用户登录的.所以每个命令的前面都有一个#符号. 伪分布模式安装步骤: 关闭防火墙 修改ip地址 修改hostname 设置ssh自动登录 安装 ...
- SqlHelp
using System.Configuration;using System.Data; public class SqlHelp { private static string connectio ...
- cpu卡,sam卡原理
第一部分 CPU基础知识一.为什么用CPU卡IC卡从接口方式上分,可以分为接触式IC卡.非接触式IC卡及复合卡.从器件技术上分,可分为非加密存储卡.加密存储卡及CPU卡.非加密卡没有安全性,可以任意改 ...
- 什么是PCB改板及PCB改板应注意的问题
PCB改板是指在保持原有功能一致的前提下,对原有产品设计及电路板布局走线设计的基础上进行整改设计,调整板上器件布局与线路走向,实现电子产品重新设计研发,同时又可以规避知识产权等纠纷,加快新产品研发速度 ...