2013-05-31 3 views
10

मैं थोड़ी किस्मत के साथ एक डॉक्क्स फ़ाइल में टेक्स्ट ढूंढने और बदलने के लिए बहुत सी विधि खोज रहा हूं। मैंने डॉक्क्स मॉड्यूल की कोशिश की है और इसे काम करने के लिए नहीं मिल सका। आखिरकार मैंने ज़िपफाइल मॉड्यूल का उपयोग करके नीचे वर्णित विधि का काम किया और दस्तावेज़.एक्सएमएल फ़ाइल को डॉक्स संग्रह में बदल दिया। इस काम के लिए आपको उस पाठ के साथ एक टेम्पलेट दस्तावेज़ (डॉक्क्स) की आवश्यकता है जिसे आप अनन्य तारों के रूप में प्रतिस्थापित करना चाहते हैं जो दस्तावेज में किसी अन्य मौजूदा या भविष्य के पाठ से संभवतः मेल नहीं खा सकता है (उदाहरण के लिए। "XXXMEETDATEXXX पर XXXCLIENTNAMEXXX के साथ बैठक बहुत अच्छी तरह से चली गई। ")।.docx फ़ाइल में टेक्स्ट ढूंढें और बदलें - पायथन

import zipfile 

replaceText = {"XXXCLIENTNAMEXXX" : "Joe Bob", "XXXMEETDATEXXX" : "May 31, 2013"} 
templateDocx = zipfile.ZipFile("C:/Template.docx") 
newDocx = zipfile.ZipFile("C:/NewDocument.docx", "a") 

with open(templateDocx.extract("word/document.xml", "C:/")) as tempXmlFile: 
    tempXmlStr = tempXmlFile.read() 

for key in replaceText.keys(): 
    tempXmlStr = tempXmlStr.replace(str(key), str(replaceText.get(key))) 

with open("C:/temp.xml", "w+") as tempXmlFile: 
    tempXmlFile.write(tempXmlStr) 

for file in templateDocx.filelist: 
    if not file.filename == "word/document.xml": 
     newDocx.writestr(file.filename, templateDocx.read(file)) 

newDocx.write("C:/temp.xml", "word/document.xml") 

templateDocx.close() 
newDocx.close() 

मेरा प्रश्न यह है कि इस विधि में क्या गलत है? मैं इस सामान के लिए बहुत नया हूं, इसलिए मुझे लगता है कि किसी और को पहले से ही यह पता लगाना चाहिए था। जो मुझे विश्वास दिलाता है कि इस दृष्टिकोण के साथ कुछ गड़बड़ है। लेकिन यह काम करता है! मुझे यहां क्या समझ नहीं आ रहा है?

यहाँ हर किसी के लिए मेरे विचार प्रक्रिया का एक पूर्वाभ्यास और ने इस सामान जानने की कोशिश कर रहा है:

चरण 1) पाठ स्ट्रिंग्स आप कुंजी और आइटम के रूप में नया पाठ के रूप में बदलना चाहते हैं की एक अजगर शब्दकोश तैयार (जैसे {"XXXCLIENTNAMEXXX": "जो बॉब", "XXXMEETDATEXXX": "31 मई, 2013"})।

चरण 2) ज़िपफाइल मॉड्यूल का उपयोग कर टेम्पलेट docx फ़ाइल खोलें।

चरण 3) एपेंड एक्सेस मोड के साथ एक नई नई डॉक्स फ़ाइल खोलें।

चरण 4) टेम्पलेट docx फ़ाइल से document.xml (जहां सभी पाठ रहता है) निकालें और टेक्स्ट स्ट्रिंग चर के लिए xml पढ़ें।

चरण 5) अपने नए टेक्स्ट के साथ xml टेक्स्ट स्ट्रिंग में अपने शब्दकोश में परिभाषित सभी पाठ को प्रतिस्थापित करने के लिए लूप के लिए उपयोग करें।

चरण 6) xml टेक्स्ट स्ट्रिंग को एक नई अस्थायी xml फ़ाइल में लिखें।

