একাধিক এক্সেল ওয়ার্কশিটগুলিতে একাধিক ডেটা ফ্রেম রফতানি করার সহজ উপায়


88

আমি অবাক হয়ে জানতে পেরেছি যে এক্সেল ফাইলের একাধিক ওয়ার্কশিটে একাধিক ডাটা রফতানি করার সহজ উপায় নেই? আমি এক্সএলএসএক্স প্যাকেজ চেষ্টা করেছি , মনে হচ্ছে এটি কেবল একটি শীটে লিখতে পারে (পুরানো শীটটি ওভাররাইড); আমি রাইটিংএক্সএলএস প্যাকেজও চেষ্টা করেছিলাম , তবে এটি আমাকে সর্বদা ত্রুটি দেয় ...

আমার কোড কাঠামোটি এরকম: ডিজিট অনুসারে প্রতিটি পুনরাবৃত্তির জন্য, আউটপুট ডেটাফ্রেম (টেম্পটেবল) এবং শিটনাম (স্ন) আপডেট হয়ে যায় এবং একটি ট্যাবে রফতানি হয়।

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

আমি বেশ কয়েকটি সিভিএস ফাইলগুলিতে রফতানি করতে পারি, তবে এক্সেলের ক্ষেত্রে এটি করার একটি সহজ উপায় থাকতে হবে, তাই না?


4
আপনি xlsx সম্পর্কে ভুল । একটি createSheetফাংশন রয়েছে, যা আপনাকে নতুন শীট তৈরি করতে এবং তারপরে একটি লুপে লিখতে দেয়। অতিরিক্তভাবে, এক্সএলসিঙ্কনেটের সমতুল্য কার্যগুলি ভেক্টরাইজড হয়, একাধিক শীটে ডেটা ফ্রেমের তালিকা লেখার অনুমতি দেয়।
জোড়ান

@ জোরান, ক্রিয়েটশিটটি অ্যাডডাটাফ্রেমে লিখন.এক্সএলএসএক্স ব্যবহার করা হয় না? আমি ডকটিতে এটি দেখেছি কিন্তু পুরো প্রক্রিয়াটি বের করতে পারি নি।
ওগ্রে মাগি

উত্তর:


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)

আর একটি বিকল্প, যা আপনাকে ফর্ম্যাট করার উপর আরও নিয়ন্ত্রণ দেয় এবং যেখানে ডেটা ফ্রেম স্থাপন করা হয় তা হ'ল আর / এক্সএলএক্সএক্স কোডের মধ্যে সমস্ত কিছু করা এবং তারপরে শেষে ওয়ার্কবুকটি সংরক্ষণ করা। উদাহরণ স্বরূপ:

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 -আর-ফরম্যাট-সহজেই এক্সেল-ফাইল-ব্যবহার করে-সফ্টওয়্যার


xlsxসেখানে প্রথম সারিতে থাকা সংখ্যার যত্ন নেবে না। openxlsxএগুলো মুছে ফেলো.
বুট্টজ

4
row.names=FALSEসারি নাম মুছে ফেলার জন্য যুক্ত করুন ।
eipi10

@EcologyTom আমি থেকে সুইচ xlsxকরতে openxlsx, যখন ফিরে আমি এটা অনেক আরও বেশি ধারণাসম্পন্ন এটি এবং এটি জাভা নির্ভরতা এড়াতে।
eipi10

হ্যাঁ, জাভা নির্ভরতা আমাকে একই স্যুইচ করতে বাধ্য করেছিল। কোডটি কিছুটা দীর্ঘ হলেও এটি বেশ সোজা। openxlsxসংস্করণ ৪.০ সহ একটি পদ্ধতির জন্য নীচে আমার পরিপূরক উত্তরটি দেখুন।
ইকোলজি টম

6
যখন কেউ এই কোডটি ব্যবহার করেন তখন এটি কেবল আমি, বা শিট 2 কী শীট 1 এর উপরে লিখতে পারে?
নিউবি

94

আপনি একক ওয়ার্কবুকে একাধিক শিটের একাধিক ডেটাসেট রফতানি করতে ওপেনএক্সএলএক্স লাইব্রেরিটি ব্যবহার করতে পারেন ls এক্সএলএসএক্সের ওপেনএক্সএলএক্সএক্সের সুবিধা হ'ল ওপেনএক্সএলএক্স জাভা লাইব্রেরির উপর নির্ভরশীলতা সরিয়ে দেয়।

ওয়ার্কশিটের নাম হিসাবে তালিকার নাম ব্যবহার করে পৃথক কার্যপত্রকগুলিতে ডেটা.ফ্রেমগুলির একটি তালিকা লিখুন।

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

4
আমি এই প্যাকেজগুলি ব্যবহার করেছি এবং আমি মনে করি openxlsxএটির সি ++ এর চেয়ে দ্রুততম। XlConnectতোমার র‌্যাম খাবে আপনি হতে পারেন xlsxএবংopenxlsx
হানজো জো'বার্গ ওডেনডাল

