openxlsx::write.xlsx 覆盖现有工作表而不是追加
openxlsx::write.xlsx 覆盖现有工作表而不是追加
openxlsx::write.xlsx
函数正在覆盖电子表格,而不是添加另一个选项卡。\n我尝试按照Stackoverflow的一些指导方针,但没有成功。\n
dt.escrita <- format(Sys.time(), '%Y%m%d%H%M%S') write.xlsx( tbl.messages ,file = paste('.\\2_Datasets\\messages_',dt.escrita,'.xlsx') ,sheetName = format(Sys.time(), '%d-%m-%y') ,append = FALSE) write.xlsx( tbl.dic.dados ,file = paste('.\\2_Datasets\\messages_',dt.escrita,'.xlsx') ,sheetName = 'Dicionario_Dados' ,append = TRUE)
\n一个包含两个选项卡的电子表格,分别命名为30-07-19和Dicionario_Dados。
问题出现的原因是在使用openxlsx包中的write.xlsx函数时,如果目标文件已经存在且包含同名的工作表,则默认的行为是覆盖已有的工作表,而不是将新的数据追加到工作表的末尾。
要解决这个问题,可以通过设置append参数为TRUE来将新的数据追加到工作表的末尾。具体的解决方法如下:
library(openxlsx) df_lst <- setNames(list(tbl.messages, tbl.dic.dados), as.list(c(format(Sys.time(), '%d-%m-%y'), 'Dicionario_Dados'))) write.xlsx(df_lst, file = paste0('.\\2_Datasets\\messages_',dt.escrita,'.xlsx'), append = TRUE)
通过将append参数设置为TRUE,可以确保新的数据被追加到现有工作表的末尾,而不是覆盖已有的工作表。这样可以避免数据的丢失并保留已有数据。
在上述代码中,使用了openxlsx包的write.xlsx函数将两个不同的dataframe写入同一个xlsx文件的不同sheet中。第一个dataframe被写入到名为"sheet1"的sheet中,而第二个dataframe被写入到名为"sheet2"的sheet中,并使用了append=TRUE参数来实现在已有sheet后追加写入数据的功能。
然而,通过openxlsx包的write.xlsx函数无法实现在已有sheet后追加写入数据的功能,而是会覆盖已有sheet中的数据。这是因为openxlsx包的write.xlsx函数并没有提供类似xlsx包的append参数来控制是否追加写入数据。
要解决这个问题,可以使用openxlsx包的loadWorkbook函数先加载已有的xlsx文件,然后使用addWorksheet函数添加新的sheet,最后使用writeData函数将数据写入新的sheet中。具体代码如下:
library(openxlsx) wb <- loadWorkbook("filename.xlsx") addWorksheet(wb, "sheet2") writeData(wb, "sheet2", dataframe2) saveWorkbook(wb, "filename.xlsx", overwrite = TRUE)
通过以上代码,首先使用loadWorkbook函数加载已有的xlsx文件,然后使用addWorksheet函数在加载的workbook中添加一个名为"sheet2"的新sheet,接着使用writeData函数将dataframe2的数据写入到"sheet2"中。最后,使用saveWorkbook函数将修改后的workbook保存回原始的xlsx文件中,并通过overwrite参数来覆盖已有文件。这样就实现了在已有sheet后追加写入数据的功能。
需要注意的是,这里的writeData函数是openxlsx包中的函数,用于将数据写入到指定的sheet中。而不同于xlsx包中的write.xlsx函数,openxlsx包中的write.xlsx函数仅用于将dataframe写入到新创建的xlsx文件中的指定sheet中,并不支持追加写入数据的功能。
问题出现的原因是在使用openxlsx包中的write.xlsx函数时,没有提供append参数来追加数据到现有的工作表中。解决方法是使用writeData函数,并通过指定startRow参数来确定数据的起始行,以实现将数据追加到现有工作表中的效果。
具体来说,可以按照以下步骤解决问题:
1. 首先,创建一个新的工作簿对象wb,并使用addWorksheet函数创建两个工作表mtcars1和mtcars2。
2. 然后,使用writeData函数将mtcars1的数据写入到mtcars1工作表的第一行第一列。
3. 接下来,使用writeData函数将mtcars2的数据追加到mtcars2工作表的最后一行。
4. 最后,使用saveWorkbook函数将修改后的工作簿保存为excel_test.xlsx文件,并设置overwrite参数为TRUE来覆盖现有的文件。
此外,在更新中提到了使用write.xlsx函数时的一些注意事项。首先,write.xlsx函数没有append参数,因此无法直接实现追加数据到现有工作表的功能。其次,在调用write.xlsx函数时,即使传入了未知的参数,函数也不会报错。
在第二次更新中,提供了另一种追加数据到现有工作表的方法。首先,使用loadWorkbook函数读取现有的excel_test.xlsx文件,并获取现有工作表的行数。然后,将行数加1,并将其作为startRow参数传递给writeData函数,从而实现将数据追加到现有工作表的功能。最后,使用saveWorkbook函数保存修改后的工作簿,并设置overwrite参数为TRUE来覆盖现有文件。
需要注意的是,在使用writeData函数后,文件中的列名会消失,因为原始文件中的第一行变为空。