宏与自动化 #

宏概念 #

什么是宏 #

text
宏定义:

宏:
├── 一系列操作的记录
├── 可重复执行的命令集
├── 自动化文档处理
└── 提高工作效率

宏的作用:
├── 自动执行重复操作
├── 批量处理文档
├── 自定义功能
├── 扩展 Writer 能力
└── 节省时间和精力

宏的类型:
├── 录制宏
│   └── 记录操作步骤
├── 编写宏
│   └── 使用 Basic 语言编写
└── 导入宏
    └── 使用他人编写的宏

录制宏 #

录制宏步骤 #

text
录制宏:

步骤:
1. 工具 → 宏 → 录制宏
2. 执行要录制的操作
3. 点击"停止录制"
4. 保存宏
│   ├── 输入宏名称
│   ├── 选择保存位置
│   └── 确定

录制注意事项:
├── 操作要准确
├── 避免多余操作
├── 鼠标操作可能不被记录
├── 尽量使用键盘操作
└── 录制前先练习

可录制操作:
├── 文本输入
├── 格式设置
├── 插入对象
├── 菜单命令
└── 快捷键操作

运行宏 #

text
运行宏:

方法一:宏对话框
├── 工具 → 宏 → 运行宏
├── 选择宏
├── 点击"运行"
└── 执行宏

方法二:工具栏
├── 添加宏按钮到工具栏
├── 点击按钮运行
└── 快速执行

方法三:快捷键
├── 为宏分配快捷键
├── 按快捷键运行
└── 最快捷方式

方法四:菜单
├── 添加宏到菜单
├── 点击菜单运行
└── 方便访问

管理宏 #

text
宏管理:

打开宏管理器:
├── 工具 → 宏 → 管理宏
└── 或工具 → 宏 → 组织宏

宏管理器功能:
├── 新建
│   └── 创建新宏
├── 编辑
│   └── 编辑宏代码
├── 删除
│   └── 删除宏
├── 运行
│   └── 运行宏
└── 重命名
    └── 重命名宏

宏保存位置:
├── 我的宏
│   └── 个人宏库
├── LibreOffice 宏
│   └── 系统宏
└── 当前文档
    └── 文档内宏

编写宏 #

LibreOffice Basic 简介 #

text
LibreOffice Basic:

基本概念:
├── Basic 语言
├── LibreOffice 脚本语言
├── 类似 VBA
└── 功能强大

基本语法:
├── 变量声明
│   └── Dim variable As Type
├── 条件语句
│   └── If...Then...Else...End If
├── 循环语句
│   └── For...Next, Do...Loop
└── 过程和函数
    └── Sub...End Sub, Function...End Function

数据类型:
├── Integer - 整数
├── Long - 长整数
├── Single - 单精度浮点
├── Double - 双精度浮点
├── String - 字符串
├── Boolean - 布尔值
└── Variant - 变体

宏编辑器 #

text
打开宏编辑器:

方法一:宏管理器
├── 工具 → 宏 → 管理宏
├── 选择宏
├── 点击"编辑"
└── 打开编辑器

方法二:直接打开
├── 工具 → 宏 → 组织宏 → Basic
├── 选择宏
├── 编辑
└── 打开编辑器

编辑器功能:
├── 代码编辑
├── 语法高亮
├── 自动完成
├── 调试功能
│   ├── 断点
│   ├── 单步执行
│   └── 查看变量
└── 运行宏

常用宏示例 #

text
简单宏示例:

