Data frame to word table?

后端 未结 3 2105
一整个雨季
一整个雨季 2020-12-24 15:45

Is there a way to easily turn a data frame into a Word table via rmarkdown?

If I use rmarkdown in RStudio to create a Word document I get a nicely printed table but

相关标签:
3条回答
  • 2020-12-24 16:04

    Here is a very low-tech (and fast) way to do it

    source("http://michael.hahsler.net/SMU/EMIS7332/R/copytable.R") 
    

    and run the example

    copytable(summary(iris))
    

    now copy&paste and you are done!

    Just for reference, here is also the source code for the copytable function:

    library(xtable)
    
    copytable <- function(x, ...) {
      f <- tempfile(fileext=".html")
      print(xtable(x, ...), "html", file = f)
      browseURL(f)
    }
    
    0 讨论(0)
  • 2020-12-24 16:10

    EDIT: ReporteRs is still maintained but will not evolve anymore. Use officer and flextable instead :

    library(officer)
    library(flextable)
    library(magrittr)
    
    # Create flextable object
    ft <- flextable(data = mtcars) %>% 
      theme_zebra %>% 
      autofit
    # See flextable in RStudio viewer
    ft
    
    # Create a temp file
    tmp <- tempfile(fileext = ".docx")
    
    # Create a docx file
    read_docx() %>% 
      body_add_flextable(ft) %>% 
      print(target = tmp)
    
    # open word document
    browseURL(tmp)
    

    END EDIT

    Hi you can also try package ReporteRs to turn a data.frame into a Word table, the function to do it is FlexTable :

    library(ReporteRs)
    library(magrittr)
    
    docx( ) %>% 
      addFlexTable( mtcars %>%
                      FlexTable( header.cell.props = cellProperties( background.color =  "#003366" ),
                                 header.text.props = textBold( color = "white" ),
                                 add.rownames = TRUE ) %>%
                      setZebraStyle( odd = "#DDDDDD", even = "#FFFFFF" ) ) %>%
      writeDoc( file = "exemple.docx" )
    
    # open the Word document
    browseURL("exemple.docx")
    

    enter image description here

    With markdown, i think this work only with HTML :

    ---
    title: "HTML table"
    output: html_document
    ---
    
    ```{r, results='asis'}
    library(ReporteRs)
    tabl = FlexTable( mtcars,
                      header.cell.props = cellProperties( background.color = "#003366" ),
                      header.text.props = textBold( color = "white" ),
                      add.rownames = TRUE )
    tabl = setZebraStyle( tabl, odd = "#DDDDDD", even = "#FFFFFF" )
    cat(as.html(tabl))
    ```
    

    Here an other example on how to create a word document with ReporteRs :

    library(ReporteRs)
    # Create a docx object
    doc = docx()
    # add a document title
    doc = addParagraph( doc, "A FlexTable example", stylename = "TitleDoc" )
    # add a section title
    doc = addTitle( doc, "How to turn a data.frame into a Word table", level = 1 )
    # some text
    doc = addParagraph( doc, "We use the mtcars dataset as example.", stylename = "DocDefaults" )
    # add a table
    MyFTable = FlexTable( data = mtcars[1:10, ], add.rownames = TRUE )
    # format body content
    MyFTable[3:4, "cyl"] = cellProperties( background.color = "red" )
    MyFTable["Valiant", ] = cellProperties( background.color = "blue" )
    doc = addFlexTable(doc, MyFTable)
    # write the doc
    writeDoc( doc, file = "exemple.docx" )
    # open the Word doc
    browseURL("exemple.docx")
    

    enter image description here

    For more example you can visit http://davidgohel.github.io/ReporteRs/word.html

    0 讨论(0)
  • 2020-12-24 16:13

    You can use the rmarkdown and knitr packages. Here is an example function, where df is the data.frame, output_file is the output file name and output_dir the output folder. Extra named argument are sent to rmarkdown::render:

    df2word <- function(df, output_file = "table.doc", output_dir = ".", ...) {
      f <- tempfile(fileext =".Rmd" )
      cat(file = f, '```{r, echo = FALSE}
                      knitr::kable(df)
                     ```', append = TRUE)
      rmarkdown::render(f, output_file = output_file, output_dir = output_dir, ...)
      unlink(f)
      file.path(output_dir, output_file)
    }
    
    out <- df2word(mtcars)
    browseURL(out)
    

    Of course you can adapt the code to be more flexible.

    It is though flexible enough to allow you to extract other formats too, e.g. html:

    out <- df2word(mtcars, output_file = "table.html")
    browseURL(out)
    

    or pdf:

    out <- df2word(mtcars, output_file = "table.pdf", output_format = rmarkdown::pdf_document())
    browseURL(out)
    
    0 讨论(0)
提交回复
热议问题