.NET通过调用Office组件导出Word文档
.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文档的更多相关文章
- 使用Spire.Doc组件利用模板导出Word文档
以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作, ...
- C#导出Word文档开源组件DocX
1.帮助文档,这东西找了很久,而且它版本很旧,还是英文,W8.1系统上打不开 http://download.csdn.net/detail/zuofangyouyuan/7673573 2.开源网址 ...
- Java 用Freemarker完美导出word文档(带图片)
Java 用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...
- freemarker导出word文档
使用freemarker导出word文档的过程 **************************************************************************** ...
- PHP网页导出Word文档的方法分离
今天要探讨的是PHP网页导出Word文档的方法,使用其他语言的朋友也可以参考,因为原理是差不多的. 原理 一般,有2种方法可以导出doc文档,一种是使用com,并且作为php的一个扩展库安装到服务器上 ...
- c#导出word文档
为方便下次遇到不知道去哪找先把它存放在这里,以下是保存导出word主要类方法 public class BiultReportForm { /// <summary>word 应用对象 & ...
- 【Java】用Freemarker完美导出word文档(带图片)
Java 用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...
- C# 导出word文档及批量导出word文档(4)
接下来是批量导出word文档和批量打印word文件,批量导出word文档和批量打印word文件的思路差不多,只是批量打印不用打包压缩文件,而是把所有文件合成一个word,然后通过js来调用 ...
- freemarker导出word文档——WordXML格式解析
前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...
随机推荐
- POJ3922 A simple stone game
网上有很多解题报告,我的理解就是可以用类似数学归纳的方法证明,就是取一个数,让对手进入必败态. 详细见论文.
- HDU4862-Jump(最大流量最大费用流)
题意:有n*m的格子,每一个格子包含一个数字,0-9.你初始的能量为0,你可以玩k次,每一个你可以选择你现在的格子的正下方或者正右方的任意一个格子跳,但必须是之前没有跳过的格子.每玩一次你都可以跳任意 ...
- hdoj 2051 Bitset
Bitset Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- jquery完成带复选框的表格行高亮显示
jquery完成带复选框的表格行高亮显示 通过jquery技术来操作表格是件简单的事,通过jquery的语法,可以很轻松的完成表格的隔行换色,悬浮高亮,在实际的应用中可能会出现表格中带复选框的,删除时 ...
- Lambda表达式的由来
1.lambada表达式的本质:一个匿名方法,或说是匿名委托.从C#3.0开始支持,C#2.0只支持匿名方法语法很简单 : (输入参数)=>expr //当参数为一个是可以省略括号.lamb ...
- 表单,css
- MSSQLSERVER数据库- 慎用SELECT INTO复制表
很多时候我们习惯于用SELECT INTO复制一个表或表结构,因为它方便,快捷,而且在某些情况下效率比INSERT INTO 效率要高一些.但是要注意: SELECT INTO 复制表或表结构的时候, ...
- SQLite使用教程11 表达式
SQLite 表达式 表达式是一个或多个值.运算符和计算值的SQL函数的组合. SQL 表达式与公式类似,都写在查询语言中.您还可以使用特定的数据集来查询数据库. 语法 假设 SELECT 语句的基本 ...
- 本地或者是koala软件编译less文件为css
背景: 事情的起因是这般的,平时工作是在线上办公,样式是使用less来写,于是乎,这样我从线上download下来的less文件无法直接在自己的本地环境运行.有一个问题就是我要把less文件先编译成c ...
- javasctipt显示几分钟前、几天前等
jsp页面: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...