示例 1: 插入日期
```basic
Sub InsertDate
    Dim oDoc As Object
    Dim oText As Object
    Dim oCursor As Object
    
    oDoc = ThisComponent
    oText = oDoc.getText()
    oCursor = oText.createTextCursor()
    
    oText.insertString(oCursor, Date(), False)
End Sub

示例 2: 格式化选中文字

basic
Sub FormatSelected
    Dim oDoc As Object
    Dim oSelection As Object
    
    oDoc = ThisComponent
    oSelection = oDoc.getCurrentSelection()
    
    If Not IsNull(oSelection) Then
        oSelection(0).CharWeight = com.sun.star.awt.FontWeight.BOLD
        oSelection(0).CharColor = RGB(255, 0, 0)
    End If
End Sub

示例 3: 批量替换

basic
Sub BatchReplace
    Dim oDoc As Object
    Dim oReplace As Object
    
    oDoc = ThisComponent
    oReplace = oDoc.createReplaceDescriptor()
    
    oReplace.setSearchString("旧文本")
    oReplace.setReplaceString("新文本")
    
    oDoc.replaceAll(oReplace)
End Sub
text

## 宏与文档

### 文档对象模型

LibreOffice 对象模型:

主要对象: ├── ThisComponent │ └── 当前文档对象 ├── Text │ └── 文档文本对象 ├── TextCursor │ └── 文本光标 ├── Paragraphs │ └── 段落集合 ├── Tables │ └── 表格集合 └── 其他对象

常用属性: ├── String - 文本内容 ├── CharFontName - 字体名称 ├── CharHeight - 字号 ├── CharWeight - 粗细 ├── CharColor - 颜色 └── 更多属性

常用方法: ├── getText() - 获取文本对象 ├── createTextCursor() - 创建光标 ├── insertString() - 插入文本 ├── getLength() - 获取长度 └── 更多方法

text

### 操作文档内容

文档操作示例:

获取文档对象:

basic
Dim oDoc As Object
oDoc = ThisComponent

获取选中文本:

basic
Dim oSelection As Object
oSelection = oDoc.getCurrentSelection()
If oSelection.getCount() > 0 Then
    Dim oText As String
    oText = oSelection.getByIndex(0).getString()
End If

插入文本:

basic
Dim oText As Object
Dim oCursor As Object
oText = oDoc.getText()
oCursor = oText.createTextCursor()
oText.insertString(oCursor, "插入的文本", False)

遍历段落:

basic
Dim oParEnum As Object
Dim oPar As Object
oParEnum = oDoc.getText().createEnumeration()
Do While oParEnum.hasMoreElements()
    oPar = oParEnum.nextElement()
    ' 处理段落
Loop
text

## 宏安全

### 安全设置

宏安全级别:

工具 → 选项 → LibreOffice → 安全 → 宏安全

安全级别: ├── 低 │ └── 允许所有宏(不推荐) ├── 中 │ └── 宏运行前询问 ├── 高 │ └── 只运行信任位置的宏 └── 很高 └── 只运行信任位置的签名宏

信任位置: ├── 添加信任目录 ├── 该目录的宏自动运行 ├── 不询问直接执行 └── 安全便利平衡

text

### 宏签名

数字签名:

签名作用: ├── 验证宏来源 ├── 确保宏未被修改 ├── 提高安全性 └── 建立信任

签名步骤:

  1. 获取数字证书
  2. 工具 → 宏 → 组织宏 → Basic
  3. 选择宏库
  4. 数字签名
  5. 选择证书签名

验证签名: ├── 打开文档时验证 ├── 显示签名信息 └── 确认来源可信

text

## 实用宏案例

### 格式化文档

格式化宏示例:

统一格式:

basic
Sub FormatDocument
    Dim oDoc As Object
    Dim oParEnum As Object
    Dim oPar As Object
    
    oDoc = ThisComponent
    oParEnum = oDoc.getText().createEnumeration()
    
    Do While oParEnum.hasMoreElements()
        oPar = oParEnum.nextElement()
        
        ' 设置字体
        oPar.CharFontName = "宋体"
        oPar.CharHeight = 12
        
        ' 设置行距
        oPar.LineSpacing = 150
    Loop
End Sub
text

### 批量处理

批量操作宏:

批量插入页眉:

basic
Sub AddHeader
    Dim oDoc As Object
    Dim oStyle As Object
    Dim oHeader As Object
    Dim oText As Object
    
    oDoc = ThisComponent
    oStyle = oDoc.getStyleFamilies().getByName("PageStyles").getByName("Standard")
    
    oStyle.HeaderIsOn = True
    oHeader = oStyle.getHeaderText()
    oText = oHeader.getText()
    
    oText.setString("文档标题")
End Sub
text

## 小结

本章介绍了 LibreOffice Writer 的宏与自动化:

- 宏的概念和作用
- 录制和运行宏
- 编写 Basic 宏
- 文档对象模型
- 宏安全设置
- 实用宏案例

## 下一步

- [制作专业简历](/docs/libreoffice-writer/practical/resume):实战案例
- [撰写学术论文](/docs/libreoffice-writer/practical/academic-paper):论文排版
最后更新:2026-04-13