.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个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...
随机推荐
- 挑战树莓派:谁才是Geek最爱的开发板?
树莓派(Raspberry Pi)是一块跟信用卡差不多大小的开发板,它的初衷是以低廉的硬件和开源软件扶持一些落后地区的电脑科学教育.由于它在性能和价格方面有一个很好的平衡点,所以很多硬件玩家也想买一个 ...
- [转]windows下srand48()和drand48()的问题
转自:windows下srand48()和drand48()的问题 #ifndef DRAND48_H #define DRAND48_H #include <stdlib.h> #def ...
- 关于UIImage类的对象两种初始化方法的区别
1.imageNamed: UIImage *image = [UIImage imageNamed:"]; UIImage的类方法 第一次读取图片的时候,先把这个图片放到缓存中,下次再使用 ...
- HDU2177:取(2堆)石子游戏(威佐夫博弈)
Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同 ...
- Linux安装JDK详细步骤
Linux安装JDK步骤 1.先从网上下载jdk(jdk-7u1-linux-i586.rpm),下载地址:http://www.oracle.com/technetwork/java/javase/ ...
- iOS调用系统通讯录获取姓名电话号码(转)
原文地址:http://blog.csdn.net/idoshi201109/article/details/46007125 OS调用系统通讯录获取姓名电话号码 (iOS 8.0 Xcode6.3可 ...
- 【IOS界面布局】横竖屏切换和控件自适应(推荐)
[IOS界面布局]横竖屏切换和控件自适应(推荐) 分类: [MAC/IOS下开发]2013-11-06 15:14 8798人阅读 评论(0) 收藏 举报 横竖屏切换 自适应 第一种:通过人为的办法改 ...
- ORACLE 毫秒与日期的相互转换
毫秒转换为日期 SELECT TO_CHAR(1406538765000 / (1000 * 60 * 60 * 24) + TO_DATE('1970-01-01 08:00:00', 'YYYY- ...
- ios开发——笔记篇
:开关 BOOL isopen = !isopen; //View @property (nonatomic, assign) BOOL open;//模型属性 self.group.open = ! ...
- CSDN上下载的一些关于Android程序调用Webservice执行不成功的问题
今天从书上和CSDN上找了几个关于android调用webservice的样例,这些样例从代码来看.没不论什么错误,可是就是执行不成功.分析了android调用web接口的写法,发现这些样例在调用的时 ...