模板
由于感觉在Word中导航非常不方便(才开始用 Word,不知道可以通过标题导航),所以开始学习如何在Word中快速跳转,于是发现了通过标题导航,但是每次都要自己弄样式(默认的有些别扭),而样式修改后又不能永久保存,之前还能将就用,就当作熟悉修改样式的步骤了,后来实在受不了了(当然,还包括其它因素,比如说文档的目录、写实验报告时固定的封面等等)。于是找到了下面这个:
查找和替换
由于用习惯了 VIM 中强大的替换功能,起初对于 Word 中的替换功能感到相当不满,直到发现了如下两个链接:
总之,Word 的查找和替换是非常强大的,可以根据特定的样式进行查找和替换,也可以使用正则表达式(好像是类似于正则表达式的东东)。使用Ctrl+F
查找,Ctrl+H
替换
题注
在学习 模板 时遇到了题注这个东东,而当 word 中有很多图片时,逐个添加题注的标签及编号时效率低下,于是发现了这个:
总结:通过复制域代码然后使用替换功能实现的,使用到的快捷键如下:
Alt+F9
:显示/关闭域代码。或者右键题注->切换域代码Ctrl+C
:复制。或者右键文本->复制Ctrl+H
:打开替换窗口。Ctrl+A
:全选。F9
:刷新。(包括各种域代码,超有用)
多级列表与样式结合
毕业论文要求标题为如下格式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
摘要 1
ABSTRACT 2
第一章 绪论 1
1.1 课题背景及研究意义 1
1.2 国内外研究现状 2
1.3 主要研究内容 3
1.4 论文结构 4
第二章 相关技术 5
2.1 容器化技术 5
2.2 Docker 6
2.2.1 Docker简介 6
2.2.2 Docker API 7
2.3 Portainer 8
2.3.1 Portainer简介 8
2.3.2 Portainer API 8
在参考了 写论文:word中设置多级标题,标题自动编号 - 简书 一文后,得到了上述格式的标题。
但是,在西电论文格式规范检查中,1、2、3级标题总是提示和如下内容:
1
9-2-正文二级标题-缩进(要求:无缩进, 实际:首行缩进28.0磅)
我将所有缩进相关的设置统统修改为 0,但依然没有解决这个问题。好像它总是会因为多级列表的存在自动增加一些缩进。
最终我也在没有找到直接解决这个首行缩进问题的办法,好在最后通过 Word 强大的查找替换功能达到了要求:查找栏中根据样式“标题”进行查找,替换栏中替换段落格式为“无缩进”即可
跳转
几乎所有的好一点的文档编辑器都支持跳转到上一个编辑位置(如 VIM 中是<C-O>
,eclipse 中是Alt+left
),后来终于也在 word 中找到了相应的快捷键:
总结:
Alt+left
:回到原目录Shift+F5
:返回到上次编辑的位置。实际上是在最近的四个位置间循环跳转
粘贴
Word 在粘贴时可以控制其格式,甚至可以设置默认粘贴的格式。详情参见:在粘贴文本时控制其格式 - Word
域代码
常用快捷键:
F9
:更新选中文本的所有域代码(通常结合Ctrl+A
使用)Shift+F9
:查看光标处的域代码Alt+F9
:查看文中的所有域代码(切换到域代码视图)Ctrl+F9
:输入域代码(看起来像一对大括号)
具体使用方法参见如下链接:
宏
简介
宏是一系列命令,涉及到编程(脚本语言 Visual Basic)。宏的存在使得 Word 异常强大。
详情参见如下链接:
可以使用 VB(Visual Basic) 语言手动编写宏,这时需要用到开发工具(可以直接使用快捷键Alt+F11
打开)。而 Word 出于安全考虑,默认隐藏了该选项卡,可以在文件-选项-自定义功能区-主选项卡-开发工具处打开。此后 Word 上方会多出一个开发工具选项卡,在其代码版块点击Visual Basic即可进入开发工具
在开发工具界面,将焦点放在某个版块后按F1
可以查看该版块的帮助文档。下面列出几个有用的学习链接:
- Visual Basic 用户界面帮助 | Microsoft Docs
- Office VBA 入门 | Microsoft Docs
- Visual Basic for Applications (VBA) 语言参考 | Microsoft Docs
- Visual Basic 语言参考 | Microsoft Docs
- Word Visual Basic for Applications (VBA) 参考 | Microsoft Docs
- Visual Basic for Applications (VBA) 库参考 | Microsoft Docs
案例
批量转换 docx 为 pdf
将某个目录下的所有docx
文件转换为pdf
文件(使用 Word 的另存为功能):
Option Explicit Sub docx2other() On Error Resume Next Dim sEveryFile As String,sSourcePath As String,sNewSavePath As String Dim CurDoc As Object sSourcePath = "E:\DOCX文件\" '假定待转换的docx文件全部在"E:\DOCX文件\"下,你需要按实际情况修改。 sEveryFile = Dir(sSourcePath &"*.docx") Do While sEveryFile <> "" Set CurDoc = Documents.Open(sSourcePath & sEveryFile, , , , , , , , , , , msoFalse) sNewSavePath = VBA.Strings.Replace(sSourcePath & sEveryFile, ".docx", ".pdf") '如果想导出doc/rtf/txt等,就把上一行行尾的pdf换成doc/rtf/txt '转化后的文件也在"E:\DOCX文件\"下,当然你可以按需修改。 CurDoc.SaveAs2 sNewSavePath, wdFormatPDF 'pdf对应wdFormatPDF,doc对应wdFormatDocument,rtf对应wdFormatRTF,txt对应wdFormatText '更多格式可参见文末的截图WdSaveFormat Enumeration CurDoc.Close SaveChanges:=False sEveryFile= Dir Loop Set CurDoc = Nothing
以上代码来自 Word VBA批量格式转换:docx转pdf、doc、rtf、txt以及反向转换 - 磁悬浮青蛙呱呱呱 - CSDN博客
中文文本从 PDF 等粘贴到 WORD 中,智能删除多余的空格和回车
文本从PDF等粘贴到WORD中,智能删除多余的空格和回车_Endlesswx_新浪博客
Word插入题注时自动删除标签与编号前的空格,编号后添加空格
Word插入题注时自动删除标签与编号前的空格,编号后添加空格_Endlesswx_新浪博客
节
用于页眉页脚等功能的概念,使用方法参见如下链接:
批注
页面边距
遇到过的问题
- 为啥有时单倍行距显得如此之大?取消勾选段落设置中的“如果定义了文档网格,则对齐到网格”即可。详情参见Word 行距,你真的了解吗? - 知乎
表格-将表格内容转换为文本?
点击表格工具-点击布局-找到数据模块-点击转换为文本
表格-表格单元格内的标题不显示在导航窗格中?
无解。这是 Word 中的一个已知限制。如果您希望标题显示在导航窗格中,您必须将它们放在表格之外:选中表格中的内容(注意不要选中表格),将它们粘贴到表格之外。详情参见: 表格单元格内的标题不显示在导航窗格中:变通方法? - VoidCC
宏-无法创建宏?
直接删除C:\Users\<用户名>\AppData\Roaming\Microsoft\Templates\Normal.dotm
文件即可。注意替换其中的<用户名>
,例如我的是C:\Users\wsxq2\AppData\Roaming\Microsoft\Templates\Normal.dotm
参见 解决Office 365 Word “无法创建宏” - 知乎
“组合”按钮不可用?
我有次对图片和多个图形进行组合时,发现“组合”按钮不可用,后来在组合或取消组合形状、图片或其他对象 - Office 支持中的组合形状、图片或其他对象
一节中找到了答案:
请注意, 若要在 Word 中对图片进行分组, “自动换行” 选项必须设置为”嵌入型” 以外的内容
总结:将图片的环绕文字选项设置为嵌入型以外的内容即可
题注-图 一-1
?
参见如下链接:
其中比较靠谱的解决方法是使用域代码,即{ QUOTE "二零一七年九月{ STYLEREF 1 \s }日"\@"D" }
(大括号是使用Ctrl+F9
插入的)。通常先按Ctrl+F9
输入代表域代码的大括号,再复制QUOTE "二零一七年九月日"\@"D"
,然后再拖动后面的{ STYLEREF 1 \s }
到月
和日
之间,从而得到上述域代码。
原理很简单,通过提取日期中的天数来实现将中文数字转换为阿拉伯数字。Word 域会自动从中文日期格式得到日期对象,然后\@"D"
提取天数时会默认得到阿拉伯数字形式的天数
对于多个题注的修改,可以考虑使用 Word 强大的替换功能:使用^d
来表示域代码的开始,使用^c
(表示粘贴板中的内容)来简化输入。
例如,将图 ^d STYLEREF 1 \s
替换为图^c
,需要注意的是要先切换到域代码视图才能找到域代码,并且要先在 Word 中输入{ QUOTE "二零一七年九月{ STYLEREF 1 \s }日"\@"D" }
(大括号是使用Ctrl+F9
插入的)并复制,否则会从粘贴板中读取到错误的内容
良好的打印效果(为装订线预留位置)?
布局-页面设置-更多图标:
- 页边距
- 页码范围-多页处选择对称页边距
- 预览-应用于处选择整篇文档
- 页边距-内侧、外侧、装订线处进行相应的设置,
- 纸张
- 纸张大小处选择 A4
- 预览-应用于处选择整篇文档
- 布局
- 页眉和页脚-距边界处输入相应的页眉和页脚值
- 预览-应用于处选择整篇文档
和 Markdown 互相转换?
1
2
pandoc -f gfm -t docx 2019-07-07-科学上网.md -o 科学上网.docx
pandoc -f docx -t gfm 科学上网.docx 2019-07-07-科学上网.md
详情参见 pandoc
pywin32
- PyWin32 Documentation: http://timgolden.me.uk/pywin32-docs/contents.html
- mhammond/pywin32: Python for Windows (pywin32) Extensions: https://github.com/mhammond/pywin32
更多相关资源参见: python - Why can’t I find any pywin32 documentation/resources - Stack Overflow
pywin32 是 Python 中的用来和 Windows API 交互的库。以下是pywin32
的官方介绍:
Python extensions for Microsoft Windows Provides access to much of the Win32 API, the ability to create and use COM objects, and the Pythonwin environment.
——引用自 pywin32 · PyPI
而 Word 的相关接口也包含在 Win32 API 中,也就是说,你在 Word VBA 中可以使用的所有 API,在这个库中也能使用
(事实上,pywin32
很有研究价值,其操作空间很大。以后有空了再填这个坑。到时会将这部分内容迁移到单独的一篇文章中。)
具体教程可参见 Python操作Word入门(Win32com) - 知乎
事实上,还有一个和pywin32
一样提供相同接口的库:pypiwin32
。这两个库的功能差不多。对于 pywin32 和 pypiwin32 该使用哪一个好的问题,笔者找到两个相反的答案:
- 认为
pypiwin32
更好:pywin32 und pypiwin32: what is the difference? - 认为
pywin32
更好:python - What is the difference between pywin32 and pypiwin32? - Stack Overflow
由于pywin32
最近一次更新是在 2019-09-15 1,新于pypiwin32
的 2018-02-262,因此我选择使用 pywin32
案例
批量转换 doc 为 pdf
和前面 VBA 的功能一样,不过用 Python 更方便:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import glob
import os
import time
from shutil import copyfile
import win32com.client
from PyPDF2 import PdfFileMerger
# changed from https://www.bbsmax.com/A/GBJrLR0Zd0/
def convert_to_pdf(in_dir=r"./docs/", out_dir=r""):
# absolute path is needed
# be careful about the slash '\', use '\\' or '/' or raw string r"..."
if out_dir == r"":
out_dir = os.path.join(in_dir, "pdf")
in_dir = os.path.abspath(in_dir)
out_dir = os.path.abspath(out_dir)
wdFormatPDF = 17
word = win32com.client.DispatchEx('Word.Application')
word.Visible = False
# print(word)
time.sleep(3)
first_flag = True
for root, dirs, files in os.walk(in_dir, topdown=False):
for file in files:
in_file = os.path.join(root, file)
# print(in_dir)
out_file_temp = os.path.join(out_dir, file)
if (file.endswith(".docx") or file.endswith(".doc")) and (not file.startswith('~')):
out_file = out_file_temp.rsplit('.', 1)[0] + '.pdf'
# print(in_file)
# print(out_file)
# skip existed files
if os.path.isfile(out_file):
continue
print("converting '" + in_file + "' into '" + out_file + "'")
doc = word.Documents.Open(in_file)
# print(type(doc))
doc.SaveAs2(out_file, FileFormat=wdFormatPDF)
doc.Close()
if first_flag:
word.Visible = False
first_flag = False
elif file.endswith(".pdf"):
print("coping '" + in_file + "' into '" + out_file_temp + "'")
copyfile(in_file, out_file_temp)
word.Quit()
print("Conversion Done.")
链接
下面总结了本文中使用的所有链接:
- Office VBA 入门 | Microsoft Docs
- Python操作Word入门(Win32com) - 知乎
- Visual Basic for Applications (VBA) 库参考 | Microsoft Docs
- Visual Basic for Applications (VBA) 语言参考 | Microsoft Docs
- Visual Basic 用户界面帮助 | Microsoft Docs
- Visual Basic 语言参考 | Microsoft Docs
- Word VBA批量格式转换:docx转pdf、doc、rtf、txt以及反向转换 - 磁悬浮青蛙呱呱呱 - CSDN博客
- Word Visual Basic for Applications (VBA) 参考 | Microsoft Docs
- Word 中的域代码列表 - Office 支持
- Word批处理——宏 - 简书
- Word查找的通配符和特殊字符! - kevinhg的博客 - CSDN博客
- python - What is the difference between pywin32 and pypiwin32? - Stack Overflow
- pywin32 und pypiwin32: what is the difference?
- pywin32 · PyPI
- word天,原来“查找”和“替换”这么强大! - 知乎
- 【职场趣学】92.16% 的人不知道的题注“图一-1”问题 - 简书
- 写论文:word中设置多级标题,标题自动编号 - 简书
- 创建或运行宏 - Word
- 启用或禁用 Office 文件中的宏 - Office 支持
- 在 Word 中设置或更改页边距 - Office 支持
- 在粘贴文本时控制其格式 - Word
- 插入分节符 - Office 支持
- 组合或取消组合形状、图片或其他对象 - Office 支持
- 编号格式“图一.1”改为“图1.1”编号以阿拉伯数字显示 - 懵懂的菜鸟 - 博客园
- 表格单元格内的标题不显示在导航窗格中:变通方法? - VoidCC
- 解决Office 365 Word “无法创建宏” - 知乎
- 设置装订线边距 - Office 支持