R - Shiny -将具有多行单元格的数据表导出到PDF(和Excel)

0md85ypi  于 2023-03-04  发布在  其他
关注(0)|答案(1)|浏览(203)

我有一个多行单元格的表格,在屏幕上显示正常,但我不能将相同的格式保存到PDF或Excel文件中。
here描述的解决方案使用了(a)一个外部应用程序(但我可能无法在www.example.com中使用它shinyapps.io)和(b)还引用了kable(但引用链接不保存到PDF文件中),我猜一定有比依赖这样的应用程序鸡尾酒更简单的解决方案。
我在下面包含了一个reprex,它有两个按钮可以将表格保存为PDF。第一个按钮我尝试了一个相当标准的过程,使用 DT,另一个按钮我尝试了 huxtable。这两个按钮在创建PDF时都产生了相同的结果,即没有多行和额外的格式(如粗体)。我希望在PDF中看到与屏幕上相同的格式。
顺便问一下,除了PDF之外,是否有可能有一个类似的解决方案(带有多行和格式)导出到Excel?毕竟,Excel允许在单元格内进行格式设置,它们也可以是多行。
谢谢

library(shiny)
library(DT)
library(huxtable)

data <- data.frame(
  Name = c("Mr A", "Mrs B"),
  Description = c("This is line 1.<br>Line 2.",
                  "This is another cell with line 1.<br>Line 2 has some <b>bold text</b>.")
)

ui <- dashboardPage(skin = "black",
                    dashboardHeader(disable = TRUE),
                    dashboardSidebar(disable = TRUE),
                    dashboardBody(DT::dataTableOutput("Table"),
                                  br(),
                                  actionButton("mytable_pdf", "huxtable PDF")
                    )
)

server <- function(input, output, session) {
  
  output$Table <- DT::renderDataTable(data,
                                      extensions = 'Buttons',
                                      rownames   = FALSE,
                                      options = list(
                                        paging = FALSE,
                                        searching = TRUE,
                                        fixedColumns = TRUE,
                                        autoWidth = TRUE,
                                        ordering = TRUE,
                                        dom = '<Bt>', 
                                        pageLength=2,
                                        buttons = 'pdf'),  
                                      # buttons = c('excel','pdf')),
                                      escape = FALSE,
                                      class = "display"
)
   observeEvent(input$mytable_pdf, quick_pdf(data, file = "output.pdf"))
}
shinyApp(ui, server)
rdrgkggo

rdrgkggo1#

这里是一个多行的解决方案(找到here)。它适用于PDF和Excel。对于粗体我完全不知道。

library(shiny)
library(DT)

js <- JS(
  "function(data, column, row) {",
  "  if(typeof data === 'string' || data instanceof String) {",
  "    data = data.replace(/<br\\s*\\/?>/ig, '\\r\\n');",
  "  }",
  "  return data;",
  "}"
)

dat <- data.frame(
  Name = c(
    "Mr A", "Mrs B"
  ),
  Description = c(
    "This is line 1.<br>Line 2.",
    "This is another cell with line 1.<br>Line 2 has some <b>bold text</b>."
  )
)

ui <- fluidPage(
  br(), br(),
  DTOutput("dtable")
)

server <- function(input, output, session) {

  output[["dtable"]] <- renderDT({
    datatable(
      dat, escape = FALSE,
      extensions = "Buttons",
      options = list(
        dom = "Bfrtip",
        buttons = list(
          list(
            extend   = "pdf", 
            filename = "test",
            text     = "Save as PDF",
            exportOptions = list(
              format = list(
                body = js
              )
            )
          ),
          list(
            extend   = "excel", 
            filename = "test",
            text     = "Save as XLSX",
            exportOptions = list(
              format = list(
                body = js
              )
            )
          )
        )
      )
    )
  })
  
}

shinyApp(ui, server)

相关问题