Analysis in R: A very convenient way to create Excel files! The “openxlsx” package

RAnalytics
スポンサーリンク

This is an introduction to the commands of the “openxlsx” package, which is very useful for creating Excel files. The package allows you to create a “workbook object” with the “createWorkbook” command, add data, arrange the appearance of cells with conditional formatting and borders, and add output such as the “ggplot2” package to create an Excel file.

Package version is 4.2.5.1. R version 4.2.2 is confirmed.

スポンサーリンク

Installing packages

Run the following command.

#Installing packages
install.packages("openxlsx")

Before the execution command

Execute the following command to load various packages.

#Run the openxlsx package
library("openxlsx")

#Install the tidyverse package if it is not already installed
#Used to create graphs with the ggplot2 package
if(!require("tidyverse", quietly = TRUE)){
  install.packages("tidyverse");require("tidyverse")
}

Execute command

See the command and package help for details.

Reading xlsx files: “read.xlsx” command

#Reading xlsx files: read.xlsx command
#Select xlsx file
XLPath <- paste0(as.character(
  tkgetOpenFile(title = "Select xlsx file",
                filetypes = '{"xlsx file" {".xlsx"}}',
                initialfile = c("*.xlsx"))), collapse = " ")

#Read xlsx file:read.xlsx command
#Specify the xlsx file to read:xlsxFile option
#Specify the sheet to read:sheet option
#Specify the row to start reading:startRow Option
#Set column names: colNames option; TRUE: the first row is the column name / FALSE: none
#Set row names: rowNames option; TRUE: first column is row name / FALSE: none
#Detect dates and set conversion: detectDates option;TRUE/FALSE
#Process empty columns up to data: skipEmptyCols option;TRUE:skip empty rows/FALSE:empty NA
#Process empty rows up to data: skipEmptyRows option;TRUE:skip empty rows/FALSE:NA empty
#Row range to read data from: rows option; NULL to specify all, single/c(5, 7),c(2:12), etc.
#columns option; NULL to specify all, single/c(5,7), c(2:12), etc.
#Check column names for duplicates: check.names option;TRUE: assign [.No] if duplicates are found/FALSE
#Insert column names in spaces:sep.names option
#Get the specified named region:namedRegion option;NULL/set "region name
#Set characters to be recognized as NA values: na.strings option
#Process for merged cells: fillMergedCells option; TRUE: same value for merged cell range
read.xlsx(xlsxFile = XLPath, sheet = 1,
          startRow = 1, colNames = TRUE,
          rowNames = FALSE, detectDates = FALSE,
          skipEmptyCols = FALSE, #skipEmptyRows = TRUE, 
          rows = NULL, cols = NULL,
          check.names = FALSE, sep.names = ".",
          namedRegion = NULL, na.strings = "TEST",
          fillMergedCells = FALSE)

Save xlsx file: “write.xlsx” command

#Specify data: x option; multiple data can be stored in list class and saved at once
#Specify filename:file option; if no file path, save to working folder
#Overwrite settings: overwrite option; TRUE/FALSE
###Cell styles can be created and specified separately with the createStyle command#####
###Other parameter options are also introduced#####
###[Save with style] #####
write.xlsx(x = list("Iris" = iris, "Cars" = cars),
           file = "Test.xlsx",
           overwrite = TRUE)

Create cell style: “createStyle” command

The “addStyle” command used in conjunction with the “createWorkbook” command, as well as the “write.xlsx” command and the “conditionalFormatting” command, creates the “Style Object” needed to set the cell appearance command. The latter allows for more fine-tuning.

