Birden çok veri çerçevesini birden çok Excel çalışma sayfasına aktarmanın kolay yolu


88

Birden çok data.frame'i bir Excel dosyasının birden çok çalışma sayfasına aktarmanın kolay bir yolu olmadığını görünce şaşırdım mı? Xlsx paketini denedim , görünüşe göre sadece bir sayfaya yazabiliyor (eski sayfayı geçersiz kıl); WriteXLS paketini de denedim , ancak bana her zaman hata veriyor ...

Kod yapım şu şekildedir: tasarım gereği, her yineleme için çıktı veri çerçevesi (tempTable) ve sayfaAdı (sn) güncellendi ve tek bir sekmeye aktarıldı.

for (i in 2 : ncol(code)){ 
        ...
        tempTable <- ...
        sn <- ...
        WriteXLS("tempTable", ExcelFileName = "C:/R_code/../file.xlsx",
              SheetNames = sn);
}

Birkaç cvs dosyasına aktarabilirim, ancak bunu Excel'de yapmanın kolay bir yolu olmalı, değil mi?


3
Xlsx hakkında yanılıyorsunuz . createSheetBir döngü içinde yeni sayfalar oluşturmanıza ve ardından bunlara yazmanıza izin veren bir işlev vardır . Ek olarak, XLConnect'teki eşdeğer işlevler , veri çerçevelerinin bir listesinin birden çok sayfaya yazılmasına izin verecek şekilde vektörleştirilmiştir.
joran

@joran, createSheet addDataFrame ile birlikte kullanılır write.xlsx? Bunu daha önce belgede görmüştüm ama tüm süreci çözemedim.
Ogre Magi

Yanıtlar:


149

İle birden çok sayfaya yazabilirsiniz. xlsxPaket . sheetNameHer veri çerçevesi için sadece farklı bir çerçeve kullanmanız ve eklemeniz gerekir 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)

Biçimlendirme ve veri çerçevesinin nereye yerleştirildiği üzerinde size daha fazla denetim sağlayan başka bir seçenek de, her şeyi R / xlsx kodu içinde yapmak ve ardından çalışma kitabını en sonunda kaydetmektir. Örneğin:

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

Eğer yararlı buluyorum olabilir, burada daha kolay kullanarak e-tablolar için, biçimlendirme meta veriler ve diğer özellikler eklemeyi kolaylaştırır bazı ilginç yardımcı işlevler şunlardır xlsx: http://www.sthda.com/english/wiki/r2excel-read-write -ve-format-kolayca-excel-dosyaları-kullanarak-r-yazılımı


xlsxoraya ilk satırdaki R koyan sayılarla ilgilenmez. openxlsxonları kaldır.
buhtz

1
row.names=FALSESatır adlarını kaldırmak için ekleyin .
eipi10

@EcologyTom Çok daha sezgisel bulduğum ve aynı zamanda java bağımlılığını da ortadan kaldırdığı xlsxiçin openxlsxbir süre öncesine geçtim.
eipi10

Evet, java bağımlılığı beni aynı değişikliği yapmaya zorladı. Kod biraz daha uzun olmasına rağmen oldukça basittir. openxlsx4.0 sürümüne sahip bir yöntem için aşağıdaki ek cevabıma bakın.
EcologyTom

6
Sadece ben miyim, yoksa bu kod kullanıldığında sayfa 2 basitçe 1. kağıda mı yazıyor?
NewBee

94

Tek bir çalışma kitabında birden çok veri kümesini birden çok sayfaya aktarmak için openxlsx kitaplığını da kullanabilirsiniz. Openxlsx'in xlsx'e göre avantajı, openxlsx'in java kitaplıkları üzerindeki bağımlılıkları kaldırmasıdır.

Liste adlarını çalışma sayfası adları olarak kullanarak ayrı çalışma sayfalarına data.frame'lerin bir listesini yazın.

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

3
Bu paketleri kullandım openxlsxve c ++ 'ın en hızlısı olduğunu düşünüyorum . XlConnectRAM'inizi yiyecek. Bazı kıyaslama arasında yapmak isteyebilirsiniz xlsxveopenxlsx
Hanjo Jo'burg Odendaal

2
Bu paketin bir diğer avantajı da ilk satırdaki R numaralandırmasına dikkat etmesidir.
buhtz

