कई एक्सेल वर्कशीट के लिए कई डेटा निर्यात करने का आसान तरीका


85

मुझे यह जानकर आश्चर्य हुआ कि एक एक्सेल फ़ाइल के कई कार्यपत्रकों में एकाधिक डेटा निर्यात करने का कोई आसान तरीका नहीं है? मैंने xlsx पैकेज की कोशिश की , ऐसा लगता है कि यह केवल एक शीट (पुरानी शीट को ओवरराइड) कर सकता है; मैंने भी WriteXLS पैकेज की कोशिश की , लेकिन यह मुझे हर समय त्रुटि देता है ...

मेरी कोड संरचना इस तरह है: प्रत्येक पुनरावृत्ति के लिए, आउटपुट डेटाफ्रेम (अस्थायी) और शीटनाम (एसएन) अपडेट किया गया और एक टैब में निर्यात किया गया।

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

मैं कई cvs फ़ाइलों को निर्यात कर सकता हूं, लेकिन एक्सेल में ऐसा करने का एक आसान तरीका है, है ना?


3
आप xlsx के बारे में गलत हैं । एक createSheetफ़ंक्शन है, जो आपको नई चादरें बनाने की अनुमति देता है, और फिर उन्हें लूप में लिखता है। इसके अतिरिक्त, XLConnect में समतुल्य कार्यों को सदिश किया जाता है, जिससे डेटा शीट की एक सूची को कई शीट में लिखने की अनुमति मिलती है।
joran

@joran, createSheet का उपयोग AddDataFrame के साथ नहीं किया गया है। xlsx? मैंने पहले देखा था कि डॉक्टर में, लेकिन पूरी प्रक्रिया का पता नहीं लगा सका।
ओगरे मागी

जवाबों:


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)

एक अन्य विकल्प, एक जो आपको स्वरूपण पर अधिक नियंत्रण देता है और जहां डेटा फ़्रेम रखा जाता है, वह है आर / 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वहाँ पहली पंक्ति में संख्याओं का ख्याल नहीं रख आर वहाँ डाल दिया। openxlsxउन्हें हटा दो।
buhtz

1
row.names=FALSEपंक्ति नामों को हटाने के लिए जोड़ें ।
eipi10

@EcologyTom मैं से बदल xlsxकरने के लिए openxlsx, एक समय पहले के रूप में मैं इसे और अधिक सहज ज्ञान युक्त पाते हैं और यह भी जावा निर्भरता से बचा जाता है।
eipi10

हां, जावा निर्भरता ने मुझे समान स्विच बनाने के लिए मजबूर किया। हालांकि कोड थोड़ा लंबा है यह बहुत सीधा है। openxlsxसंस्करण 4.0 के साथ एक विधि के लिए नीचे मेरा पूरक उत्तर देखें।
इकोलॉजीटम

2
क्या यह सिर्फ मेरे लिए है, या क्या शीट 2 बस शीट 1 पर लिखता है जब कोई इस कोड का उपयोग करता है?
न्यूबी

88

आप एक ही कार्यपुस्तिका में एकाधिक डेटासेट को निर्यात करने के लिए ओपनएक्सएलएक्स लाइब्रेरी का उपयोग कर सकते हैं। एक्सएलएक्स पर ओपनएक्सएलएसएक्स का लाभ यह है कि ओपनएक्सएलएक्सएक्स जावा पुस्तकालयों पर निर्भरता को हटा देता है।

कार्यपत्रक नामों के रूप में सूची नामों का उपयोग करके अलग-अलग कार्यपत्रकों के लिए 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 ++ जितना तेज है। XlConnectआपकी RAM खा जाएगी। आप के बीच कुछ बेंचमार्किंग करना चाहते हो सकता है xlsxऔरopenxlsx
Hanjo Jo'burg Odendaal

2
उस पैकेज का एक और फायदा यह है कि यह पहली पंक्ति में आर-नंबरिंग का ध्यान रखता है।
buhtz