#Font:fontName option; initial value: "Calibri
#Font size:fontSize option; initial value: "11
#Font color:fontColour option; initial value: "black
##Cell format:numFmt option; "GENERAL", "NUMBER", "CURRENCY",
##"ACCOUNTING", "DATA", "LONGDATE", "TIME", "PERCENTAGE", "FRACTION", "SCIENTIFIC",
##"TEXT", "COMMA", user-defined 'month day','0.00', etc. possible
##Border position: border options; "NULL", "top", "bottom", "left", "right", "TopBottom",
##"LeftRight", "TopLeftRight", "TopBottomLeftRight" are available
##Color of the border: borderColour option; must be applied with a border option other than "NULL".
#Border style: BorderStyle option; must be set with a border option other than "NULL",
##"none", "thin", "medium", "dashed", "dotted", "thick", "double", "hair", "mediumDashed",
##"dashDot", "mediumDashDot", "mediumDashDotDot", "slantDashDot" are available
#Conditional cell fill color:bgFill option; only applies to conditional formatting
#CellFillColor:fgFill option; set normal background color
#Horizontal text position:align option; Default value: NULL, "left", "right", "center", and "justify" are available.
#Character vertical position: valign option; default: NULL, "top", "center", and "buttom" are allowed
##Font style:textDecoration option; initial value:NULL, "bold", "strikout", "italic",
Allow ##"underline", "underline2", "accounting", "accounting2
##Wrap text to show the whole text:wrapText option;TRUE/FALSE
#Direction of text: textRotation option; default:NULL,0:255
#Character indentation:indent option; initial value:NULL
#Locking of protection: locked option; initial value:NULL,TRUE/FALSE
#Display protection setting:hidden option:NULL,TRUE/FALSE
CellStyle <- createStyle(fontName = "Arial",
                         fontSize = 12,
                         fontColour = "black",
                         numFmt = 'm"月"d"日"',
                         border = "top",
                         borderColour = "black",
                         borderStyle = "none",
                         bgFill = NULL,
                         fgFill = "green",
                         halign = "center",
                         valign = NULL,
                         textDecoration = "accounting2",
                         wrapText = FALSE,
                         textRotation = 0,
                         indent = 1,
                         locked = TRUE,
                         hidden = FALSE)

Saving in a neat format: “write.xlsx” command

#Replaced by NA
iris[1, 2:3] <- NA
#Save
write.xlsx(x = list("Iris" = iris, "Cars" = cars),
           file = "Test.xlsx",
           overwrite = TRUE,
           #Set sheet name: sheetName option
           sheetName = c("Iris", "Cars"),
           #Display settings for grid lines: gridLines option; TRUE/FALSE: show/hide
           gridLines = c(FALSE,TRUE),
           #Set tab color: tabColour option
           tabColour = c("red", "green"),
           #Sheet Magnification Settings: zoom option; 10:400 range
           zoom = c(80, 120),
           #Set write start column:startCol option;c(sheet1, sheet2, ...)
           startCol = c(3, 5),
           #Set write start row:startRow option;c(sheet1, sheet2, ...)
           startRow = 2,
           #Batch setting to start writing column rows:xy option;c(startCol, startRow)
           #xy = c("A2", "c1"),
           #Assigning column names;colnames option:TRUE/FALSE
           colNames = TRUE,
           #Assigning row names:rowNames option:TRUE/FALSE
           rowNames = FALSE,
           #Customize the columns name style:headerStyle option
           #Specify the Style object created by the createStyle command
           headerStyle = CellStyle,
           #Draw a line around the data:borders option;
           #NULL,"surrounding","columns","rows"
           borders = "surrounding",
           #borders colour:borderColour
           borderColour = "red",
           #border style:borderStyle optin,
           #Similar to the borderStyle option of the createStyle command
           borderStyle = "medium",
           #Save NA as #N/A instead of blank;TRUE/FALSE
           keepNA = TRUE,
           #Window frame row fixing:firstActiveRow option
           firstActiveRow = 3,
           #Window frame column fixation:firstActiveCol option
           firstActiveCol = 4,
           #Specify column width:colWidths option;"auto"/numeric
           #colWidths = c("auto", "auto"),
           #Set filter:withFilter option;TRUE/FALSE
           withFilter = c(TRUE, FALSE)
           )

“Workbook object” to be fine-tuned

The createWorkbook command creates a “Workbook object”, writes data, and creates an Excel file with various styles. The run command also shows an example of adding the output of the ggplot2 package to a sheet.

The sample Excel output can be created by running it in order from the top.

#Create a Workbook object: createWorkbook command
#Set creator: creator option; default: login user name
#Set title property: title option; initial value: NULL
#Set subject property: subject option; initial value: NULL
#Category property settings:category option; initial value:NULL
TestWb <- createWorkbook(creator = "KARADA GOOD",
                         title = "KARADA",
                         subject = "GOOD",
                         category = "R TEST")

