我很惊讶地发现没有简单的方法将多个data.frame导出到excel文件的多个工作表中?我试过xlsx包,看来它只能写一张表(覆盖旧表); 我也试过WriteXLS包,但它一直给我错误...
我的代码结构是这样的:按照设计,对于每次迭代,输出数据帧(tempTable)和sheetName(sn)都已更新并导出到一个选项卡中.
for (i in 2 : ncol(code)){
...
tempTable <- ...
sn <- ...
WriteXLS("tempTable", ExcelFileName = "C:/R_code/../file.xlsx",
SheetNames = sn);
}
Run Code Online (Sandbox Code Playgroud)
我可以导出到几个cvs文件,但在excel中必须有一个简单的方法,对吧?
提前致谢.
eip*_*i10 120
您可以使用xlsx包写入多个工作表.您只需要sheetName为每个数据框使用不同的,您需要添加append=TRUE:
library(xlsx)
write.xlsx(dataframe1, file="filename.xlsx", sheetName="sheet1", row.names=FALSE)
write.xlsx(dataframe2, file="filename.xlsx", sheetName="sheet2", append=TRUE, row.names=FALSE)
Run Code Online (Sandbox Code Playgroud)
另一个选项,一个可以让您更好地控制格式和数据框放置位置的选项,是在R/xlsx代码中执行所有操作,然后在最后保存工作簿.例如:
wb = createWorkbook()
sheet = createSheet(wb, "Sheet 1")
addDataFrame(dataframe1, sheet=sheet, startColumn=1, row.names=FALSE)
addDataFrame(dataframe2, sheet=sheet, startColumn=10, row.names=FALSE)
sheet = createSheet(wb, "Sheet 2")
addDataFrame(dataframe3, sheet=sheet, startColumn=1, row.names=FALSE)
saveWorkbook(wb, "My_File.xlsx")
Run Code Online (Sandbox Code Playgroud)
如果你觉得它很有用,这里有一些有趣的辅助函数,可以更容易地使用以下格式向电子表格添加格式,元数据和其他功能xlsx:http:
//www.sthda.com/english/wiki/r2excel-read-write -和格式,易于Excel的文件-使用-R软件
小智 58
您还可以使用openxlsx库将多个数据集导出到单个工作簿中的多个工作表.opexxlsx优于xlsx的优点是openxlsx删除了对java库的依赖关系.
使用列表名称作为工作表名称,将data.frames列表写入单个工作表.
require(openxlsx)
list_of_datasets <- list("Name of DataSheet1" = dataframe1, "Name of Datasheet2" = dataframe2)
write.xlsx(list_of_datasets, file = "writeXLSX2.xlsx")
Run Code Online (Sandbox Code Playgroud)
Gio*_*oni 21
镇上有一个新的图书馆,来自rOpenSci:writexl
基于libxlsxwriter的xlsx导出器的便携,轻量级数据框架.不需要Java或Excel
我发现它比上面的建议更好,更快(使用开发版本):
library(writexl)
sheets <- list("sheet1Name" = sheet1, "sheet2Name" = sheet2) #assume sheet1 and sheet2 are data frames
write_xlsx(sheets, "path/to/location")
Run Code Online (Sandbox Code Playgroud)
Eco*_*Tom 14
这里有很多好的答案,但其中一些有点过时了.如果您想将更多工作表添加到单个文件中,那么这就是我觉得适合我的方法.为清楚起见,这是openxlsx4.0版的工作流程
# Create a blank workbook
OUT <- createWorkbook()
# Add some sheets to the workbook
addWorksheet(OUT, "Sheet 1 Name")
addWorksheet(OUT, "Sheet 2 Name")
# Write the data to the sheets
writeData(OUT, sheet = "Sheet 1 Name", x = dataframe1)
writeData(OUT, sheet = "Sheet 2 Name", x = dataframe2)
# Export the file
saveWorkbook(OUT, "My output file.xlsx")
Run Code Online (Sandbox Code Playgroud)
编辑
我现在已经尝试了其他一些答案,我其实非常喜欢@ Syed的.它没有利用所有的功能,openxlsx但如果你想要一个快速简便的导出方法,那么这可能是最直接的.
我对包裹不熟悉WriteXLS; 我一般用XLConnect:
library(XLConnect)
##
newWB <- loadWorkbook(
filename="F:/TempDir/tempwb.xlsx",
create=TRUE)
##
for(i in 1:10){
wsName <- paste0("newsheet",i)
createSheet(
newWB,
name=wsName)
##
writeWorksheet(
newWB,
data=data.frame(
X=1:10,
Dataframe=paste0("DF ",i)),
sheet=wsName,
header=TRUE,
rownames=NULL)
}
saveWorkbook(newWB)
Run Code Online (Sandbox Code Playgroud)
这肯定可以像@joran上面提到的那样进行矢量化,但仅仅是为了快速生成动态工作表名称,我使用for循环来演示.
我使用了这个create=TRUE参数,loadWorkbook因为我创建了一个新的.xlsx文件,但是如果你的文件已经存在,那么你不必指定它,因为默认值是FALSE.
以下是创建的工作簿的一些屏幕截图:



小智 7
我经常使用打包的rio来导出各种类型的内容。使用 rio,您可以输入一个列表,命名每个选项卡并指定数据集。rio 编译其他输入/输出包,并使用 openxlsx 导出到 Excel。
library(rio)
filename <- "C:/R_code/../file.xlsx"
export(list(sn1 = tempTable1, sn2 = tempTable2, sn3 = tempTable3), filename)
Run Code Online (Sandbox Code Playgroud)
如果数据量很小,R具有许多可根据您的要求使用的软件包和功能。
write.xlsx,write.xlsx2,XLconnect也可以完成工作,但是与openxlsx相比,这些有时速度较慢。
因此,如果您处理的是大型数据集,并且遇到了Java错误。我建议看看“ openxlsx”,它真的很棒,可以将时间减少到1/12。
我已经进行了全部测试,最后,openxlsx功能的性能给我留下了深刻的印象。
以下是将多个数据集写入多个工作表的步骤。
install.packages("openxlsx")
library("openxlsx")
start.time <- Sys.time()
# Creating large data frame
x <- as.data.frame(matrix(1:4000000,200000,20))
y <- as.data.frame(matrix(1:4000000,200000,20))
z <- as.data.frame(matrix(1:4000000,200000,20))
# Creating a workbook
wb <- createWorkbook("Example.xlsx")
Sys.setenv("R_ZIPCMD" = "C:/Rtools/bin/zip.exe") ## path to zip.exe
Run Code Online (Sandbox Code Playgroud)
Sys.setenv(“ R_ZIPCMD” =“ C:/Rtools/bin/zip.exe”)必须是静态的,因为它引用了Rtools的某些实用程序。
注意:如果您的系统上未安装Rtools,请先安装Rtools以获得流畅的体验。这是供您参考的链接:(选择适当的版本)
https://cran.r-project.org/bin/windows/Rtools/ 根据下面的链接检查选项(安装时需要选中所有复选框)
https://cloud.githubusercontent.com/assets/7400673/12230758/99fb2202-b8a6-11e5-82e6-836159440831.png
# Adding a worksheets : parameters for addWorksheet are 1. Workbook Name 2. Sheet Name
addWorksheet(wb, "Sheet 1")
addWorksheet(wb, "Sheet 2")
addWorksheet(wb, "Sheet 3")
# Writing data in to respetive sheets: parameters for writeData are 1. Workbook Name 2. Sheet index/ sheet name 3. dataframe name
writeData(wb, 1, x)
# incase you would like to write sheet with filter available for ease of access you can pass the parameter withFilter = TRUE in writeData function.
writeData(wb, 2, x = y, withFilter = TRUE)
## Similarly writeDataTable is another way for representing your data with table formatting:
writeDataTable(wb, 3, z)
saveWorkbook(wb, file = "Example.xlsx", overwrite = TRUE)
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
Run Code Online (Sandbox Code Playgroud)
openxlsx软件包非常适合从excel文件中读取/写入大量数据,并且在excel中具有许多用于自定义格式的选项。
有趣的事实是,我们在这里不必担心Java堆内存。
小智 5
获取一个数据框并按组编写表格的整洁方法:
library(tidyverse)
library(xlsx)
mtcars %>%
mutate(cyl1 = cyl) %>%
group_by(cyl1) %>%
nest() %>%
ungroup() %>%
mutate(rn = row_number(),
app = rn != 1,
q = pmap(list(rn,data,app),~write.xlsx(..2,"test1.xlsx",as.character(..1),append = ..3)))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
110357 次 |
| 最近记录: |