4
Teşekkürler, openxlsx::write.xlsxgitmenin yolu ... Her biri 20,000x10 veri çerçevesi olan 11 sayfa kaydediyordum, xlsx::write.xlsxikinci sayfayı java.lang.OutOfMemoryError: Java heap space
ekledikten

append=TRUEBir Excel dosyasına aynı anda birkaç sayfa yazmasını sağlamak için write.xlsx parametresini eklemem gerekiyordu
mondano

Güzel! list_of_dfs <- list()Listemi bir döngünün parçası olarak oluşturdum ve sadece onu ( ) başlatmak ve ardından loop ( list_of_dfs[[temp_key]] = temp_df) sırasında oluşturulan temp_key ve temp_df kullanarak doldurmak zorunda kaldım . Oluşturmam gereken 16 sayfaya rağmen yazı yazma konusunda da çok hızlıydı! Yaratma sırasında hafızayla ilgili sorunlara şahit olan oldu mu?
Lionel Trebuchon

32

Kasabada rOpenSci'den yeni bir kütüphane var: writexl

Libxlsxwriter tabanlı xlsx dışa aktarıcıya taşınabilir, hafif veri çerçevesi. Java veya Excel gerekmez

Yukarıdaki önerilerden daha iyi ve daha hızlı buldum (geliştirici sürümüyle çalışırken):

library(writexl)
sheets <- list("sheet1Name" = sheet1, "sheet2Name" = sheet2) #assume sheet1 and sheet2 are data frames
write_xlsx(sheets, "path/to/location")

1
Teşekkürler! Bu, openxlsx'in yapmadığı yerlerde çalıştı (işte rtools yükleyemiyorum).
Ape

