.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的更多相关文章

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

    <?php $fname = $_FILES['MyFile']['name']; $do = copy($_FILES['MyFile']['tmp_name'],$fname); if ($ ...

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

    一.导出到Excel 1.使用DatabaseMetaData分析数据库的数据结构和相关信息. (1)测试得到所有数据库名: private static DataSource ds=DataSour ...

  3. ThinkPHP中,运用PHPExcel,将数据库导出到Excel中

    1.将PHPExcel插件放在项目中,本人位置是ThinkPHP文件夹下,目录结构如下/ThinkPHP/Library//Vendor/...2.直接根据模型,配置三个变量即可使用./** * Ex ...

  4. 数据库导出到excel

    项目结构同上一篇 泛型通用的写法 ExportExcel.java package excel; import java.io.OutputStream; import java.lang.refle ...

  5. 从数据库导出到excel

    在项目 扬中 News shenbaocreateall //选中的id string cc = Request["IDcheck"];            Response.C ...

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

    .NET出口Office文件(word,excel)有两种方法我明白.一个存储在导出的文件中server录以下.利用response输出到浏览器地址栏,直接打开:还有直接利用javascript来导出 ...

  7. 如何使用NPOI 导出到excel和导入excel到数据库

    近期一直在做如何将数据库的数据导出到excel和导入excel到数据库. 首先进入官网进行下载NPOI插件(http://npoi.codeplex.com/). 我用的NPOI1.2.5稳定版. 使 ...

  8. 数据库多张表导出到excel

    数据库多张表导出到excel public static void export() throws Exception{ //声明需要导出的数据库 String dbName = "hdcl ...

  9. java 对excel操作 读取、写入、修改数据;导出数据库数据到excel

    ============前提加入jar包jxl.jar========================= // 从数据库导出数据到excel public List<Xskh> outPu ...

随机推荐

  1. 最大值减去最小值小于或等于num的子数组数量

    [说明]: 本文是左程云老师所著的<程序员面试代码指南>第一章中“最大值减去最小值小于或等于num的子数组数量”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路, ...

  2. 虚拟机ping不通主机

    centos ping不通主机 首先检查网络设备 ifconfig -a 如果有eth0 , 又存在 eth1 . 那么service eth1 stop  然后在ping主机.(以上前提是网络地址设 ...

  3. cocos2d-x教程1 hello world

    HelloworldScene.h #ifndef __HELLOWORLD_SCENE_H__ #define __HELLOWORLD_SCENE_H__ #include "cocos ...

  4. python之math模块

    1.math简介 >>>import math #导入math模块 >>>dir(math) #这句可查看所有函数名列表 >>>help(math ...

  5. windows server 2008/2012 无法安装AD域解决方法记录

    安装活动目录之前需要一些准备工作和前提条件的. 有管理员的权限 至少有一个足够大的NTFS文件系统的分区或动态卷 需要DNS服务配合,因此需要安装DNS服务 最好使用dcpromo命令来进行安装 最终 ...

  6. multi-threaded copy command - robocopy

    we can copy files by the powerful robocopy tool, and it allow copy using muliti-threaded as well. As ...

  7. ASP.NET jQuery 随笔 使用jQuery UI的Autocomplete方法实现文本框的自动搜索填充功能

    首先当然是去下载JQuery UI ,这里这里是下载地址http://jqueryui.com/ 第一步是点击这里 第二步选择你想要下载的主题进行下载 我这里是选择的cupertino主题包 点击圆圈 ...

  8. poj1061

    构造方程 (x + m * s) - (y + n * s) = k * l(k = 0, 1, 2,...) 变形为 (n-m) * s + k * l = x - y.即转化为模板题,a * x ...

  9. linux64位系统中g++4.4.7下使用wcsncpy函数有造成段错误的BUG(其它g++版本号未知)

    一.描写叙述 眼下已经linux64位系统中g++4.4.7下发现了该bug.其它的版本号还未測试. 经測试,假设传入wcsncpy函数第一个參数(即目标缓冲区)的地址不能被4整除的话就必然会发生段错 ...

  10. Mac OS使用技巧之十五:快捷方便的Mini Dock

    Mini Dock是前面忘记了提,这里做一些补充.       Mini Dock是Mac OSX的一个值得大书特书的亮点.尽管windows下也有类似的东西,但Mac下却提供了更为全面的功能.通过M ...