4
এই প্যাকেজের আরেকটি সুবিধা হ'ল এটি প্রথম সারিতে থাকা আর-নাম্বারটি যত্ন করে।
বুটজ

4
ধন্যবাদ, openxlsx::write.xlsxযাবার উপায় ... আমি 11 টি শীট সংরক্ষণ করছিলাম, প্রতি 20,000x10 ডেটা ফ্রেম, সম্পন্ন হয়েছে কয়েক সেকেন্ডের মধ্যে যখন xlsx::write.xlsxদ্বিতীয় শীটটি যুক্ত করার পরে ভুল করা হয়েছেjava.lang.OutOfMemoryError: Java heap space
জোরক

আমার append=TRUEএকবারে এক্সেল ফাইলে একাধিক পত্রক লিখতে এটি তৈরি করতে আমার পরামিতিটি লেখার দরকার ছিল। Xlsx
সোমবার

সুদৃশ্য! আমি আমার তালিকাটি একটি লুপের অংশ হিসাবে তৈরি করেছি এবং কেবল এটি ( list_of_dfs <- list()) শুরু করতে হয়েছিল এবং তারপরে লুপ ( list_of_dfs[[temp_key]] = temp_df) এর সময় নির্মিত টেম্প_কি এবং টেম্প_ডিএফ ব্যবহার করে এটি পূরণ করতে হবে । আমার 16 টি শিট তৈরি করার পরেও এটি লেখার ক্ষেত্রে খুব দ্রুত ছিল! সৃষ্টির সময় কেউ কি স্মৃতি নিয়ে সমস্যা দেখেছেন?
লিওনেল ট্রেবুচন

32

শহরে একটি নতুন লাইব্রেরি রয়েছে, rOpenSci থেকে: Writxl

পোর্টেবল, হালকা ওজন ডেটা ফ্রেম থেকে xlsx রফতানিকারীর উপর নির্ভর করে libxlsxwriter। কোন জাভা বা এক্সেল প্রয়োজন

আমি উপরের পরামর্শগুলির চেয়ে এটি আরও ভাল এবং দ্রুত পেয়েছি (দেব সংস্করণে কাজ করা):

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

4
ধন্যবাদ! ওপেনএক্সএলএক্স যেখানে কাজ করে না সেখানে এটি কাজ করেছে (আমি কাজের জায়গায় আর্টোল ইনস্টল করতে পারি না)।
Ape

আপনি এর জন্য কোন সংস্করণ ব্যবহার করেন? ডিফল্ট ক্র্যান ডাউনলোড একাধিক পত্রক সমর্থন করে না (এখনও): 'Writxl :: write_xlsx এ ত্রুটি (তালিকা (...: আর্গুমেন্ট এক্স অবশ্যই ডেটা ফ্রেম বা ডেটা ফ্রেমের তালিকা হতে হবে)
জেএড

আমি যেমন লিখেছি, দেব সংস্করণ।
গিওরা সিমচনি

@ জারকো ডাবডেলডাম: আমি ক্রান থেকে আমার ইনস্টল করেছি এবং একাধিক পত্রক আমার জন্য কাজ করে (আর 3.3.0)। আপনার তালিকার ভিতরে থাকা অবজেক্টগুলি ডেটা.ফ্রেমস কিনা তা পরীক্ষা করে দেখুন।
এপি

এটি সত্যিই কাজ করে। r এ xlsx ইনস্টল করতে পারেনি।
সিনা

22

এখানে অনেক ভাল উত্তর, কিন্তু তাদের মধ্যে কিছুটা অল্প তারিখের। আপনি যদি কোনও একক ফাইলে আরও কার্যপত্রক যুক্ত করতে চান তবে এই পদ্ধতিটি আমার পক্ষে কাজ করে। স্পষ্টতার জন্য, এখানে 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)

এটি অবশ্যই ভেক্টরাইজড হতে পারে, যেমন উপরে উপরে উল্লিখিত @ জোরান, তবে কেবল গতিশীল শীটের নামগুলি দ্রুত তৈরি করার স্বার্থে, আমি একটি forলুপ ব্যবহার করে দেখিয়েছি।

আমি create=TRUEযুক্তিটি ব্যবহার করেছি loadWorkbookযেহেতু আমি একটি নতুন। Xlsx ফাইল তৈরি করছিলাম তবে যদি আপনার ফাইলটি ইতিমধ্যে বিদ্যমান থাকে তবে আপনাকে ডিফল্ট মান হিসাবে এটি নির্দিষ্ট করতে হবে না FALSE

এখানে তৈরি ওয়ার্কবুকের কয়েকটি স্ক্রিনশট রয়েছে:

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন

এখানে চিত্র বর্ণনা লিখুন


