18  Office 文档

本章主要介绍办公文档 Word、演示报告 PowerPoint 和电子邮件 Email 三类应用。在 R 语言社区中,Quarto 文档支持输出 Word 和 PowerPoint 格式,blastula 包可以将 R Markdown 文档转化为电子邮件内容,从而实现代码化、可重复和批量化,提高工作效率。

18.1 Word 文档

18.1.1 Markdown 制作 Word 文档

本节探索 (R) Markdown + Pandoc 以 Word 格式作为最终交付的可能性。

18.1.2 R Markdown 制作 Word 文档

docxtoolsofficerofficedown 大大扩展了 rmarkdown 包在制作 Word/PPT 方面的功能。

18.1.3 自定义 Word 模版

R Markdown 借助 Pandoc 将 Markdown 转化为 Word 文档,继承自 Pandoc 的扩展性, R Markdown 也支持自定义 Word 模版,那如何自定义呢?首先,我们需要知道 Pandoc 内建的 Word 模版长什么样子,然后我们依样画葫芦,制作适合实际需要的模版。获取 Pandoc 自带的 Word 和 PPT 模版,只需在命令行中执行

# 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 去自定义样式。

bookdown 提供的函数 word_document2() 相比于 rmarkdown 提供的 word_document() 支持图表的交叉引用,更多细节详见帮助 ?bookdown::word_document2

18.2 PowerPoint 演示

18.3 电子邮件

Rahul Premraj 基于 rJava 包开发的 mailR 虽然还未在 CRAN 上正式发布,但是已得到很多人的关注,也被广泛的使用,目前作者已经不维护了,继续使用有一定风险。 RStudio 公司 Richard Iannone 新开发的 blastula 扔掉了 Java 的重依赖,更加轻量化、现代化,支持发送群组邮件。

18.3.1 curl 包

curl 包提供的函数 send_mail() 本质上是在利用 curl 软件发送邮件,举个例子,邮件内容如下:

From: "张三" <邮箱地址>
To: "李四" <邮箱地址>
Subject: 测试邮件

你好:

这是一封测试邮件!

将邮件内容保存为 mail.txt 文件,然后使用 curl 命令行工具将邮件内容发出去。

curl --url 'smtp://公司邮件服务器地址:开放的端口号' \
  --ssl-reqd --mail-from '发件人邮箱地址' \
  --mail-rcpt '收件人邮箱地址' \
  --upload-file data/mail.txt \
  --user '发件人邮箱地址:邮箱登陆密码'
注释

Gmail 出于安全性考虑,不支持这种发送邮件的方式,会将邮件内容阻挡,进而接收不到邮件。

18.3.2 blastula 包

下面以 blastula 包为例怎么支持 Gmail、Outlook、QQ 等邮件发送,先安装系统软件依赖,CentOS 8 上安装依赖

sudo dnf install -y libsecret-devel libsodium-devel

然后安装 keyringblastula

install.packages(c("keyring", "blastula"))

接着配置邮件帐户,这一步需要邮件账户名和登陆密码,配置一次就够了,不需要每次发送邮件的时候都配置一次

library(blastula)
create_smtp_creds_key(
  id = "outlook", 
  user = "zhangsan@outlook.com",
  provider = "outlook"
)

第二步,准备邮件内容,包括邮件主题、发件人、收件人、抄送人、密送人、邮件主体和附件等。

attachment <- "data/mail.txt" # 如果没有附件,引号内留空即可。
# 这个Rmd文件渲染后就是邮件的正文,交互图形和交互表格不适用
body <- "examples/html-document.Rmd" 
# 渲染邮件内容,生成预览
email <- render_email(body) |> 
  add_attachment(file = attachment)
email

最后,发送邮件

smtp_send(
  from = c("张三" = "xxx@outlook.com"), # 发件人
  to = c("李四" = "xxx@foxmail.com",
         "王五" = "xxx@gmail.com"), # 收件人
  cc = c("赵六" = "xxx@outlook.com"), # 抄送人
  subject = "这是一封测试邮件",
  email = email,
  credentials = creds_key(id = "outlook")
)

密送人实现群发单显,即一封邮件同时发送给多个人,每个收件人只能看到发件人地址而看不到其它收件人地址。

email <- compose_email(
  body = md("
Markdown 格式的邮件内容
")
)

smtp_send(
  from = c("发件人" = "xx@outlook.com"),
  to = c("收件人" = "xx@outlook.com"),
  bcc = c(
    "抄送人" = "xx@outlook.com"
    ),
  subject = "邮件主题",
  email = email,
  credentials = creds_key(id = "outlook")
)