Word使用笔记

Posted by wsxq2 on 2020-06-04
TAGS:  Word

本文最后一次编辑时间:2020-06-18 17:53:24 +0800

模板

由于感觉在Word中导航非常不方便(才开始用 Word,不知道可以通过标题导航),所以开始学习如何在Word中快速跳转,于是发现了通过标题导航,但是每次都要自己弄样式(默认的有些别扭),而样式修改后又不能永久保存,之前还能将就用,就当作熟悉修改样式的步骤了,后来实在受不了了(当然,还包括其它因素,比如说文档的目录、写实验报告时固定的封面等等)。于是找到了下面这个:

一劳永逸,打造自己的word常规模板 - 知乎

查找和替换

由于用习惯了 VIM 中强大的替换功能,起初对于 Word 中的替换功能感到相当不满,直到发现了如下两个链接:

总之,Word 的查找和替换是非常强大的,可以根据特定的样式进行查找和替换,也可以使用正则表达式(好像是类似于正则表达式的东东)。使用Ctrl+F查找,Ctrl+H替换

题注

在学习 模板 时遇到了题注这个东东,而当 word 中有很多图片时,逐个添加题注的标签及编号时效率低下,于是发现了这个:

批量为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 中找到了相应的快捷键:

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可以查看该版块的帮助文档。下面列出几个有用的学习链接:

  1. Visual Basic 用户界面帮助 | Microsoft Docs
  2. Office VBA 入门 | Microsoft Docs
  3. Visual Basic for Applications (VBA) 语言参考 | Microsoft Docs
  4. Visual Basic 语言参考 | Microsoft Docs
  5. Word Visual Basic for Applications (VBA) 参考 | Microsoft Docs
  6. 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 该使用哪一个好的问题,笔者找到两个相反的答案:

  1. 认为pypiwin32更好:pywin32 und pypiwin32: what is the difference?
  2. 认为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.")

链接

下面总结了本文中使用的所有链接:

  1. https://pypi.org/project/pywin32/ 

  2. https://pypi.org/project/pypiwin32/