如何优雅地在 Word 中实现替换?

我们生活在一个程序的世界,编程并非是程序员的专利,每个人都可以通过编程来使自己的工作和生活更加轻松,减少对程序员的依赖。只要你愿意,用任何一种语言来辅助自己的工作都不是难事。当然,我们需要一个好的学习方法,多少人吐槽谭浩强先生的《C 语言程序设计》,说明了至少存在误导的因素。学习编程,要有一个明确的目的,根据目的选择合适的工具,而不是为了学习而学习。

大家都知道,MS Office 套件带有一个宏语言:VBA。VBA 当然不是一门先进的语言,但因为在 Office 中内嵌,我们用它来解决问题还是可以的。

今天说说 Office 的域,说说域中一个叫做 DocVariable 的东西。

本人工作中经常要出文案,这些商业文案呢都有一些套路性的东西。比如说我们做项目售前的时候,要出《方案建议书》。《方案建议书》的文档结构类似,我一般是基于模板,增加针对客户具体的情况变化的部分。在模板中,会有多处出现客户名称、项目名称等。这个每一个客户和项目都不一样,怎么办呢?难道每次都是查找/替换?当然不是不是必须的,要灵活,就必须用到 Word 域。并且 Word 批量替换还有副作用,各位看官有木有碰到?这里就不展开讲什么是 Word 域,不熟悉的同学自己 Google 去。DocVariable 是域的一种,但需要 VBA 代码配合,所以知道的人少,平时用的也少见。

定义 DocVariable

ALT+F11,进入 VBE 环境,通过菜单【插入】-【模块】,插入一个模块,编写如下代码:

Option Explicit

Public Sub AddDocVariables()
    ' delete doc variables if any
    Dim doc_var As Variable
    For Each doc_var In ActiveDocument.Variables
        doc_var.Delete
    Next
    
    ' add new doc variables
    ActiveDocument.Variables.Add Name:="cname", Value:="XXX有限公司" ' customer name'
    ActiveDocument.Variables.Add Name:="csname", Value:="XXX公司"  ' customer short name'
    ActiveDocument.Variables.Add Name:="pname", Value:="SAP实施项目" ' project name'
End Sub

代码很直观,先删除所有文档变量,然后重新定义三个文档变量:

cname: customer name
pname: project name
csname: customer short name

文档中插入 DocVariable

将上面的代码运行一次(将光标放在过程中间,然后 F5),回到 Word 编辑界面,通过菜单【插入】-【文档部件】- 【域】(注:我的 Word 版是 2013)

word_doc_variable_01.jpg

然后找到类别为 “文档自动化” 域名为 DocVariable,选中该域,新名称中输入 cname,就是我们前面 VBA 定义的文档变量。

word_doc_variable_02.jpg

点击 “确定” 按钮,客户名称就插入了。
word_doc_variable_03.jpg

是不是感觉操作有点麻烦?Office 提供快捷键,可以非常方便插入域代码:

  • 快捷键:Ctrl + F9
  • Word 文档出现一对对应的大括号 {},中间为灰色,我们在大括号中间输入 {docviarable cname},然后再按 F9 就可以了。

平时我们都用这种方法来插入域代码。对这个域代码,我们可以通过 Shift + F9 来切换显示,Word 会交替显示 {docviarable cname} 和 “XXX有限公司” 。

如果文档中有多个域代码,我们就使用 Alt + F9 来切换显示。操作就这几招。

总结

  • Ctrl + F9: 插入域代码
  • F9: 执行域代码
  • Shift + F9: 单个域代码切换显示
  • Alt + F9: 整篇文档的域代码切换显示
  • 定义 DocVariable 类型的域代码,必须使用 VBA,没有手工定义的方法
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Word 替换文字或图片,也可以使用 Apache POI 库来实现。以下是一个示例代码: ```java import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import org.apache.poi.ooxml.POIXMLDocument; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.util.IOUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; public class WordReplace { public static void main(String[] args) throws IOException, InvalidFormatException { // 读取 Word 文档 InputStream inputStream = new FileInputStream("input.docx"); XWPFDocument doc = new XWPFDocument(POIXMLDocument.openPackage(inputStream)); // 遍历段落 for (XWPFParagraph para : doc.getParagraphs()) { // 遍历文本 run for (XWPFRun run : para.getRuns()) { String text = run.getText(0); if (text != null) { // 替换文本 text = text.replace("old text", "new text"); run.setText(text, 0); // 替换图片 if (text.contains("[img]")) { InputStream imgStream = new FileInputStream("new_image.jpg"); byte[] imgBytes = IOUtils.toByteArray(imgStream); run.addPicture(imgBytes, XWPFDocument.PICTURE_TYPE_JPEG, "new_image.jpg", 100, 100); imgStream.close(); } } } } // 保存 Word 文档 FileOutputStream outputStream = new FileOutputStream("output.docx"); doc.write(outputStream); outputStream.close(); doc.close(); } } ``` 在这个示例,我们读取了一个名为 `input.docx` 的 Word 文档,然后遍历了每个段落和每个文本 run,找到需要替换的文本或图片,并进行替换。最后,我们将修改后的文档保存为 `output.docx` 文件。 需要注意的是,这个示例同样也是一个简单的实现,你可以根据实际需求进行更改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值