C# 利用WORD模板和标签(bookmark) 批量生成WORD
前言:
由于对C#操作WORD不熟悉,也就留下这么一篇水文,别吐糟...=_=|||
利用Microsoft.Office.Interop.Word (2003版也就11版)——因为部分客户端还是用Office2003,所以保险起见应该引入低一点的版本
我的需求很简单,从DataTable里面循环取数据批量生成Word文档,解决方案是利用Word模板.dot插入书签并保存为程序使用的模板,
用C#打开word模板修改书签的值并批量生成Word.
遇到的问题:
我的思路是打开模板,然后循环修改书签内容,每循环一次生成一个.doc,实际上遇到的问题是当第二次给书签赋值(比如bookMark.Range.Text="2013-4-24")发现是+=的操作,也就是循环第二次书签的值是"2013-4-242013-4-24",我的理解是因为模板没有关闭,所以对书签实际上是进行了两次【插入】的操作,而非我们理解的【赋值】,一个可以实现的做法是先关闭dot再打开重新进行一次赋值,但是由于耗时超长所以我毫不犹豫抛弃这种做法,平均下来几乎一秒钟才生成一个WORD,当然Win764bit效率要低一点。——因为我后来才发现生成的软件在32bit 的xp运行效率比62bit 的WIN7高不少,而我在虚拟机运行的效率竟然比32bit 的宿主xp更快,可能虚拟机只装了office2003和framework2.0的缘故,即便如此,在xp下效率还是很低。问题回到如何不关闭模板文件的情况下,循环插入生成WORD。
解决方案:
- object[] oBookMark = new object[8];
- oBookMark[0] = "Date";//省略赋值 用来记录书签名称
- Word.Range[] rng = new Word.Range[8];
- string[] bookMarkName = new string[8];
- for (int i = 0; i < 8; i++)
- {
- rng[i] = oDoc.Bookmarks.get_Item(ref oBookMark[i]).Range;//获取书签对象赋值给我们已经定义的数组用来下面循环体的插入
- bookMarkName[i] = oDoc.Bookmarks.get_Item(ref oBookMark[i]).Name;//获取书签名称好书签对象赋值给我已经定义好的rng和oBookMark
- }
- //循环体
- for (int i = dt.Rows.Count-1; i >= 0; i--)
- {
- rng[0].Text = dt.Rows[i]["日期"].ToString();//赋值多个书签0~8
- for (int j = 0; j < 8; j++)
- {
- oDoc.Bookmarks.Add(bookMarkName[j], rng[j]);//此处直接插入即可,替代了原来的书签,位置不变...囧
- //也就是说Add操作实际上并不是随意插入书签,而是替代了原有书签,这样子每次就可以重新赋值了
- }
- //这里保存oDoc 用Save方法
- }
思路获取书签对象和书签名称赋值给我们已经定义的oBook和rng,然后做一个插入的操作,而非修改文档本身的书签值
这个方法跟刚刚搜到的文章《如何利用书签向word文档读取或写入数据[C#]》提及的“由于附值以后书签自动消除,为了以后便于修改,需要把书签再自动生成一个”
似乎是一样的实现,也懒得细想,另外我还利用Selection.InsertFile方法把生成的文档合并为一个文件(由于这个方法只能附加文件而不能从doc对象中提取页面进行附加,所以又有了大量的打开Word操作,两个Word.exe在后台进行,看着也蛋疼,果不其然的使程序更加耗时间),但是一个文件多个页面还是比多个单页的文档讨人喜欢。还是欢迎吐糟吧。。=_=||||
C# 利用WORD模板和标签(bookmark) 批量生成WORD的更多相关文章
- 代码批量生成WORD的遇到的问题及解决
好久没搞工具了,最近因为处理大规模公文处理单文档,自己写了个批量处理WORD的程序:在调试过程中,主要遇到两个问题 第一个是WORD的模板 数据很多,但是WORD模板只需要一个,将数据替换WORD里标 ...
- 20170609批量生成WORD合同
Sub NextSeven_CodeFrame() Application.ScreenUpdating = False Application.DisplayAlerts = False Appli ...
- [转] 利用dockerize模板为容器内应用生成配置文件和环境变量
[FROM] https://blog.csdn.net/liucaihong123/article/details/51945413 首先试验一下dockerize的可用性: 最近一个docker容 ...
- PHP将数据库数据批量生成word文档
<?php class word{ function start(){ ob_start(); echo '<html x ...
- 根据word模板(contract_templet.tld)生成并下载word合同及根据wordHTML模板(contract_templetHTML.tld)预览合同内容
1.action String templete=ConstantsAppParams.CONTRACT_TEMPLET_DOC;//contract_templet.tldString temple ...
- FreemarkerJavaDemo【Android将表单数据生成Word文档的方案之一(基于freemarker2.3.28,只能java生成)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这个方案只能在java中运行,无法在Android项目中运行.所以此方案是:APP将表单数据发送给后台,后台通过freemarker ...
- 利用POI 技术动态替换word模板内容
项目中需要实现一个功能,动态替换给定模板里面的内容,生成word文档提供下载功能. 中间解决了问题有: 1.页眉的文档logo图片解决,刚开始的时候,HWPFDocument 对象无法读取图片对象(已 ...
- 根据指定Word模板生成Word文件
最近业务需要批量打印准考证信息 1.根据Table数据进行循环替换,每次替换的时候只替换Word中第一个Table的数据, 2.每次替换之后将Word中第一个Table数据进行复制,将复制Table和 ...
- Office Word文件批量生成软件
一.软件用途 如果Word文件模板固定,只是要素信息不同,则可以使用本软件批量生成Word文件. 软件下载地址(2020-12-6更新):https://files.cnblogs.com/files ...
随机推荐
- Javascript模块化开发-轻巧自制
Javascript模块化开发-轻巧自制 一.前言现在javascript的流行,前端的代码越来越复杂,所以我们需要软件工程的思想来开发前端.模块化是必不可少的,这样不仅能够提高代码的可维护性.可扩展 ...
- CAT XQX ---- 增删改查架构说明 1
View 层 -- 以国家为例 1. 显示 数据库的 table 页面效果 对应代码: <table id="dg" title="国家信息" cla ...
- Wiki动画回顾系列序&&目录
嘛,前前后后看了太多动画,我自己一直想做的事也是喜欢能做一款acg相关的应用,但一直没有好的点子,当然纠结到最后还是需要一个比较好的社区来让大家加入进来.一直有人让我给他们推番,而我也慢慢懂得“人心” ...
- [质疑]编程之美求N!的二进制最低位1的位置的问题
引子:编程之美给出了求N!的二进制最低位1的位置的二种思路,但是呢?但是呢?不信你仔细听我道来. 1.编程之美一书给出的解决思路 问题的目标是N!的二进制表示中最低位1的位置.给定一个整数N,求N!二 ...
- 黑马程序员——经典C语言程序设计100例
1.数字排列 2.奖金分配问题 3.已知条件求解整数 4.输入日期判断第几天 5.输入整数进行排序 6.用*号显示字母C的图案 7.显示特殊图案 8.打印九九口诀 9.输出国际象棋棋盘 10.打印楼梯 ...
- .net/c#连接sqlserver
Webconfig代码 <configuration> <appSettings> <add key="myconnect" value=" ...
- Linux_搜文件
Linux 下搜文件, 通常先用 whereis 或 locate ,如果找不到,才以 find 搜寻!因为 whereis 与 locate 是利用数据库来搜寻数据,省时间! <<鸟哥的 ...
- Git 提交后开始自动构建
设定Git仓库的钩子 一般路径为 xxx.git/hooks 参考文档 https://git-scm.com/docs/githooks 修改 post-receive #!/bin/bash wh ...
- cocos2dx 内存管理
转载自 ocos2dx 内存管理 - 小花原创博客 - 博客频道 - CSDN.NET http://blog.csdn.net/ring0hx/article/details/7946397 coc ...
- 导出Excel Gridview
/// <summary> /// 定义导出Excel的函数 /// </summary> /// <param name="FileType ...