चरण 7) टेम्पलेट docx संग्रह में सभी फ़ाइलों को प्रतिलिपि बनाने के लिए लूप और ज़िप्फ़ाइल मॉड्यूल का उपयोग करें, किसी नए डॉक्क्स संग्रह को शब्द/document.xml फ़ाइल से बाहर निकालें।

चरण 8) अस्थायी एक्सएमएल फ़ाइल को प्रतिस्थापित टेक्स्ट के साथ नए डॉकएक्स संग्रह में एक नए शब्द/document.xml फ़ाइल के रूप में लिखें।

चरण 9) अपना टेम्पलेट और नया डॉक्क्स अभिलेखागार बंद करें।

चरण 10) अपना नया डॉक्क्स दस्तावेज़ खोलें और अपने प्रतिस्थापित टेक्स्ट का आनंद लें!

--Edit-- समापन कोष्ठक ')' लाइनों 7 पर और 11

+0

आपका मतलब है कि आपके द्वारा पोस्ट किया गया कोड काम करता है और आप पूछ रहे हैं, "किसी और ने ऐसा क्यों नहीं किया?" शायद किसी के पास है। यह एक समस्या क्यों होगी? अपने कोड पर एक सरसरी नज़र से, यह करने के लिए सही काम की तरह दिखता है। –

+0

बेशक लोगों ने पहले यह किया है। यह एक फार्म पत्र का एक बेरबोन कार्यान्वयन है। माइक्रोसॉफ्ट वर्ड (और ओपनऑफिस और आदि) में "मेल मर्ज" फ़ंक्शन है जो इसे मूल रूप से करेगा। –

+0

यह प्रश्न ऑफ-विषय प्रतीत होता है क्योंकि यह कार्य कोड की समीक्षा करने के बारे में है। Codereview.SE पर माइग्रेशन की सिफारिश करें –

उत्तर

1

लापता कभी कभी, वर्ड अजीब काम करता है। आप पाठ दूर करने के लिए और लेख का संपादन बीच

आपका दस्तावेज़ में (एक xml फ़ाइल में सहेजा जाता है आम तौर पर शब्द/docx के लिए document.xml में बिना एक स्ट्रोक, जैसे में यह फिर से लिखने , afer की कोशिश करनी चाहिए unzipping)। कभी-कभी यह संभव है कि आपका टेक्स्ट एक स्ट्रोक में नहीं होगा: यह संभव है कि दस्तावेज़ में कहीं भी, वे XXX क्लाइंट हैं और कहीं और वे NAMEXXX हैं।

कुछ इस तरह:

<w:t> XXXCLIENT </w:t> ... <w:t> NAMEXXX </w:t>

यह अक्सर भाषा समर्थन की वजह से होता है: शब्द शब्द विभाजन जब वह सोचता है कि एक शब्द किसी एक विशिष्ट भाषा की है, और शब्दों के बीच ऐसा कर सकते हैं, कि इच्छा शब्दों को कई टैग में विभाजित करें।

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

मैं एक जे एस पुस्तकालय टैग की तरह मूंछें का उपयोग करता है बनाया है: {CLIENTNAME} https://github.com/edi9999/docxgenjs

यह विश्व स्तर पर अपने एल्गोरिथ्म के रूप में ही काम करता है लेकिन क्रैश नहीं करेंगे, तो सामग्री (एक स्ट्रोक में नहीं है जब आप लिखते हैं { वर्ड में CLIENTNAME}, पाठ आमतौर पर splitted जाएगा: {, CLIENTNAME,} दस्तावेज़ में

-1

आप एक समाधान की कोशिश कर सकते उपयोग पद की खोज/एक स्ट्रोक में पाठ पाने के लिए की जगह

उदाहरण के लिए।।। "XXXCLIENTNAMEXXX" के लिए खोजें और इसे "XXXCLIENTNAMEXXX" के साथ दोबारा बदलें।

संबंधित मुद्दे