4
धन्यवाद, openxlsx::write.xlsxजाने का रास्ता है ... मैं 11 शीट बचा रहा था, प्रत्येक 20,000x10 डेटाफ्रेम किया गया था, एक दो सेकंड के xlsx::write.xlsxलिए दूसरी शीट java.lang.OutOfMemoryError: Java heap space
अप्लाई

मुझे append=TRUEलिखने के लिए पैरामीटर जोड़ने की जरूरत थी। Xlsx को एक एक्सेल फाइल में एक ही बार में कई शीट लिखने के लिए
mondano

लवली! मैंने अपनी सूची को एक लूप के हिस्से के रूप में बनाया, और बस इसे इनिशियलाइज़ करना था ( list_of_dfs <- list()) और फिर इसे भरें, लूप के दौरान निर्मित temp_key और temp_df का उपयोग करके list_of_dfs[[temp_key]] = temp_df। यह लिखने में भी बहुत तेज था, 16 शीट के बावजूद मुझे बनाने की ज़रूरत थी! क्या किसी ने सृष्टि के दौरान स्मृति के साथ समस्याओं को देखा है?
लियोनेल ट्रेबुचॉन

30

शहर में एक नई लाइब्रेरी है, rOpenSci से: writexl

Libxlsxwriter पर आधारित xlsx निर्यातक के लिए पोर्टेबल, हल्के वजन वाले डेटा फ्रेम। कोई जावा या एक्सेल की आवश्यकता नहीं है

मैंने इसे उपरोक्त सुझावों (देव संस्करण के साथ काम करना) से बेहतर और तेज़ पाया:

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

1
धन्यवाद! यह काम किया है जहाँ Openxlsx नहीं था (मैं काम पर rtools स्थापित नहीं कर सकते हैं)।
एप

आप इसके लिए किस संस्करण का उपयोग करते हैं? डिफ़ॉल्ट क्रैन डाउनलोड कई शीट (अभी तक) का समर्थन नहीं करता है: 'लिखने में त्रुटि :: राइट_xlsx (सूची (...: तर्क x) डेटा फ़्रेम या डेटा फ़्रेम की सूची होनी चाहिए'
JAD

जैसा कि मैंने लिखा है, देव संस्करण।
जियोरा सिमोनी 13

@JarkoDubbeldam: मैंने क्रेन से खदान स्थापित की और कई शीट मेरे लिए काम करती हैं (आर 3.3.0)। जाँच करें कि क्या आपकी सूची के अंदर की वस्तुएँ data.frames हैं।
एप

यह वास्तव में काम करता है। r में xlsx स्थापित नहीं कर सका।
सीना

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

संपादित करें

अब मैंने कुछ अन्य उत्तर दिए हैं, और मुझे वास्तव में @ सैयद पसंद हैं। यह सभी कार्यक्षमता का फायदा नहीं उठाता है, 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 का उपयोग नहीं किया है, बहुत विस्तृत उदाहरण, धन्यवाद!
ओगरे मैगी

आपका स्वागत है - मैंने पाया है कि यह एक बहुत उपयोगी पैकेज है। सीआरएएन पर एक बहुत अच्छा विगनेट है जो कि कुछ मुख्य विशेषताओं का विवरण देता है, जिसमें अनुभाग 4 में एक अच्छा उदाहरण दिया गया है कि आर प्लॉट्स को एक वर्कशीट में कैसे लिखा जाए।
नृसल

5

Incase डेटा का आकार छोटा है, R में कई पैकेज और फ़ंक्शन हैं जो आपकी आवश्यकता के अनुसार उपयोग किए जा सकते हैं।

write.xlsx, write.xlsx2, XLconnect भी काम करते हैं लेकिन ये कभी-कभी ओपनएक्सएक्सएक्सएक्स की तुलना में धीमा होते हैं ।

