DT::datatable() 导出为 pdf,同时为多行单元格保留 HTML </br>
DT::datatable() export to pdf while preserving HTML </br> for multiline cells
尝试在 R 中使用 DT::datatable()
将包含多行单元格的 table 导出为 pdf。 DT::datatable()
适用于多行单元格,但在尝试导出为 pdf 时会出现问题。我尝试了两种不同的方法,每种方法都有自己的问题。
有很多关于导出为 pdf 时保持格式的话题,但是 none 关于导出多行单元格。
方法 1: Buttons
扩展的 pdf 打印按钮,带有参数 escape = FALSE
和 exportOptions = list(stripHtml = FALSE)
并自定义 JS()
函数。
这里的问题是格式没有保留(在 Rstudio 中,在导出为 pdf 之前它看起来很棒)。此解决方案 () 非常适合为 headers、颜色、对齐方式等指定某些格式(正如我在 customize
参数中尝试过的那样)。但是,我想做的是在值中保留 HTML 格式,即多行单元格 ("A</br>B</br>C"
)。有谁知道我需要将哪个 JS()
函数传递给 customize
参数,以便相应地读取和打印 </br>
?或者还有其他方法吗?
if (!require('DT')) install.packages('DT'); library(DT)
dt <- data.frame(Numbers = 1:100, Letter = paste0(c("A", "B", "C", "D", "E", "F"), collapse = "</br>"))
datatable(dt,
rownames = FALSE,
escape = FALSE,
extensions = c("Buttons"),
options = list(
dom = 'Blfrtip',
buttons = list(
list(extend = "pdf",
exportOptions = list(stripHtml = FALSE,
columns = ':visible'),
orientation = 'portrait',
customize = JS("function(doc){
doc.styles.tableHeader.color='yellow';
doc.defaultStyle.alignment = 'left';
doc.styles.tableHeader.alignment = 'left';
doc.pageMargins = [10,10,10,10];
doc.defaultStyle.fontSize = 7;
doc.styles.tableHeader.fontSize = 7;
doc.styles.title.fontSize = 9;
}"
)))))
方法二:使用saveWidget()
将datatable
object保存到html
,然后使用[=打印网页29=]。这里保留了格式,但它只是制作了一个很长的pdf,如果你想打印它就没用了。我试图找到一个可以将此 pdf 拆分为 A4 页面的函数:webshot::resize()
、dev.print(onefile=F)
、staplr::split_pdf()
和 tabulizer::split_pdf()
,但无法正常工作。
if (!require('webshot')) install.packages('webshot'); library(webshot)
if (!require('DT')) install.packages('DT'); library(DT)
df <- data.frame(No = 1:100, Letter = paste0(c("A", "B", "C", "D", "E", "F"), collapse = "</br>"))
dtable <- datatable(df,
rownames = T,
width = '100%',
height = '100%',
escape = FALSE,
options = list(
pageLength = 200,
dom = 't'
))
html <- "dtable.html"
saveWidget(dtable, html)
webshot(html, "dtable.pdf")
我觉得我让这件事变得比它应该做的更难了。我错过了什么吗?除了 DT::datatable()
之外,还有其他方法可以通过 R 将多行单元格导出为 pdf 格式吗?
knitr::kable
和 wkhtmltopdf
的组合起到了作用:它确保多行单元格的格式,生成多页 pdf,每页有 table headers。
if (!require('kableExtra')) install.packages('kableExtra'); library(kableExtra)
dt <- data.frame(Numbers = 1:100, Letter = paste0(c("A", "B", "C", "D", "E", "F"), collapse = "<br>"))
# make html file
kbl(dt, escape = FALSE) %>%
kable_paper() %>%
save_kable(file = "table1.html", self_contained = F)
# convert to pdf
system("wkhtmltopdf --enable-local-file-access table1.html file.pdf")
wkhtmltopdf
是一个命令运行开源应用程序,您可以在这里下载:https://wkhtmltopdf.org/downloads.html
如果要更改 table 或 pdf 的外观,请参阅 https://wkhtmltopdf.org/usage/wkhtmltopdf.txt and https://cran.r-project.org/web/packages/kableExtra/vignettes/awesome_table_in_html.html
尝试在 R 中使用 DT::datatable()
将包含多行单元格的 table 导出为 pdf。 DT::datatable()
适用于多行单元格,但在尝试导出为 pdf 时会出现问题。我尝试了两种不同的方法,每种方法都有自己的问题。
有很多关于导出为 pdf 时保持格式的话题,但是 none 关于导出多行单元格。
方法 1: Buttons
扩展的 pdf 打印按钮,带有参数 escape = FALSE
和 exportOptions = list(stripHtml = FALSE)
并自定义 JS()
函数。
这里的问题是格式没有保留(在 Rstudio 中,在导出为 pdf 之前它看起来很棒)。此解决方案 (customize
参数中尝试过的那样)。但是,我想做的是在值中保留 HTML 格式,即多行单元格 ("A</br>B</br>C"
)。有谁知道我需要将哪个 JS()
函数传递给 customize
参数,以便相应地读取和打印 </br>
?或者还有其他方法吗?
if (!require('DT')) install.packages('DT'); library(DT)
dt <- data.frame(Numbers = 1:100, Letter = paste0(c("A", "B", "C", "D", "E", "F"), collapse = "</br>"))
datatable(dt,
rownames = FALSE,
escape = FALSE,
extensions = c("Buttons"),
options = list(
dom = 'Blfrtip',
buttons = list(
list(extend = "pdf",
exportOptions = list(stripHtml = FALSE,
columns = ':visible'),
orientation = 'portrait',
customize = JS("function(doc){
doc.styles.tableHeader.color='yellow';
doc.defaultStyle.alignment = 'left';
doc.styles.tableHeader.alignment = 'left';
doc.pageMargins = [10,10,10,10];
doc.defaultStyle.fontSize = 7;
doc.styles.tableHeader.fontSize = 7;
doc.styles.title.fontSize = 9;
}"
)))))
方法二:使用saveWidget()
将datatable
object保存到html
,然后使用[=打印网页29=]。这里保留了格式,但它只是制作了一个很长的pdf,如果你想打印它就没用了。我试图找到一个可以将此 pdf 拆分为 A4 页面的函数:webshot::resize()
、dev.print(onefile=F)
、staplr::split_pdf()
和 tabulizer::split_pdf()
,但无法正常工作。
if (!require('webshot')) install.packages('webshot'); library(webshot)
if (!require('DT')) install.packages('DT'); library(DT)
df <- data.frame(No = 1:100, Letter = paste0(c("A", "B", "C", "D", "E", "F"), collapse = "</br>"))
dtable <- datatable(df,
rownames = T,
width = '100%',
height = '100%',
escape = FALSE,
options = list(
pageLength = 200,
dom = 't'
))
html <- "dtable.html"
saveWidget(dtable, html)
webshot(html, "dtable.pdf")
我觉得我让这件事变得比它应该做的更难了。我错过了什么吗?除了 DT::datatable()
之外,还有其他方法可以通过 R 将多行单元格导出为 pdf 格式吗?
knitr::kable
和 wkhtmltopdf
的组合起到了作用:它确保多行单元格的格式,生成多页 pdf,每页有 table headers。
if (!require('kableExtra')) install.packages('kableExtra'); library(kableExtra)
dt <- data.frame(Numbers = 1:100, Letter = paste0(c("A", "B", "C", "D", "E", "F"), collapse = "<br>"))
# make html file
kbl(dt, escape = FALSE) %>%
kable_paper() %>%
save_kable(file = "table1.html", self_contained = F)
# convert to pdf
system("wkhtmltopdf --enable-local-file-access table1.html file.pdf")
wkhtmltopdf
是一个命令运行开源应用程序,您可以在这里下载:https://wkhtmltopdf.org/downloads.html
如果要更改 table 或 pdf 的外观,请参阅 https://wkhtmltopdf.org/usage/wkhtmltopdf.txt and https://cran.r-project.org/web/packages/kableExtra/vignettes/awesome_table_in_html.html