.NET通过调用Office组件导出Word文档

  最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word模板中,再反馈给客户端下载。

实现思路如下:

利用微软提供的Office的组件来完成,在服务器端指定目录放置一个word模板(该模板中需要替换的数据信息用书签标记好),当请求过来的时候,读取模板信息并将书签内容替换成从数据库获得的信息在返回给客户端下载即可,代码如下:

#region 根据申请单ID号和模板生成word下载文件(书签的形式)
public void DownLoadWordOld(string id)
{
if (string.IsNullOrEmpty(id))
{
id = "";
}
string sql = "SELECT ID,ProposerName,PhoneNo,ProposerAddress,HouseArea,HouseType,HouseNature,ApplyDate" +
" from BettingStationApply where ID=@id ";
SqlParameter[] parm = new SqlParameter[] { new SqlParameter("@id", int.Parse(id)) };
//根据ID号取得当前申请单的详细信息
DataTable dt = DBHelper.GetDataSet(sql, parm);
if (dt.Rows.Count > )
{
DataRow dr = dt.Rows[]; //1、先创建一个创建word的Application
Word.Application wordApp = new Word.ApplicationClass();
//2、创建一个word文档
Word.Document docFile = null;
try
{
wordApp.Visible = false;
//模板对象
object objTemplete = Server.MapPath(@"/BettingStation/templete.docx");
object objTrue = true;
object objFalse = false;
object objDocType = Word.WdDocumentType.wdTypeDocument;
//实例化word文档(已经读取到模板的word文档)
docFile = wordApp.Documents.Add(ref objTemplete, ref objFalse, ref objDocType, ref objTrue); //定义书签变量
object ProposerName = "ProposerName";
object PhoneNo = "PhoneNo";
object ProposerAddress = "ProposerAddress";
object HouseArea = "HouseArea";
object HouseType = "HouseType";
object HouseNature = "HouseNature";
object ApplyDate = "ApplyDate";
//获取所有的书签
Word.Bookmarks books = docFile.Bookmarks;
//给书签赋值
if (books.Exists("ProposerName"))
{
books.get_Item(ref ProposerName).Range.Text = dr["ProposerName"].ToString();
}
if (books.Exists("PhoneNo"))
{
books.get_Item(ref PhoneNo).Range.Text = dr["PhoneNo"].ToString();
}
if (books.Exists("ProposerAddress"))
{
books.get_Item(ref ProposerAddress).Range.Text = dr["ProposerAddress"].ToString();
}
if (books.Exists("HouseArea"))
{
books.get_Item(ref HouseArea).Range.Text = dr["HouseArea"].ToString();
}
if (books.Exists("HouseType"))
{
books.get_Item(ref HouseType).Range.Text = dr["HouseType"].ToString();
}
if (books.Exists("HouseNature"))
{
books.get_Item(ref HouseNature).Range.Text = dr["HouseNature"].ToString();
}
if (books.Exists("ApplyDate"))
{
if (dr["ApplyDate"] != DBNull.Value)
{
books.get_Item(ref ApplyDate).Range.Text = Convert.ToDateTime(dr["ApplyDate"].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
}
} object fileName = Server.MapPath(@"/BettingStation/投注站申请表.docx"); object nothing = Type.Missing;
//将当前文件保存到临时文件中
docFile.SaveAs2(ref fileName, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing
, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing
, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing);
//关闭当前word文档
docFile.Close(ref nothing, ref nothing, ref nothing);
//退出当前word程序的调用
wordApp.Quit(ref nothing, ref nothing, ref nothing);
docFile = null; //从服务器临时文件夹中下载文件返回给客户端
ExtWord(fileName.ToString(), dr["ProposerName"].ToString() + "_投注站申请表.docx");
//调用客户端js方法 }
catch (Exception ex)
{
writeLog.WriteErrorLog("根据模板生成Word文件出错!错误信息:" + ex.Message);
//出异常记得释放相关资源
object nothing = Type.Missing;
//关闭当前word文档
docFile.Close(ref nothing, ref nothing, ref nothing);
//退出当前word程序的调用
wordApp.Quit(ref nothing, ref nothing, ref nothing);
docFile = null;
Message.show("根据模板生成Word文件出错!错误信息:" + ex.Message);
}
}
else
{
writeLog.WriteErrorLog("id=" + id + "没有查找到任何数据!");
Message.show("id=" + id + "没有查找到任何数据!");
} }
#endregion

调用offic组件需要添加Interop.Microsoft.Office.Interop.Word.dll的引用,我电脑上装的Office2010,所以添加Microsoft Word 14.0 Object Library的引用

Word模板在服务器端生成好后,在利用Response方法将生成的word文档发送给客户端下载,代码如下:
 #region 从服务器指定路径下载Word
/// <summary>
/// 从服务器指定路径下载Word
/// </summary>
/// <param name="fileFullName">临时文件在服务器上的完整路径</param>
/// <param name="wordname">下载的Word文件名</param>
public void ExtWord(string fileFullName, string wordname)
{
//输出word
FileInfo file = new System.IO.FileInfo(fileFullName);
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Charset = "GB2312";
HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
// 添加头信息,为"文件下载/另存为"对话框指定默认文件名
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(wordname, System.Text.Encoding.UTF8));
// 添加头信息,指定文件大小,让浏览器能够显示下载进度
HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
// 指定返回的是一个不能被客户端读取的流,必须被下载
HttpContext.Current.Response.ContentType = "application/ms-word";
// 把文件流发送到客户端
HttpContext.Current.Response.WriteFile(file.FullName);
// 停止页面的执行
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
#endregion

测试,运行没问题。

  将开发环境测试OK的程序发布到正式的服务器环境后发现,不能运行,导出会出现错误。解决方法如下:

1、确保服务器上已经安装了并激活word程序(建议安装word2010);

2、当开发的通过word模板生成word程序完成后,部署在windows相关的服务器上时,如果出现以下的错误(读取word组件的Com权限问题):

3、查看错误的字面意思,应该是COM组件的配置有问题,网上查阅相关资料发现是权限的配置的问题!

4、以下步骤重点是给iis授予com组件的访问权限:

步骤一:找到导出word所用到的com组件;

(1)控制面板-》管理工具-》组件服务-》计算机-》我的电脑-》DCOM配置-》Mircosoft Word文档;

注:如果这样操作找不到Mircosoft word相关文档,不用慌,尝试以下方法:

Cmd-》mmc -32-》文件-》添加/删除管理单元-》选择组件服务-》确定-》计算机-》我的电脑-》DCOM配置-》找到Mircosoft Word 97-2003文档,按照以下的方法操作即可;

步骤二:找到word文档后,在它上面点击右键,然后点击"属性",

弹出"Microsoft word 应用程序属性"对话框,

步骤一:点击"标识"标签,选择"交互式用户"

步骤三:点击"安全"标签,在"启动和激活权限"上点击"自定义",然后点击对应的"编辑"按钮,在弹出的"安全性"对话框中填加 IIS_IUSRS账户(IIS账户),并按照如下图所示授予相关权限:

,

步骤四:依然是"安全"标签,在"访问权限"上点击"自定义",然后点击"编辑",配置的账号和方法和上一步操作一样;

六:重启网站并运行,点击下载表格按钮即成功。

.NET通过调用Office组件导出Word文档的更多相关文章

  1. 使用Spire.Doc组件利用模板导出Word文档

    以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作, ...

  2. C#导出Word文档开源组件DocX

    1.帮助文档,这东西找了很久,而且它版本很旧,还是英文,W8.1系统上打不开 http://download.csdn.net/detail/zuofangyouyuan/7673573 2.开源网址 ...

  3. Java 用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  4. freemarker导出word文档

    使用freemarker导出word文档的过程 **************************************************************************** ...

  5. PHP网页导出Word文档的方法分离

    今天要探讨的是PHP网页导出Word文档的方法,使用其他语言的朋友也可以参考,因为原理是差不多的. 原理 一般,有2种方法可以导出doc文档,一种是使用com,并且作为php的一个扩展库安装到服务器上 ...

  6. c#导出word文档

    为方便下次遇到不知道去哪找先把它存放在这里,以下是保存导出word主要类方法 public class BiultReportForm { /// <summary>word 应用对象 & ...

  7. 【Java】用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  8. C# 导出word文档及批量导出word文档(4)

          接下来是批量导出word文档和批量打印word文件,批量导出word文档和批量打印word文件的思路差不多,只是批量打印不用打包压缩文件,而是把所有文件合成一个word,然后通过js来调用 ...

  9. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

随机推荐

  1. 在iptables中添加vnc访问规则

    iptables -I INPUT -p tcp --dport 5800|5900|5801|5901 -j ACCEPT service iptales save

  2. HDU2296——Ring(AC自动机+DP)

    题意:输入N代表字符串长度,输入M代表喜欢的词语的个数,接下来是M个词语,然后是M个词语每个的价值.求字符串的最大价值.每个单词的价值就是单价*出现次数.单词可以重叠.如果不止一个答案,选择字典序最小 ...

  3. Camtasia Studio的安装步骤

    总的来说: 1.安装 2.安装之后,进行汉化. 破解方法: 1):输入注册码安装 用户名:6-Y 注册码:GCABC-CPCCE-BPMMB-XAJXP-S8F6R 2):软件汉化 安装完成后使用汉化 ...

  4. A Tour of Go Exercise: Maps

    Implement WordCount. It should return a map of the counts of each “word” in the string s. The wc.Tes ...

  5. [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)

    A.概述      在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能      1.按钮点击后,显示为“已下载”,并且不 ...

  6. HTML中noscript的用法

    noscript 元素用来定义在脚本未被执行时的替代内容(文本).此标签可被用于可识别 <script> 元素用来定义在脚本未被执行时的替代内容(文本). 标签但无法支持其中的脚本的浏览器 ...

  7. mysql之一

    MySQL or MariaDB 简介 DBMS:数据库管理系统 RDBMS:关系型数据库管理系统    总之:他们都是一个数据管理程序:大多都是CS架构,都有专门的通信协议进行数据交换 关系模型: ...

  8. MYSQL- 分页存储过程

    工作需要,用到MYSQL的分页功能,在网上找到一个不错的分页存储过程,代码整理了一下! 存储过程代码 CREATE PROCEDURE `sp_hj_splitpage`( in _pagecurre ...

  9. JNI/NDK开发指南(四)——字符串处理

    转载请注明出处:http://blog.csdn.net/xyang81/article/details/42066665 从第三章中能够看出JNI中的基本类型和Java中的基本类型都是一一相应的,接 ...

  10. DP练习(初级):ZigZag

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=1259&rd=4493 类似于求最长子串的方法.dp[0 ...