#Add a worksheet: addWorksheet command
#Specify a workbook object: wb option
#Create a sheet name: sheetName option
#Show grid lines: gridLines option; TRUE/FALSE
#Tab color: tabColour option; default:NULL
#Zoom settings: zoom option; 10:400 range
### Shortcodes available for the following headers and footers ###
#&[Page]:Page number,&[Pages]:Number of pages,
#&[Date]:Current date,&[Time]:Current time,
#&[Path]:File path,&[File]:File name,
#&&[Tab]:Sheet name
#header settings:header option;c(left,center,right)
#Footer settings:footer option;c(left,center,right)
#Even page header settings:evenHeader option;c(left,center,right)
#Even page footer settings:evenFooter option;c(left side,center,right side)
#First page header settings:firstHeader option;c(left,center,right)
#First Page Footer Settings:firstFooter option;c(left side,center,right side)
#visible setting:visible option;TRUE/FALSE: FALSE is not allowed if there is only one sheet.
#PaperSize:paperSize option;8:A3,9:A4,11:A5,12:B4,13:B5,
#67:A3 width, 55:A4 width, 61:A5 width, other sizes can be checked in pageSetup.
#Option: Orientation option; "portrait"/"landscape".
addWorksheet(wb = TestWb,
             sheetName = "KARADA GOOD",
             gridLines = FALSE,
             tabColour = "blue",
             zoom = 80,
             header = c("からだに", "いいもの", "R情報"),
             footer = c("KARADA", "GOOD", "R INFO &[Page],&[Pages]"),
             evenHeader = c("偶数からだに&[Date],&[Time],", "偶数いいもの", NA),
             evenFooter = c("EVEN KARADA", "EVEN GOOD", "EVEN R INFO"),
             firstHeader = c("先頭からだに", "&[Path],&[File],&[Tab]",
                             "先頭R情報"),
             firstFooter = c("First KARADA", NA, "First R INFO"),
             visible = TRUE,
             paperSize = 9,
             orientation = "landscape")

#Write data to a sheet: writeData command
#Specify Workbook object:wb option
#Name of the sheet to write: sheet option; name/index number
#Data to write: x option
#Specify the row to start reading: startRow option
#Specify column to start reading: startcol option
#Name the data range:name option
#Refer to "Save with style:write.xlsx command" for others
writeData(wb = TestWb,
          sheet = 1, x = iris,
          startRow = 3, startCol = 2,
          array = FALSE,
          colNames = TRUE, rowNames = FALSE,
          name = "からだにいいもの",
          headerStyle = CellStyle,
          borders = "columns",
          borderColour = "blue",
          borderStyle = "double",
          withFilter = TRUE,
          keepNA = TRUE)

#Fixing the window frame:freezePane command
#Save with style:write.xlsx command
freezePane(wb = TestWb,
           sheet = 1,
           firstActiveRow = 3,
           firstActiveCol = 4)

#Specify column widths:setColWidths command
#Specify column widths:widths option; "auto"/numeric
setColWidths(wb = TestWb, sheet = 1,
             cols = 2:6, widths = "auto")

#Adapt a Style Object to a specified range: addStyle command
#Create a new Style
CellStyle2 <- createStyle(fgFill = "lightblue",
                          textDecoration = "underline2")
#AdaptStyle Object
#If cols,rows range is not the same: set gridExpand option to TRUE
addStyle(wb = TestWb, sheet = 1, 
         style = CellStyle2,
         rows = 8:10, cols = 2:6,
         gridExpand = TRUE)

#Adapt a Style Object with formatting rules:conditionalFormatting command
#Create a new Style
#Use the point::bgFill option
CellStyle3 <- createStyle(bgFill = "red",
                          textDecoration = "underline2")
CellStyle4 <- createStyle(bgFill = "gold",
                          textDecoration = "underline2")
CellStyle5 <- createStyle(bgFill = "green",
                          textDecoration = "underline2")
CellStyle6 <- createStyle(bgFill = "black",
                          textDecoration = "underline2")

#Specified Condition Content:type Option
#rule is "<","<=",">",">=","==","!=":"expression"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = CellStyle3,
                      cols = 2, rows = 4:30,
                      type = "expression",
                      rule = ">=5")

#Gradient with a numeric range of 2 or 3 for rule:"colourScale"
#Databar with a numeric range of 2 or 3 for rule:"databar"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = c("pink", "yellow"),
                      cols = 3, rows = 4:30,
                      type = "colourScale",
                      rule = c(3, 5))

#rule is the duplicate value:"duplicates"
#rule contains the specified value:"contains"
#rule contains a range of values specified by:"between"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = CellStyle4,
                      cols = 4, rows = 4:30,
                      type = "duplicates")

