मैं कई कार्यपुस्तिका फाइलें (xlsx) खोलना चाहता हूं, कई स्प्रेडशीट के साथ, प्रत्येक सेल में सूत्रों को त्यागें और केवल डेटा को अंदर रखें। मैं इसे मैन्युअल रूप से करूँगा लेकिन कम से कम 500 कार्यपुस्तिकाओं के साथ मैं कार्य को स्वचालित करना चाहता हूं।

मैंने खुद को कई आंशिक समाधान पाया। शायद वीबीए के माध्यम से इसे करना सबसे आसान होगा, लेकिन मुझे नहीं पता कि उन निर्देशों को कैसे लिखना है। अन्य समाधान जो मैं प्रबंधित कर सकता था वह आर के माध्यम से होगा।

मैंने कई पैकेजों का परीक्षण किया, सबसे उपयोगी xlsx, दुर्भाग्य से मैं एक समय में केवल 1 स्प्रेडशीट को सहेज सकता हूं, और मेरे पास प्रति कार्यपुस्तिका 15 से अधिक है, और मुझे नहीं पता कि प्रत्येक स्प्रेडशीट को एक फ़ाइल (एक कार्यपुस्तिका) में कैसे संयोजित किया जाए।

अब तक मैंने जो समाधान निकाला है, वह है एक लूप के अंदर फाइलें खोलना, फिर उन्हें XLConnect के साथ फिर से सहेजना। मैंने एक लेखन-रहित-सूत्र की खोज की, यह जानते हुए कि खुला-बिना-सूत्र मौजूद है, लेकिन मैंने विकल्प खोजने का प्रबंधन नहीं किया ... क्या उन पैकेजों के साथ एक सरल समाधान है या क्या मुझे VBA में और जाना चाहिए?

आर में अस्थायी:

library("XLConnect")
wbdir <- setwd("C:/Users/blabla/Desktop/wbfiles")
wblist <- list.files(wbdir)

i <- 0L
for (i in 1:length(wblist)) {

        wb_formulas <- loadWorkbook(wblist[[i]])
        # something to overwriteformulas : opening witout formulas like xlsx/openxlsx package 
        # writing without ...
        wb_df <- saveWorkbook(wb_formulas, paste(c("wb_", i,".xlsx"),collapse = ""))
}
0
Ovidiu 24 अक्टूबर 2017, 18:38
1
VBA इसे आसानी से कर सकता है, और आप बिना दस्तावेज़ खोले भी ऐसा कर सकते हैं। एक्सेल उन्हें "केवल-पढ़ने के लिए" फ़ाइल के रूप में पढ़ सकता है ... मैंने एक त्वरित अच्छी खोज की और आपको आरंभ करने के लिए यह एक बेहतरीन संसाधन है encodedna.com/excel/…
 – 
Maldred
24 अक्टूबर 2017, 18:45
मैं वीबीए का उपयोग करूंगा। कार्यों को तोड़ो। पुस्तकों के माध्यम से लूप करें, फिर एक फ़ंक्शन चलाएं जो खुलता है, जानकारी की प्रतिलिपि बनाता है, अन्य पुस्तक में चिपकाता है, फिर नमूना पुस्तक को बंद कर देता है। हालांकि आप r का बहुत अच्छी तरह से उपयोग कर सकते हैं।
 – 
Preston
24 अक्टूबर 2017, 18:49
कृपया जो आपने पहले ही कोशिश की है उसका कोड पोस्ट करें
 – 
Tom M
24 अक्टूबर 2017, 18:54
संपादित संपादित @Maldred लिंक की जाँच कर रहा है, मैं कुछ आसान VBA कोड भी जाँचने की कोशिश करूँगा अगर इस भाग से बच नहीं सकता
 – 
Ovidiu
24 अक्टूबर 2017, 19:31

1 उत्तर

सबसे बढ़िया उत्तर

R के RDComclient पर विचार करें जो COM इंटरफ़ेस जहां आप आवश्यक फाइलों और संबंधित वर्कशीट के माध्यम से लूप के लिए आर का उपयोग कर सकते हैं और एक्सेल की अपनी विधियों का उपयोग कर सकते हैं (तृतीय-पक्ष पैकेज विधियों का नहीं), Range.Copy और Range.PasteSpecial, सूत्रों को छोड़ कर, सेल मानों की प्रतिलिपि बनाने के लिए।

सरल त्रुटियों के साथ भी प्रसंस्करण से बाहर निकलने के लिए नीचे की प्रक्रिया को tryCatch में लपेटा गया है। ध्यान दें: कुछ COMExceptions पकड़े नहीं गए हैं और आपको कार्य प्रबंधक से EXCEL.EXE प्रक्रिया से बाहर निकलने की आवश्यकता होगी।

