複数のdata.frameを複数のExcelワークシートにエクスポートする簡単な方法


88

複数のdata.frameをExcelファイルの複数のワークシートにエクスポートする簡単な方法がないことに驚いていますか?xlsxパッケージを試しましたが、1枚のシートにしか書き込めないようです(古いシートを上書きします)。WriteXLSパッケージも試しましたが、いつもエラーが発生します...

私のコード構造は次のようなものです。設計上、反復ごとに、出力データフレーム(tempTable)とsheetName(sn)が更新され、1つのタブにエクスポートされました。

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 2014

回答:


149

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

便利な場合に備えて、httpxlsx: //www.sthda.com/english/wiki/r2excel-read-writeを使用して、スプレッドシートにフォーマット、メタデータ、その他の機能を簡単に追加できる興味深いヘルパー関数をいくつか紹介します。 -and-format-easily-excel-files-using-r-software


xlsxそこに置かれている最初の行Rの数字は処理しません。openxlsxそれらを削除します。
buhtz 2016

1
row.names=FALSE行名を削除するには追加します。
eipi10 2016

@EcologyTomずっと直感的で、Javaの依存関係も回避できるので、しばらく前に切り替えxlsxましopenxlsxた。
eipi 1018年

はい、Javaの依存関係により、同じ切り替えを行う必要がありました。コードは少し長くなりますが、かなり簡単です。openxlsxバージョン4.0のメソッドについては、以下の補足回答を参照してください。
EcologyTom

6
それは私だけですか、それともこのコードを使用するときにシート2がシート1を上書きするだけですか?
NewBee

94

openxlsxライブラリを使用して、1つのブック内の複数のシートに複数のデータセットをエクスポートすることもできます.xlsxに対するopenxlsxの利点は、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")

3
私はこれらのパッケージを使用しましたopenxlsxが、C ++としては最速だと思います。XlConnectRAMを使い果たします。xlsxとの間でベンチマークを実行することをお勧めしますopenxlsx
Hanjo Jo'burg Odendaal 2016

2
このパッケージのもう1つの利点は、最初の行のR番号を処理することです。
buhtz 2016

4
おかげで、openxlsx::write.xlsx行く方法です...私は11枚のシートを保存していました。それぞれ20,000x10のデータフレームでxlsx::write.xlsx、2枚目のシートにjava.lang.OutOfMemoryError: Java heap space
Djork 2017年

append=TRUE1つのExcelファイルに一度に複数のシートを書き込むようにwrite.xlsxにパラメーターを追加する必要がありました
mondano 2017年

美しい!ループの一部としてリストを作成し、ループ中に作成されたlist_of_dfs <- list()temp_keyとtemp_dfを使用してリストを初期化()してから入力する必要がありました(list_of_dfs[[temp_key]] = temp_df)。私が作成する必要があった16枚のシートにもかかわらず、それはまた、書くのが非常に速かったです!作成中にメモリの問題を目撃した人はいますか?
ライオネルトレブション

32

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をインストールできません)。
類人猿

これにはどのバージョンを使用しますか?デフォルトのクランダウンロードは(まだ)複数のシートをサポートしていません: 'writexl :: write_xlsx(list(...:引数xはデータフレームまたはデータフレームのリストである必要があります'
JAD

私が書いたように、開発バージョン。
Giora Simchoni 2017年

@JarkoDubbeldam:クランからインストールしましたが、複数のシートで動作します(R3.3.0)。リスト内のオブジェクトがdata.framesであるかどうかを確認します。
類人猿

これは本当に機能するものです。rにxlsxをインストールできませんでした。
シナ

22

ここには多くの良い答えがありますが、そのうちのいくつかは少し時代遅れです。1つのファイルにさらにワークシートを追加したい場合は、これが私にとって有効なアプローチです。わかりやすくするために、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が本当に好きです。のすべての機能を活用しているわけではありません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 2014

どういたしまして-私はそれが非常に便利なパッケージであることがわかりました。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ファイルとの間で巨大なデータを読み書きするのに非常に優れており、Excel内でカスタムフォーマットを行うための多くのオプションがあります。

興味深い事実は、ここではJavaヒープメモリについて気にする必要がないということです。


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に書き込むデータフレームが大量にある場合に、非常に長いリストを手動で作成する必要がなくなります。


3
これが最初のワークシートを上書きしている理由がわかりません
LunaloJohn19年

これはシートを上書きします、私と他の人も同様に問題に直面しました。ここを見て- stackoverflow.com/questions/57278418/...
Skurup

2

私は定期的にパッケージ化されたrioをあらゆる種類のエクスポートに使用しています。rioを使用すると、リストを入力し、各タブに名前を付け、データセットを指定できます。rioは他のin / outパッケージをコンパイルし、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

  • データフレームのリスト。各フレームは1枚のシートに書き込まれます。
  • (Rオブジェクトの)文字ベクトル、各オブジェクトは1枚のシートに書き込まれます
  • 他の何か、そしてヘルプが述べていることも見てください:

使用法の詳細

?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.framesを収集しWriteXLS、ループが終了した後に使用する必要があります。

セッション情報

  • R 3.2.4
  • WriteXLS 4.0.0

このパッケージは機能しますがxlsx、セットアップがより困難になるため、perlの依存関係を回避しようとします(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は、既存のファイルを開くための鍵です
makarandkulkarni18年

また、Excelで数式を記述したい場合は、writeFormulaという名前の別の関数があります。さらに、数式を記述したら、ファイルを更新または再度開いて保存し、Excelで閉じる必要があります。デモはここにあります[link(stackoverflow.com/questions/46914303/…
makarandkulkarni18年

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

ラップに優しいバージョンの場合。

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.