#rule begins with a letter that:"beginsWith"
#rule ends with a letter that:"endsWith"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = CellStyle5,
                      cols = 6, rows = 4:30,
                      type = "endsWith",
                      rule = "a")

#value where rule is a top value:"topN"
#value where rule is a bottom value:"bottomN"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = CellStyle6,
                      cols = 5, rows = 4:30,
                      type = "topN",
                      rank = 20, percent = TRUE)
######################

#Specify column widths: setColWidths command
#column widths:widths option; "auto"/numeric
setColWidths(wb = TestWb, sheet = 1,
             cols = 2:5, widths = "18.3")

#Insert the output of a plot or ggplot2 package: insertPlot command
#BoxPlot
BoxPlot <- ggplot(cars, aes(x = factor(speed),
                            y = dist, fill = factor(speed))) +
  geom_boxplot()

#Add BoxPlot:insertPlot command
#The number printed at the end will be inserted.
#Specify size: width,height option; units are in inches
#Use the units option to change the units
print(BoxPlot)
insertPlot(wb = TestWb, sheet = 1,
           width = 15, height = 15,
           units = "cm", xy= c("H", 7),
           fileType = "png")

#Save the xlsx file in the working directory: saveWorkbook command
saveWorkbook(wb = TestWb,
             file = "KARADA_GOOD.xlsx",
             overwrite = TRUE)

Protect, duplicate, delete, etc. xlsx files and sheets

#Set password for xlsx file:protectWorkbook command
#Specify password:password option
protectWorkbook(wb = TestWb,
                protect = TRUE,
                password = "KARADAGOOD",
                lockStructure = FALSE,
                lockWindows = FALSE)

#Set passwords, cell protection, etc. for worksheets: protectWorksheet command
#Set a password: password option
#Protect cells: lockSelectingLockedCells option
#Set other protection settings: protectWorksheet
protectWorksheet(wb = TestWb,
                 sheet = 1,
                 protect = TRUE,
                 password = "KARADAGOOD",
                 lockSelectingLockedCells = TRUE)

#Duplicate sheet: cloneWorksheet command
#Name of the copied sheet: sheetName option
cloneWorksheet(wb = TestWb,
               sheetName = "KARADAGOOD_2",
               clonedSheet = 1)

#Rename sheet:renameWorksheet command
#Target sheet:sheet option
#Renamed name:newName option
renameWorksheet(wb = TestWb,
                sheet = "KARADAGOOD_2",
                newName = "KARADAGOOD_3")

#Delete sheet:removeWorksheet command
#Target sheet:sheetName option
removeWorksheet(wb = TestWb,
                sheetName = "KARADAGOOD_2")

Other

・Hyperlink settings, etc.

#Creating Hyperlinks: getNamedRegions command
#Data containing URLs and paths are allowed.
#Data to be written is set to "hyperlink class" before writing.
class(Target data) <- "hyperlink"

#Get Creators:getCreators command
getCreators(wb = TestWb)

#Get sheet name:getSheetNames command
#set xlsx/xlsm file:file option
getSheetNames(file)

・Border style and position: see output examples

#Create a new Excel file
TestWb <- createWorkbook()
#Add sheet
addWorksheet(wb = TestWb,
             sheetName = "KARADAGOOD",
             gridLines = FALSE,
             tabColour = "blue",
             zoom = 80)

###Border styles#####
StyleName <- c("thin", "medium", "dashed", "dotted", "thick", "double",
               "hair", "mediumDashed", "dashDot", "mediumDashDot",
               "mediumDashDotDot", "slantDashDot")

#Write character
writeData(wb = TestWb, sheet = 1, x = "Border Styles",
          startRow = 2, startCol = 3)

#Write Styles
for(i in seq(StyleName)){
  ifelse(i <= 6, Sc <- 3, Sc <- 5)
  ifelse(i <= 6, Sr <- 2 + i, Sr <- i - 4)
  #書き込み
  writeData(wb = TestWb, sheet = 1, x = StyleName[i],
            startRow = Sr, startCol = Sc)
  #Cell Style
  CellStyle <- createStyle(fontSize = 12,
                           fontColour = "black",
                           border = "bottom",
                           borderColour = "red",
                           borderStyle = StyleName[i])
  #Add Style
  addStyle(wb = TestWb, sheet = 1, 
           style = CellStyle,
           rows = Sr, cols = Sc,
           gridExpand = TRUE)
}
########

###Border positions#####
AllBorder <- c("top","bottom","left","right","TopBottom")
SrNo <- c(2, 3, 4, 5, 6)

