-
Notifications
You must be signed in to change notification settings - Fork 18
/
documents-office.qmd
executable file
·137 lines (100 loc) · 5.2 KB
/
documents-office.qmd
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# Office 文档 {#chap-office-documents}
本章主要介绍办公文档 Word、演示报告 PowerPoint 和电子邮件 Email 三类应用。在 R 语言社区中,Quarto 文档支持输出 Word 和 PowerPoint 格式,**blastula** 包可以将 R Markdown 文档转化为电子邮件内容,从而实现代码化、可重复和批量化,提高工作效率。
## Word 文档 {#sec-office-words}
### Markdown 制作 Word 文档
本节探索 (R) Markdown + Pandoc 以 Word 格式作为最终交付的可能性。
### R Markdown 制作 Word 文档
[docxtools](https://github.com/graphdr/docxtools)、[officer](https://github.com/davidgohel/officer) 和 [officedown](https://github.com/davidgohel/officedown) 大大扩展了 rmarkdown 包在制作 Word/PPT 方面的功能。
### 自定义 Word 模版
R Markdown 借助 Pandoc 将 Markdown 转化为 Word 文档,继承自 Pandoc 的扩展性, R Markdown 也支持自定义 Word 模版,那如何自定义呢?首先,我们需要知道 Pandoc 内建的 Word 模版长什么样子,然后我们依样画葫芦,制作适合实际需要的模版。获取 Pandoc 自带的 Word 和 PPT 模版,只需在命令行中执行
``` bash
# DOCX 模版
pandoc -o custom-reference.docx --print-default-data-file reference.docx
# PPTX 模版
pandoc -o custom-reference.pptx --print-default-data-file reference.pptx
```
这里其实是将 Pandoc 自带的 docx 文档 reference.docx 拷贝一份到 custom-reference.docx,而后将 custom-reference.docx 文档自定义一番,但仅限于借助 MS Word 去自定义样式。
- [Word 文档的 YAML 元数据定义](https://pandoc.org/MANUAL.html#option--reference-doc)
- [如何深度自定义文档模版](https://bookdown.org/yihui/rmarkdown/word-document.html)
**bookdown** 提供的函数 `word_document2()` 相比于 **rmarkdown** 提供的 `word_document()` 支持图表的交叉引用,更多细节详见帮助 `?bookdown::word_document2`。
## PowerPoint 演示 {#sec-office-powerpoints}
## 电子邮件 {#sec-office-emails}
Rahul Premraj 基于 **rJava** 包开发的 [mailR](https://github.com/rpremraj/mailR) 虽然还未在 CRAN 上正式发布,但是已得到很多人的关注,也被广泛的使用,目前作者已经不维护了,继续使用有一定风险。 RStudio 公司 Richard Iannone 新开发的 [**blastula**](https://github.com/rich-iannone/blastula) 扔掉了 Java 的重依赖,更加轻量化、现代化,支持发送群组邮件。
### curl 包 {#sec-email-curl}
[curl](https://github.com/jeroen/curl) 包提供的函数 `send_mail()` 本质上是在利用 [curl](https://curl.haxx.se/) 软件发送邮件,举个例子,邮件内容如下:
```
From: "张三" <邮箱地址>
To: "李四" <邮箱地址>
Subject: 测试邮件
你好:
这是一封测试邮件!
```
将邮件内容保存为 mail.txt 文件,然后使用 curl 命令行工具将邮件内容发出去。
``` bash
curl --url 'smtp://公司邮件服务器地址:开放的端口号' \
--ssl-reqd --mail-from '发件人邮箱地址' \
--mail-rcpt '收件人邮箱地址' \
--upload-file data/mail.txt \
--user '发件人邮箱地址:邮箱登陆密码'
```
::: callout-note
Gmail 出于安全性考虑,不支持这种发送邮件的方式,会将邮件内容阻挡,进而接收不到邮件。
:::
### blastula 包 {#sec-email-blastula}
下面以 **blastula** 包为例怎么支持 Gmail、Outlook、QQ 等邮件发送,先安装系统软件依赖,CentOS 8 上安装依赖
``` bash
sudo dnf install -y libsecret-devel libsodium-devel
```
然后安装 [**keyring**](https://github.com/r-lib/keyring) 和 [**blastula**](https://github.com/rstudio/blastula)
``` r
install.packages(c("keyring", "blastula"))
```
接着配置邮件帐户,这一步需要邮件账户名和登陆密码,配置一次就够了,不需要每次发送邮件的时候都配置一次
``` r
library(blastula)
create_smtp_creds_key(
id = "outlook",
user = "[email protected]",
provider = "outlook"
)
```
第二步,准备邮件内容,包括邮件主题、发件人、收件人、抄送人、密送人、邮件主体和附件等。
``` r
attachment <- "data/mail.txt" # 如果没有附件,引号内留空即可。
# 这个Rmd文件渲染后就是邮件的正文,交互图形和交互表格不适用
body <- "examples/html-document.Rmd"
# 渲染邮件内容,生成预览
email <- render_email(body) |>
add_attachment(file = attachment)
email
```
最后,发送邮件
``` r
smtp_send(
from = c("张三" = "[email protected]"), # 发件人
to = c("李四" = "[email protected]",
"王五" = "[email protected]"), # 收件人
cc = c("赵六" = "[email protected]"), # 抄送人
subject = "这是一封测试邮件",
email = email,
credentials = creds_key(id = "outlook")
)
```
密送人实现群发单显,即一封邮件同时发送给多个人,每个收件人只能看到发件人地址而看不到其它收件人地址。
``` r
email <- compose_email(
body = md("
Markdown 格式的邮件内容
")
)
smtp_send(
from = c("发件人" = "[email protected]"),
to = c("收件人" = "[email protected]"),
bcc = c(
"抄送人" = "[email protected]"
),
subject = "邮件主题",
email = email,
credentials = creds_key(id = "outlook")
)
```