तो, यदि आप बड़े डेटा सेट के साथ काम कर रहे हैं और जावा त्रुटियों के पार आए हैं। मैं "Openxlsx" का एक लुक देने का सुझाव दूंगा जो वास्तव में बहुत बढ़िया है और 1/12 वीं तक के समय को कम करता है।

मैंने सभी का परीक्षण किया है और अंत में मैं ओपनएक्सएलएक्सएक्स क्षमताओं के प्रदर्शन से वास्तव में प्रभावित हुआ।

यहाँ कई पत्रक में कई डेटासेट लिखने के चरण दिए गए हैं।

 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 से कुछ उपयोगिता का संदर्भ लेता है।

नोट: Incase 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 पैकेज एक्सेल फ़ाइलों में / से विशाल डेटा को पढ़ने और लिखने के लिए वास्तव में अच्छा है और एक्सेल के भीतर कस्टम स्वरूपण के लिए बहुत सारे विकल्प हैं।

दिलचस्प तथ्य यह है कि हमें यहां जावा हीप मेमोरी के बारे में परेशान नहीं करना है।


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

इस तरह आपको एक्सेल को लिखने के लिए बहुत सारी सूची मैन्युअल रूप से नहीं बनानी पड़ेगी यदि आपके पास बहुत सारे डेटाफ्रेम हैं।


2
मुझे नहीं पता कि यह पहली वर्कशीट पर क्यों लिख रहा है
लूनलो जॉन

1

मैं नियमित रूप से सभी प्रकार के निर्यात के लिए पैक किए गए रियो का उपयोग करता हूं । रियो का उपयोग करते हुए, आप एक सूची इनपुट कर सकते हैं, प्रत्येक टैब का नामकरण कर सकते हैं और डेटासेट निर्दिष्ट कर सकते हैं। rio अन्य / बाहर के पैकेजों को संकलित करता है, और Excel में निर्यात के लिए, ओपनएक्सएलएक्स का उपयोग करता है।

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है:

  • डेटा फ़्रेम की एक सूची, प्रत्येक को एक शीट पर लिखा जाता है
  • एक चरित्र वेक्टर (आर ऑब्जेक्ट्स का), प्रत्येक ऑब्जेक्ट को एक शीट पर लिखा जाता है
  • कुछ और, फिर यह भी देखें कि मदद क्या कहती है:

उपयोग पर अधिक

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

समाधान

अपने उदाहरण के लिए, आपको लूप के दौरान सभी डेटा.फ्रेम को एक सूची में एकत्र करना होगा, और WriteXLSलूप समाप्त होने के बाद उपयोग करना होगा ।

सत्र की जानकारी

  • आर 3.2.4
  • WriteXLS 4.0.0

यह पैकेज काम करेगा लेकिन IMHO मैं पर्ल की निर्भरता से बचने की कोशिश करूँगा (जैसा कि मैं जावा की निर्भरता से बचने की कोशिश करूँगा xlsx) क्योंकि यह सेट अप करने के लिए और अधिक कठिन बनाता है
आर योडा

0

मैं निम्नलिखित फ़ंक्शन का उपयोग करके ओपनएक्सएलएक्स के लिए इस तरह से करता हूं

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

लोडवर्क्सबुक मौजूदा फाइलों को खोलने के लिए यहाँ महत्वपूर्ण है
makarand kulkarni

इसके अलावा अगर कोई एक्सेल करने के लिए फॉर्मूला लिखना चाहता है तो राइटफोर्मुला नाम का एक अलग फंक्शन है, इसके अलावा एक बार फॉर्मूला लिखने के बाद फाइल को रिफ्रेश या रीओपन करना पड़ता है फिर सेव किया जाता है और फिर एक्सेल में बंद कर दिया जाता है। डेमो यहाँ दिया गया है [लिंक ( 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)
}

जाहिर है नीलम की दिनचर्या यहां बेहतर होगी


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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.