library(RDCOMClient)

wbdir <- setwd("C:/Users/blabla/Desktop/wbfiles")
wblist <- list.files(wbdir, full.names = TRUE)

xlPasteValues <- -4163

for (wb in wblist) {    
  tryCatch({
    # Create COM Connection to Excel
    xlApp <- COMCreate("Excel.Application")
    xlApp[['Visible']] <- FALSE
    xlApp[['DisplayAlerts']] <- FALSE

    # Open workbook
    xlWB <- xlApp[["Workbooks"]]$Open(wb)

    # Iterate through each worksheet
    for (s in seq(xlWB$Worksheets()$Count())) {
      xlSheet <- xlWB$Worksheets(s)

      # Copy and paste values
      xlSheet$Cells()$Copy() 
      xlSheet$Cells()$PasteSpecial(xlPasteValues)

      xlApp[['CutCopyMode']] <- FALSE

      xlSheet$Activate()
      xlSheet$Range("A1")$Select()        
    }

    }, error=function(e) {
        print(e)  
    },

    finally={
      xlApp[['DisplayAlerts']] <- TRUE

      # Save Changes
      xlWB$Close(TRUE)        # THIS WILL OVERWRITE (BACKUP IN TEST MODE)
      xlApp$Quit()

      # Release resources
      xlSheet <- NULL
      xlWB <- NULL
      xlApp <- NULL

      rm(list=ls()) 
      gc()
    }
  )    
}

चूंकि COM एक विंडोज़ तकनीक है, उपरोक्त समाधान केवल विंडोज़ वातावरण में चल रहे आर में काम करता है।

0
Parfait 27 अक्टूबर 2017, 20:40
क्षमा करें, अवांछित ताज़ा करें ... इस कोड Parfait के लिए धन्यवाद, मैं RDComclient पैकेज को पकड़ने की कोशिश करूँगा। यह बहुत अच्छी तरह से काम करता है, फिर भी मुझे एक त्रुटि है जो मुझे समझ में नहीं आता कि यह कभी-कभी क्यों दिखाई देता है: क्लिपबोर्ड संदेश कॉपी/पेस्ट चीज़। मैंने खोजा और यह xlApp[['cutcopymode']] <- False के साथ प्रकट नहीं होना चाहिए। क्या मैं सही हू ? ऐसा नहीं है कि कोशिकाएं <100 . हैं
 – 
Ovidiu
26 अक्टूबर 2017, 12:55
यह कोई त्रुटि नहीं है बल्कि एक उपयोगकर्ता है जो एक्सेल से क्लिपबोर्ड पर रखी गई राशि के बारे में चेतावनी देता है। क्या यह प्रत्येक फ़ाइल या केवल एक बार पॉप अप करता रहता है? क्या आर कंसोल कोई त्रुटि दिखाता है?
 – 
Parfait
26 अक्टूबर 2017, 17:34
वास्तव में प्रत्येक फ़ाइल के साथ पॉपिंग करना और प्रतिलिपि को बाधित करना भी प्रतीत होता है। आर कंसोल यह दिखाता है: "
 – 
Ovidiu
27 अक्टूबर 2017, 16:07
एक्सेल के के साथ अपडेट अक्षम/सक्षम अलर्ट देखें। डिस्प्ले अलर्ट्स प्रॉपर्टी। और सुनिश्चित करें कि आपके पास xlPasteValues (लूप के बाहर) असाइन किया गया है क्योंकि इस समाधान में यह है।
 – 
Parfait
27 अक्टूबर 2017, 20:42
धन्यवाद पारफेट। यह अब काम कर रहा है। मेरे पास अभी भी एक त्रुटि संकेत था लेकिन आपका अंतिम संदेश मुझे इसे ठीक करने का संकेत देता है। मैंने पहले लूप के अंदर xlPasteValues <- -4163 डाल दिया। मैंने देखा कि पहले पुनरावृत्ति के बाद चर मिटा दिए गए थे। शायद यही समस्या मुझे शुरू से थी। वैसे भी कोड अब है (यदि किसी को इसकी भी आवश्यकता है): library(RDCOMClient) wbdir <- setwd("C:/Users/blabla/Desktop/wbfiles") wblist <- list.files(wbdir, full.names = TRUE) wblist xlPasteValues <- (-4163) for (wb in wblist) { xlPasteValues <- (-4163)
 – 
Ovidiu
30 अक्टूबर 2017, 18:34