4
আমি এক্সএলসিঙ্কটি ব্যবহার করিনি, খুব বিশদ উদাহরণ, ধন্যবাদ!
ওগ্রে মাগি

আপনাকে স্বাগতম - আমি এটি একটি খুব দরকারী প্যাকেজ বলে মনে করেছি। একটা বেশ ভাল Cran উপর চিত্র ধারা 4 এ যে প্রধান বৈশিষ্ট্য কিছু বিবরণ, একটা চমৎকার উদাহরণ লেখ আর প্লট কিভাবে একটি কার্যপত্রকের মধ্যে প্রদর্শক।
নরসেল

5

ইনসেস ডেটা আকার ছোট, আর এর অনেকগুলি প্যাকেজ এবং ফাংশন রয়েছে যা আপনার প্রয়োজন অনুযায়ী ব্যবহার করা যেতে পারে।

write.xlsx, write.xlsx2, XLconnect এছাড়াও কাজ করে তবে ওপেনএক্সএলএক্সএক্সএক্সের তুলনায় এগুলি অনেক সময় ধীর হয় ।

সুতরাং, যদি আপনি বড় ডেটা সেটগুলি নিয়ে কাজ করে থাকেন এবং জাভা ত্রুটিগুলি জুড়ে এসেছেন। আমি "ওপেনএক্সএলএক্সএক্স" এর চেহারাটি দেখার পরামর্শ দিচ্ছি যা সত্যই দুর্দান্ত এবং সময়টি 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

সিস.সেটেনভ ("আর_জেআইপিসিএমডি" = "সি: / আরটুলস / বিিন / জাইপ.এক্সি") স্থির থাকতে হবে কারণ এটি রোলসের কিছু ইউটিলিটির রেফারেন্স নেয়।

দ্রষ্টব্য: 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

ওপেনএক্সএলএক্সএক্স প্যাকেজটি অ্যাক্সেল ফাইলগুলি থেকে / ইন এক্সেল ফাইলগুলি থেকে বিশাল ডেটা পড়তে এবং লেখার জন্য সত্যই ভাল এবং এক্সেলের মধ্যে কাস্টম ফর্ম্যাট করার জন্য প্রচুর বিকল্প রয়েছে।

মজার ঘটনাটি হ'ল আমাদের এখানে জাভা হিপ মেমরি নিয়ে মাথা ঘামাতে হবে না।


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

এক্সেলটিতে লেখার জন্য যদি আপনার কাছে প্রচুর ডেটাফ্রেম থাকে তবে আপনাকে ম্যানুয়ালি একটি দীর্ঘ তালিকা তৈরি করতে হবে না।


4
আমি জানি না কেন এটি প্রথম কার্যপত্রকটি ওভাররাইট করছে
লুনালো জন

এটি শীটটি ওভাররাইট করে, আমি এবং অন্যান্যরাও সমস্যার মুখোমুখি হয়েছি। এখানে দেখুন - stackoverflow.com/questions/57278418/…
স্কুরুপ

2

আমি নিয়মিত সমস্ত ধরণের রফতানির জন্য প্যাকেজযুক্ত রিও ব্যবহার করি । রিও ব্যবহার করে আপনি একটি তালিকা ইনপুট করতে পারবেন, প্রতিটি ট্যাবে নামকরণ এবং ডেটাসেট নির্দিষ্ট করে। রিও অন্যান্য / প্যাকেজ প্যাকেজগুলিকে সংকলন করে এবং এক্সেলে রফতানির জন্য ওপেনএক্সএলএক্সএক্স ব্যবহার করে।

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
  • WritXLS 4.0.0

এই প্যাকেজটি কাজ করবে তবে আইএমএইচও আমি পার্লের নির্ভরতা এড়াতে চেষ্টা করব (যেমন আমি জাভার নির্ভরতা এড়াতে চেষ্টা করব 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)
}

বিদ্যমান ফাইলগুলি খোলার জন্য লোড ওয়ার্কবুক এখানে মূল কী
কুলকার্নি

এছাড়াও যদি কেউ এক্সেল করার জন্য সূত্র লিখতে চান তবে রাইটফর্মুলা নামে আলাদা আলাদা ফাংশন রয়েছে, এছাড়াও আপনি একবার সূত্র লিখলে ফাইলটি রিফ্রেশ বা পুনরায় খোলার দরকার হয় সংরক্ষণ এবং পরে এক্সেলে বন্ধ করে দেওয়া। ডেমো এখানে দেওয়া হয়েছে [লিংক ( স্ট্যাকওভারফ্লো.com / জিজ্ঞাসা / 69৯69১৪30০৩/২ )
মকরান্দকুলকার্নি

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

একটি লম্পট-বান্ধব সংস্করণের জন্য ..

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

4
এই প্রশ্নের উত্তরটির কীভাবে প্রসঙ্গটি সরবরাহ করতে আপনি এই উত্তরে কিছু বর্ণনা যুক্ত করতে পারেন?
tshimkus
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.