#Write character
writeData(wb = TestWb, sheet = 1, x = "Border Positions",
          startRow = 2, startCol = 7)

#Write Borders
for(i in seq(AllBorder)){
  Sr <- SrNo[i] + i
  #Write
  writeData(wb = TestWb, sheet = 1, x = AllBorder[i],
            startRow = Sr, startCol = 7)
  #Cell Style
  CellStyle <- createStyle(fontSize = 12,
                           fontColour = "black",
                           border = AllBorder[i],
                           borderColour = "blue",
                           borderStyle = "medium")
  #Add Style
  addStyle(wb = TestWb, sheet = 1, 
           style = CellStyle,
           rows = Sr, cols = 7,
           gridExpand = TRUE)

}
########

#Set colomun widths
setColWidths(wb = TestWb, sheet = 1,
             cols = c(3, 4, 5, 6, 7),
             widths = c(23, 2.86, 23, 2.86, 23))

#Saved xlsx file:saveWorkbook command
saveWorkbook(wb = TestWb,
             file = "KARADAGOOD.xlsx",
             overwrite = TRUE)

・Conditional format: see output examples

#Create a new Excel file
TestWb <- createWorkbook()
#Add sheet
addWorksheet(wb = TestWb,
             sheetName = "KARADAGOOD",
             gridLines = FALSE,
             tabColour = "blue",
             zoom = 80)

###Conditional format#####
#Conditional format
RuleName <- c("expression", "colourScale", "databar", "duplicates",
              "contains", "between", "beginsWith", "endsWith",
              "topN", "bottomN")

CellStyle <- createStyle(bgFill = "red")
CellStyle_BW <- createStyle(bgFill = c("pink", "blue"))

#Data position
Sr <- rep(seq(3, 11, by = 2), 2)
LSc <- rep(c(2, 12), each = 5)
Sc <- rep(c(3, 13), each = 5)

#Data write
for(i in seq(RuleName)){
  #Write conditional format name
  writeData(wb = TestWb, sheet = 1, x = RuleName[i],
            startRow = LSc[i], startCol = Sr[i])
  #Data write
  if(RuleName[i] %in% c("contains", "beginsWith", "endsWith")){
    writeData(wb = TestWb, sheet = 1,
              x = c("karada", "からだに", "Good", "いいもの"),
              startRow = Sc[i], startCol = Sr[i])
  }else{
    writeData(wb = TestWb, sheet = 1,
              x = c(-1, -1, 2, 3, 3, 4, 5, 6),
              startRow = Sc[i], startCol = Sr[i])}
}

###Adapt formatting rules#####
#"expression"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = CellStyle,
                      cols = 3, rows = 3:10,
                      type = "expression",
                      rule = ">2")
#"colourScale"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = c("pink", "blue", "yellow"),
                      cols = 5, rows = 3:10,
                      type = "colourScale",
                      rule = c(1, 3, 6))
#"databar"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = c("pink", "blue"),
                      cols = 7, rows = 3:10,
                      type = "databar")
#"duplicates"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = CellStyle,
                      cols = 9, rows = 3:10,
                      type = "duplicates")
#"contains"/"notcontainsText"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = CellStyle,
                      cols = 11, rows = 3:10,
                      type = "contains",
                      rule = "oo")
#"between"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = CellStyle,
                      cols = 3, rows = 13:20,
                      type = "between",
                      rule = c(2, 4))
#"beginsWith"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = CellStyle,
                      cols = 5, rows = 13:20,
                      type = "beginsWith",
                      rule = "か")
#"endsWith"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = CellStyle,
                      cols = 7, rows = 13:20,
                      type = "endsWith",
                      rule = "d")
#"topN"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = CellStyle,
                      cols = 9, rows = 13:20,
                      type = "topN",
                      rank = 3)
#"bottomN"
conditionalFormatting(wb = TestWb, sheet = 1,
                      style = CellStyle,
                      cols = 11, rows = 13:20,
                      type = "bottomN",
                      rank = 3)

setColWidths(wb = TestWb, sheet = 1,
             cols = c(3:11),
             widths = rep(c(23, 2.86), length = 9))

saveWorkbook(wb = TestWb,
             file = "KARADAGOOD.xlsx",
             overwrite = TRUE)

Output Example

・Ruled line style and position

・Conditional format


I hope this makes your analysis a little easier !!

Copied title and URL