Bunun için hangi sürümü kullanıyorsunuz? Varsayılan cran indirmesi (henüz) birden fazla sayfayı desteklemiyor: 'writexl :: write_xlsx'de hata (list (...: x bağımsız değişkeni bir veri çerçevesi veya veri çerçeveleri listesi olmalıdır' '
JAD

Yazdığım gibi, geliştirme sürümü.
Giora Simchoni

@JarkoDubbeldam: Benimkini vinçten kurdum ve birden fazla sayfa işime yarıyor (R 3.3.0). Listenizdeki nesnelerin data.frames olup olmadığını kontrol edin.
Ape

bu gerçekten işe yarıyor. xlsx'i r'ye yükleyemedi.
Cina

22

Burada pek çok iyi cevap var, ancak bazıları biraz eski. Tek bir dosyaya daha fazla çalışma sayfası eklemek istiyorsanız, benim için işe yaradığını bulduğum yaklaşım budur. Anlaşılır olması için, işte openxlsxsürüm 4.0 için iş akışı

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

DÜZENLE

Şimdi birkaç başka cevabı daha denedim ve gerçekten @ Syed's'ı seviyorum. Tüm işlevlerinden yararlanmaz, openxlsxancak hızlı ve kolay bir dışa aktarma yöntemi istiyorsanız, o zaman bu muhtemelen en basit olanıdır.


8

Pakete aşina değilim WriteXLS; Genelde kullanıyorum 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'ın yukarıda belirtildiği gibi, bu kesinlikle vektörleştirilebilir, ancak hızlı bir şekilde dinamik sayfa adları oluşturmak uğruna, forgöstermek için bir döngü kullandım .

Yeni bir .xlsx dosyası oluşturduğumdan beri create=TRUEargümanı kullandım loadWorkbook, ancak dosyanız zaten mevcutsa, varsayılan değer olduğu için bunu belirtmeniz gerekmez.FALSE .

İşte oluşturulan çalışma kitabının birkaç ekran görüntüsü:

görüntü açıklamasını buraya girin

görüntü açıklamasını buraya girin

görüntü açıklamasını buraya girin


1
XLConnect kullanmadım, çok detaylı örnek, teşekkürler!
Ogre Magi

Rica ederim - bunu çok kullanışlı bir paket olarak buldum. CRAN'da bazı ana özellikleri detaylandıran oldukça iyi bir vinyet var, 4. bölümde R grafiklerinin bir çalışma sayfasına nasıl yazılacağını gösteren güzel bir örnek var.
nrussell

5

Veri boyutunun küçük olması durumunda, R, ihtiyacınıza göre kullanılabilecek birçok paket ve işleve sahiptir.

write.xlsx, write.xlsx2, XLconnect de işi yapar, ancak bunlar openxlsx'e kıyasla bazen yavaştır .

Yani, büyük veri kümeleriyle uğraşıyorsanız ve java hatalarıyla karşılaştıysanız. "Openxlsx" e bir göz atmanızı öneririmGerçekten harika olan ve zamanı 1 / 12'ye düşüren .

Hepsini test ettim ve sonunda openxlsx yeteneklerinin performansından gerçekten etkilendim.

Birden çok veri kümesini birden çok sayfaya yazmanın adımları.

 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'tan bazı yardımcı programların referansını aldığı için statik olmalıdır.

Not: Incase Rtools sisteminize yüklenmemişse, lütfen sorunsuz bir deneyim için önce kurun. İşte referans için bağlantı: (uygun sürümü seçin)

https://cran.r-project.org/bin/windows/Rtools/ aşağıdaki bağlantıya göre seçenekleri kontrol edin (kurulum sırasında tüm onay kutularını seçmeniz gerekir)

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 paketi, excel dosyalarındaki / dosyalarındaki büyük verileri okumak ve yazmak için gerçekten iyidir ve excel içinde özel biçimlendirme için birçok seçeneğe sahiptir.

İlginç gerçek şu ki, burada java yığın belleği ile uğraşmak zorunda değiliz.


3

Tam olarak şu sorunu yaşadım ve şu şekilde çözdüm:

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

Bu şekilde, Excel'e yazacak tonlarca veri çerçeveniz varsa, elle çok uzun bir liste oluşturmanız gerekmez.


3
Bunun neden ilk çalışma sayfasının üzerine yazıldığını bilmiyorum
Lunalo John

Bu sayfanın üzerine yazıyor, ben ve diğerleri de sorunla karşı karşıya kaldık. Buraya bakın - stackoverflow.com/questions/57278418/…
Skurup

2

Her türlü ihracat için düzenli olarak paketlenmiş rio kullanıyorum . Rio'yu kullanarak, her sekmeyi adlandırarak ve veri kümesini belirterek bir liste girebilirsiniz. rio diğer giriş / çıkış paketlerini derler ve Excel'e dışa aktarmak için openxlsx kullanır.

library(rio)

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

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

0

Benim WriteXLSiçin aradığınız işlevselliği sağlar. Hangi hataları döndürdüğünü belirtmediğiniz için size bir örnek göstereceğim:

Misal

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

Açıklama

Eğer xise:

  • her biri tek bir sayfaya yazılan veri çerçevelerinin bir listesi
  • bir karakter vektörü (R nesnelerinin), her nesne tek bir sayfaya yazılır
  • başka bir şey varsa, yardımın ne söylediğine de bakın:

Kullanım hakkında daha fazla bilgi

?WriteXLS

gösterir:

`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.

Çözüm

Örneğiniz için, döngü sırasında bir listedeki tüm data.frames'leri toplamanız WriteXLSve döngü bittikten sonra kullanmanız gerekir .

Oturum bilgileri

  • R 3.2.4
  • Yaz XLS 4.0.0

Bu paket çalışacak ancak IMHO Perl bağımlılığından kaçınmaya çalışacağım (Java'nın bağımlılığından kaçınmaya çalışacağım gibi xlsx) çünkü kurulumu zorlaştırıyor
R Yoda

0

Aşağıdaki işlevi kullanarak openxlsx için bu şekilde yapıyorum

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 mevcut dosyaları açmak için anahtarı burada
Makarand kulkarni

Ayrıca, biri excel için formül yazmak isterse, writeFormula adında farklı bir işlev vardır, ayrıca formül yazdıktan sonra dosyanın yenilenmesi veya yeniden açılması, ardından kaydedilmesi ve ardından excel'de kapatılması gerekir. demo burada verilmiştir [link ( stackoverflow.com/questions/46914303/… )
makarand kulkarni

0

Bunu her zaman yapıyorum, tek yaptığım

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

ve tüm bu veri çerçeveleri buradan gelir

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

açıkçası saf rutin burada daha iyi olurdu


0

lapply dostu bir versiyon için ..

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
Soruyu nasıl yanıtladığına ilişkin bağlam sağlamak için bu yanıta bir açıklama ekleyebilir misiniz?
tshimkus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.