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


85

여러 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에서 쉽게 수행 할 수있는 방법이 있어야합니다.


3
xlsx 에 대해 잘못되었습니다 . createSheet새 시트를 만든 다음 루프에서 쓸 수 있는 기능이 있습니다. 또한 XLConnect 의 동등한 기능 이 벡터화되어 데이터 프레임 목록을 여러 시트에 쓸 수 있습니다.
joran 2014

@joran, createSheet는 write.xlsx가 아닌 addDataFrame과 함께 사용됩니까? 문서의 앞부분에서 보았지만 전체 프로세스를 파악할 수 없었습니다.
Ogre Magi

답변:


144

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 소프트웨어를 사용하여 쉽게 엑셀 파일을 포맷


xlsx첫 번째 행 R의 숫자를 처리하지 않습니다. openxlsx그들을 제거하십시오.
buhtz

1
row.names=FALSE행 이름을 제거하려면 추가하십시오 .
eipi10

@EcologyTom 난에서 전환 xlsxopenxlsx나는 그것이 훨씬 더 직관적으로 찾을 수 있으며 또한 자바 의존성을 피할 수로, 잠시 뒤.
eipi10

예, Java 종속성으로 인해 동일한 전환이 필요했습니다. 코드가 조금 더 길지만 매우 간단합니다. openxlsx버전 4.0 의 방법은 아래의 보충 답변을 참조하십시오.
EcologyTom

2
그냥 나입니까, 아니면 시트 2가이 코드를 사용할 때 시트 1 위에 쓰기 만합니까?
NewBee

88

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

3
이 패키지를 사용 openxlsx했으며 C ++보다 가장 빠르다고 생각합니다 . XlConnectRAM을 먹을 것입니다. xlsx와 사이의 벤치마킹을 원할 수도 있습니다openxlsx
Hanjo Jo'burg Odendaal

2
이 패키지의 또 다른 장점은 첫 번째 행의 R 번호 지정을 처리한다는 것입니다.
buhtz

4
고마워요, openxlsx::write.xlsx갈 길입니다 ... 저는 11 장의 시트를 저장했습니다. 각각 20,000x10 데이터 프레임입니다. 두 xlsx::write.xlsx번째 시트를 추가 한 후 오류 가 발생하는 동안 몇 초만에 완료 되었습니다java.lang.OutOfMemoryError: Java heap space
Djork

append=TRUE한 번에 여러 시트를 하나의 Excel 파일에 쓰도록 write.xlsx에 매개 변수를 추가해야 했습니다.
mondano

아름다운! 루프의 일부로 목록을 생성하고 초기화 ( list_of_dfs <- list()) 한 다음 루프 ( list_of_dfs[[temp_key]] = temp_df) 중에 생성 된 temp_key 및 temp_df를 사용하여 채웠습니다 . 16 장을 만들어야 했음에도 불구하고 쓰기가 매우 빠릅니다! 창조 중에 기억 문제를 목격 한 사람이 있습니까?
Lionel Trebuchon 19-06-24

30

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

1
감사! 이것은 openxlsx가 작동하지 않은 곳에서 작동했습니다 (직장에서 rtools를 설치할 수 없습니다).
Ape 2011

이를 위해 어떤 버전을 사용합니까? 기본 크랑 다운로드가 (아직) 여러 시트를 지원하지 않습니다 : 'writexl :: write_xlsx (목록에서 오류 (... 인수 X는 데이터 프레임의 데이터 프레임 또는 목록이어야합니다'
JAD

내가 쓴 것처럼 dev 버전.
Giora Simchoni 2017

@JarkoDubbeldam : 나는 cran에서 내 것을 설치했고 여러 시트가 나를 위해 작동합니다 (R 3.3.0). 목록 내의 개체가 data.frames인지 확인하십시오.
Ape 2011

이것은 정말 작동합니다. r에 xlsx를 설치할 수 없습니다.
Cina

20

여기에 많은 좋은 대답이 있지만 일부는 약간 날짜가 있습니다. 단일 파일에 더 많은 워크 시트를 추가하려는 경우 이것이 저에게 적합한 방법입니다. 명확성을 위해 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빠르고 쉬운 내보내기 방법을 원한다면 아마도 가장 간단 할 것입니다.


8

나는 패키지에 익숙하지 않다 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 .

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

여기에 이미지 설명 입력

여기에 이미지 설명 입력

여기에 이미지 설명 입력


1
XLConnect를 사용하지 않았습니다. 매우 상세한 예입니다. 감사합니다!
Ogre Magi

천만에요-매우 유용한 패키지라는 것을 알았습니다. CRAN 에는 몇 가지 주요 기능을 자세히 설명 하는 꽤 좋은 비 네트가 있으며, 섹션 4의 멋진 예제는 R 플롯을 워크 시트에 작성하는 방법을 보여줍니다.
nrussell 2014

5

데이터 크기가 작은 경우 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 내에서 사용자 지정 서식 지정을위한 많은 옵션이 있습니다.

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


3

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

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에 쓸 데이터 프레임이 많은 경우 수동으로 매우 긴 목록을 만들 필요가 없습니다.


2
나는 이것이 첫 번째 워크 시트를 덮어 쓰는 이유를 모른다
Lunalo 존에게

1

나는 모든 종류의 수출을 위해 포장 된 rio 를 정기적으로 사용합니다 . rio를 사용하여 목록을 입력하고 각 탭의 이름을 지정하고 데이터 세트를 지정할 수 있습니다. rio는 다른 인 / 아웃 패키지를 컴파일하고 Excel로 내보내기 위해 openxlsx를 사용합니다.

library(rio)

filename <- "C:/R_code/../file.xlsx"

export(list(sn1 = tempTable1, sn2 = tempTable2, sn3 = tempTable3), filename)

0

나를 위해 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

이 패키지는 작동하지만 IMHO는 xlsx설정하기가 더 어렵 기 때문에 펄의 종속성을 피하려고합니다 (Java의 종속성을 피하려고했던 것처럼 )
R Yoda

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

loadWorkbook는 기존의 파일을 여는 여기 열쇠입니다
makarand kulkarni은

또한 수식을 Excel로 작성하려면 writeFormula라는 다른 함수가 있습니다. 또한 수식을 작성하면 파일을 새로 고치거나 다시 연 다음 Excel에서 저장 한 다음 닫아야합니다. 데모 [링크 (여기 주어진 stackoverflow.com/questions/46914303/... )
makarand kulkarni

0

나는 항상 이것을한다.

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 루틴이 여기에 더 좋을 것입니다.


0

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

1
이 답변에 대한 설명을 추가하여 질문에 대한 답변을 제공 할 수 있습니까?
tshimkus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.