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

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

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

实现思路如下:

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

#region 根据申请单ID号和模板生成word下载文件(书签的形式)
    public void DownLoadWordOld(string id)
    {
        if (string.IsNullOrEmpty(id))
        {
            id = "0";
        }
        string sql = "SELECT ID,ProposerName,PhoneNo,ProposerAddress,HouseArea,HouseType,HouseNature,ApplyDate" +
                   " from BettingStationApply where [email protected] ";
        SqlParameter[] parm = new SqlParameter[] { new SqlParameter("@id", int.Parse(id)) };
        //根据ID号取得当前申请单的详细信息
        DataTable dt = DBHelper.GetDataSet(sql, parm);
        if (dt.Rows.Count > 0)
        {
            DataRow dr = dt.Rows[0];

            //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账户),并按照如下图所示授予相关权限:

,

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

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

时间: 2024-12-25 15:24:33

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

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

以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作,有NPOI,Spire等第三方组件.开始考虑的是NPOI,毕竟它在操作Excel方面还是很强大的:但是不知道是它本身没有,还是我没找到,无法实现利用Word模板的标签插入内容,纯靠代码去生成Word文档,排版是个大问题.最终找到了Spire.Doc组件,轻松实现! Spire的官网地址:https:

C#,WPF使用word模板导出word文档

使用word模板导出word文档,首先需要在word模板中插入书签: 根据创建的书签名和位置,将需要写入的内容插入到word文件中. 需要引用  Microsoft.Office.Interop.Word;在添加引用-程序集中搜索可以找到. using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Windows; usin

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

Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. 准备材料 1.word原件 2.编辑器(推荐Firstobject free XML editor) 实现步骤 1.用Microsoft Office Word打开word原件: 2.把需要动态修改的内容替换成***,如果有图片,尽量选择较小的图片几十K左右,并调整好位置: 3.另存为,选择保存类型

java导出word文档

使用freemarker模板导出word文档,用的比较多.这里也是采用的这种方式. 1  编辑一个word文件的模板,用于在程序中需要读入填充在模板中的数据先用字母代替,注意word版本为word2003或高于这个版本: 如:test.doc 2 把模板另存为xml文件: 如:test.xml 3 在xml中查找之前用字母代替的值 加上${} ,如${test}  ${guojia},把文件名改为test.ftl; 4 在项目的WebContent目录下新建一个文件夹,把test.xml放进去:

通过NPOI导出Word文档

1 XWPFDocument doc = new XWPFDocument(); 2 XWPFParagraph p0 = doc.CreateParagraph(); 3 p0.Alignment = ParagraphAlignment.LEFT; 4 5 XWPFRun r0 = p0.CreateRun(); 6 r0.FontFamily = "宋体"; 7 r0.FontSize = 18; 8 r0.IsBold = true; 9 r0.SetText("未登

C# 导出word文档及批量导出word文档(1)

这里用到了两个dll,一个是aspose.word.dll,另外一个是ICSharpCode.SharpZipLib.dll,ICSharpCode.SharpZipLib.dll是用于批量导出word文档的,通过把文件打包成压缩包,以文件流的方式输出下载.aspose.word.dll最好使用最新版的,14.5或者更高,我使用的是14.5版本,页面是采用mvc的语法.在这里感谢赵某人为我提供的帮助.         首先制作好word模板,使用模板可以避免在代码中对word进行排版,方便简单.

自动生成并导出word文档

今天很荣幸又破解一现实难题:自动生成并导出word文档 先看页面效果: word效果: 代码: 先搭建struts2项目 创建action,并在struts.xml完成注册 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"

JAVA原始的导出excel文件,快捷通用 方便 还可以导出word文档哦

现在导出excel基本上都是用poi了,当报表格式很负责的时候 开发难度会加大 如果报表有格式有变化 那就更复杂了,先发现一个很老的技术,可以解决格式复杂的报表. 实例代码如下: <%@ page contentType="application/vnd.ms-excel;charset=GBK" %> <%@page import="java.net.URLEncoder"%> <% String filedisplay = &quo

使用PHP导出Word文档的原理和实例

原理  一般,有2种方法可以导出doc文档,一种是使用com,并且作为php的一个扩展库安装到服务器上,然后创建一个com,调用它的方法.安装过office的服务器可以调用一个叫word.application的com,可以生成word文档,不过这种方式我不推荐,因为执行效率比较低(我测试了一下,在执行代码的时候,服务器会真的去打开一个word客户端).理想的com应该是没有界面的,在后台进行数据转换,这样效果会比较好,但是这些扩展一般需要收费. 第2种方法,就是用PHP将我们的doc文档内容直