Skip to contents

Add data to a worksheet and format as an Excel table.


  sheet = current_sheet(),
  dims = wb_dims(start_row, start_col),
  start_col = 1,
  start_row = 1,
  col_names = TRUE,
  row_names = FALSE,
  table_style = "TableStyleLight9",
  table_name = NULL,
  with_filter = TRUE,
  sep = ", ",
  first_column = FALSE,
  last_column = FALSE,
  banded_rows = TRUE,
  banded_cols = FALSE,
  apply_cell_style = TRUE,
  remove_cell_style = FALSE,
  na.strings = na_strings(),
  inline_strings = TRUE,
  total_row = FALSE,



A Workbook object containing a worksheet.


The worksheet to write to. Can be the worksheet index or name.


A data frame


Spreadsheet cell range that will determine start_col and start_row: "A1", "A1:B2", "A:B"


A vector specifying the starting column to write x to.


A vector specifying the starting row to write x to.


If TRUE, column names of x are written.


If TRUE, the row names of x are written.


Any table style name or "none" (see vignette("openxlsx2_style_manual"))


Name of table in workbook. The table name must be unique.


If TRUE, columns with have filters in the first row.


Only applies to list columns. The separator used to collapse list columns to a character vector e.g. sapply(x$list_column, paste, collapse = sep).

The below options correspond to Excel table options:
Figure: table_options.png


logical. If TRUE, the first column is bold.


logical. If TRUE, the last column is bold.


logical. If TRUE, rows are color banded.


logical. If TRUE, the columns are color banded.


Should we write cell styles to the workbook


keep the cell style?


Value used for replacing NA values from x. Default looks if options( is set. Otherwise na_strings() uses the special #N/A value within the workbook.


write characters as inline strings


logical. With the default FALSE no total row is added.


additional arguments


Formulae written using wb_add_formula() to a Workbook object will not get picked up by read_xlsx(). This is because only the formula is written and left to Excel to evaluate the formula when the file is opened in Excel. The string "_openxlsx_NA" is reserved for openxlsx2. If the data frame contains this string, the output will be broken.

Supported classes are data frames, matrices and vectors of various types and everything that can be converted into a data frame with Everything else that the user wants to write should either be converted into a vector or data frame or written in vector or data frame segments. This includes base classes such as table, which were coerced internally in the predecessor of this package.

Even vectors and data frames can consist of different classes. Many base classes are covered, though not all and far from all third-party classes. When data of an unknown class is written, it is handled with as.character(). It is not possible to write character nodes beginning with <r> or <r/>. Both are reserved for internal functions. If you need these. You have to wrap the input string in fmt_txt().

The columns of x with class Date/POSIXt, currency, accounting, hyperlink, percentage are automatically styled as dates, currency, accounting, hyperlinks, percentages respectively.

Functions wb_add_data() and wb_add_data_table() behave quite similar. The distinction is that the latter creates a table in the worksheet that can be used for different kind of formulas and can be sorted independently, though is less flexible than basic cell regions.

Modify total row argument

It is possible to further tweak the total row. In addition to the default FALSE possible values are TRUE (the xlsx file will create column sums each variable).

In addition it is possible to tweak this further using a character string with one of the following functions for each variable: "average", "count", "countNums", "max", "min", "stdDev", "sum", "var". It is possible to leave the cell empty "none" or to create a text input using a named character with name text like: c(text = "Total"). It's also possible to pass other spreadsheet software functions if they return a single value and hence "SUM" would work too.


wb <- wb_workbook()$add_worksheet()$
    x =,
    row_names = TRUE,
    total_row = c(text = "Total", "none", "sum", "sum", "sum", "SUM")