1.2 writexl

截止到2021年5月17日,writexl包功能比较简单,仅有输出 Excel 功能。快速、不依赖 java 和 Excle 是它绝对的优势,并且输出文件相比openxlsx包较小。

项目地址

1.2.1 用法

1.安装

从CRAN安装发行版

install.packages("writexl")

2.函数参数

write_xlsx()函数参数如下:

write_xlsx(
  x,
  path = tempfile(fileext = ".xlsx"),
  col_names = TRUE,
  format_headers = TRUE,
  use_zip64 = FALSE
)
write_xlsx参数 解释
x 要输出的数据框和数据框列表
path 输出 Excel 的文件名称
col_names 是否输出表头,默认为TRUE
format_headers 是否将表头居中并加粗,默认为TRUE
use_zip64 是否支持4Gb文件大小,不是所有的系统都支持

use_zip64:不确定该参数的理解是否正确,请自行阅读官方文档,绝大部分时候不用理解该参数。

3.输出Excel

write_xlsx()函数将数据框保存到 Excel。如想要输出多个 sheet 时,用list(mysheet1 = iris,mysheet2 = iris)表示即可,代码如下:

library(writexl)
writexl::write_xlsx(iris,path = 'iris.xlsx')

# 输出多sheet
write_xlsx(list(mysheet1 = iris,mysheet2 = iris),path = 'iris.xlsx')

4.效率比较

openxlsx包比较输出效率。

library(microbenchmark)
library(nycflights13)
microbenchmark(
  writexl = writexl::write_xlsx(flights, tempfile()),
  openxlsx = openxlsx::write.xlsx(flights, tempfile()),
  times = 2
)

5.文件大小比较

openxlsx包比较输出后的 Excel 文件大小。

library(nycflights13)
writexl::write_xlsx(flights, tmp1 <- tempfile())
file.info(tmp1)$size
#> [1] 29139352
openxlsx::write.xlsx(flights, tmp2 <- tempfile())
file.info(tmp2)$size
#> [1] 26833693

按照writexl官方文档的说法,writexl输出的 Excel 文件应该较少,但实际上并不是,不确定是不是openxlsx更新优化过。

6.其它功能

Excel 公式以及超级链接格式。

df <- data.frame(
  name = c("UCLA", "Berkeley", "Jeroen"),
  founded = c(1919, 1868, 2030),
  website = xl_hyperlink(c("http://www.ucla.edu", "http://www.berkeley.edu", NA), "homepage")
)
df$age <- xl_formula('=(YEAR(TODAY()) - INDIRECT("B" & ROW()))')
write_xlsx(df, 'universities.xlsx')

# cleanup
unlink('universities.xlsx')

当需要输出大型 Excel 文件时,比如超过50万行,我会采用writexl包输出。但是在曾经使用过程中,定时任务采用 writexl 包输出 Excel 文件有时会报错,感觉不稳定,原因不明。现在一般临时性的输出我会采用writexl包,定时任务中采用openxlsx