IT박스

여러 data.frame을 여러 Excel 워크 시트로 쉽게 내보내는 방법

itboxs 2020. 12. 6. 21:19
반응형

여러 data.frame을 여러 Excel 워크 시트로 쉽게 내보내는 방법


여러 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);
}

여러 cvs 파일로 내보낼 수 있지만 Excel에서 쉽게 수행 할 수있는 방법이 있어야합니다.


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)

서식 지정과 데이터 프레임이 배치되는 위치를보다 세부적으로 제어 할 수있는 또 다른 옵션은 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")

유용하다고 생각되는 경우 다음을 사용하여 스프레드 시트에 서식 지정, 메타 데이터 및 기타 기능을 쉽게 추가 할 수있는 몇 가지 흥미로운 도우미 기능이 있습니다 xlsx. http://www.sthda.com/english/wiki/r2excel-read-write -r- 소프트웨어를 사용하여 쉽게 엑셀 파일을 포맷


또한 openxlsx 라이브러리를 사용하여 여러 데이터 세트를 단일 통합 문서의 여러 시트로 내보낼 수 있습니다. xlsx에 비해 openxlsx의 장점은 openxlsx가 자바 라이브러리에 대한 종속성을 제거한다는 것입니다.

목록 이름을 워크 시트 이름으로 사용하여 개별 워크 시트에 data.frame 목록을 작성합니다.

require(openxlsx)
list_of_datasets <- list("Name of DataSheet1" = dataframe1, "Name of Datasheet2" = dataframe2)
write.xlsx(list_of_datasets, file = "writeXLSX2.xlsx")

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")

여기에 많은 좋은 대답이 있지만 일부는 약간 날짜가 있습니다. 단일 파일에 더 많은 워크 시트를 추가하려면 이것이 저에게 적합한 방법입니다. 명확성을 위해 openxlsx버전 4.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")

편집하다

나는 이제 몇 가지 다른 답변을 시험해 보았고 실제로 @Syed 's를 정말 좋아합니다. 의 모든 기능을 악용하지는 않지만 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)

@joran이 위에서 언급했듯이 이것은 확실히 벡터화 할 수 있지만 동적 시트 이름을 빠르게 생성하기 위해 for루프를 사용 하여 시연했습니다.

새 .xlsx 파일을 만들었 기 때문에 create=TRUE인수를 사용 loadWorkbook했지만 파일이 이미 존재하는 경우 기본값이이므로 지정할 필요가 없습니다 FALSE.

다음은 생성 된 통합 문서의 몇 가지 스크린 샷입니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

여기에 이미지 설명 입력


데이터 크기가 작은 경우 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

Sys.setenv ( "R_ZIPCMD"= "C : /Rtools/bin/zip.exe")는 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

openxlsx 패키지는 엑셀 파일에서 /에서 방대한 데이터를 읽고 쓰는 데 정말 좋으며 Excel 내에서 사용자 지정 서식 지정을위한 많은 옵션이 있습니다.

흥미로운 사실은 여기서 자바 힙 메모리에 대해 신경 쓸 필요가 없다는 것입니다.


나는이 정확한 문제가 있었고 다음과 같이 해결했습니다.

library(openxlsx) # loads library and doesn't require Java installed

your_df_list <- c("df1", "df2", ..., "dfn")

for(name in your_df_list){
  write.xlsx(x = get(name), 
             file = "your_spreadsheet_name.xlsx", 
             sheetName = name)
}

이렇게하면 Excel에 쓸 데이터 프레임이 많은 경우 수동으로 매우 긴 목록을 만들 필요가 없습니다.


나를 위해, WriteXLS당신이 찾고있는 기능을 제공합니다. 반환되는 오류를 지정하지 않았으므로 예를 보여 드리겠습니다.

library(WriteXLS)
x <- list(sheet_a = data.frame(a=letters), sheet_b = data.frame(b = LETTERS))
WriteXLS(x, "test.xlsx", names(x))

설명

다음과 같은 경우 x:

  • 데이터 프레임 목록, 각 프레임은 단일 시트에 기록됩니다.
  • (R 객체의) 문자형 벡터, 각 객체는 단일 시트에 기록됩니다.
  • 다른 것이 있으면 도움말에 나오는 내용도 참조하십시오.

사용법에 대해 더 알아보기

?WriteXLS

쇼 :

`x`: A character vector or factor containing the names of one or
     more R data frames; A character vector or factor containing
     the name of a single list which contains one or more R data
     frames; a single list object of one or more data frames; a
     single data frame object.

해결책

예를 들어 루프 중에 목록의 모든 data.frame을 수집 WriteXLS하고 루프가 완료된 후에 사용해야 합니다.

세션 정보

  • R 3.2.4
  • WriteXLS 4.0.0

나는 다음 기능을 사용하여 openxlsx에 대해 이런 식으로 수행합니다.

mywritexlsx<-function(fname="temp.xlsx",sheetname="Sheet1",data,
                  startCol = 1, startRow = 1, colNames = TRUE, rowNames = FALSE)
{
  if(! file.exists(fname))
    wb = createWorkbook()
  else
   wb <- loadWorkbook(file =fname)
  sheet = addWorksheet(wb, sheetname)

  writeData(wb,sheet,data,startCol = startCol, startRow = startRow, 
          colNames = colNames, rowNames = rowNames)
  saveWorkbook(wb, fname,overwrite = TRUE)
}

나는 항상 이것을한다.

WriteXLS::WriteXLS(
    all.dataframes,
    ExcelFileName = xl.filename,
    AdjWidth = T,
    AutoFilter = T,
    FreezeRow = 1,
    FreezeCol = 2,
    BoldHeaderRow = T,
    verbose = F,
    na = '0'
  )

모든 데이터 프레임은 여기에서

all.dataframes <- vector()
for (obj.iter in all.objects) {
  obj.name <- obj.iter
  obj.iter <- get(obj.iter)
  if (class(obj.iter) == 'data.frame') {
      all.dataframes <- c(all.dataframes, obj.name)
}

분명히 sapply 루틴이 여기에 더 좋을 것입니다.


lapply 친화적 인 버전 ..

library(data.table)
library(xlsx)

path2txtlist <- your.list.of.txt.files
wb <- createWorkbook()
lapply(seq_along(path2txtlist), function (j) {
sheet <- createSheet(wb, paste("sheetname", j))
addDataFrame(fread(path2txtlist[j]), sheet=sheet, startColumn=1, row.names=FALSE)
})

saveWorkbook(wb, "My_File.xlsx")

참고 URL : https://stackoverflow.com/questions/27713310/easy-way-to-export-multiple-data-frame-to-multiple-excel-worksheets

반응형