2010-10-07 13 views
8

मैं एक .docx फ़ाइल को संपादित करने के लिए रूबीज़िप और नोकोगिरी के संयोजन का उपयोग कर रहा हूं। मैं .docx फ़ाइल को अनजिप करने के लिए rubyzip का उपयोग कर रहा हूं और फिर nokogiri का उपयोग करके पार्स और शब्द/document.xml फ़ाइल के शरीर को बदल सकता हूं लेकिन कभी भी जब मैं अंत में रूबीज़िप बंद करता हूं तो यह फ़ाइल को दूषित करता है और मैं इसे खोल नहीं सकता या इसे ठीक करिये। मैं डेस्कटॉप पर .docx फ़ाइल को अनजिप करता हूं और शब्द/document.xml फ़ाइल को चेक करता हूं और सामग्री को मैंने जो बदल दिया है उसे अपडेट किया जाता है लेकिन अन्य सभी फाइलें गड़बड़ हो जाती हैं। क्या कोई इस मुद्दे के साथ मेरी मदद कर सकता है?dokx को nokogiri और rubyzip के साथ संपादित करें

require 'rubygems' 
require 'zip/zip' 
require 'nokogiri' 
zip = Zip::ZipFile.open("test.docx") 
doc = zip.find_entry("word/document.xml") 
xml = Nokogiri::XML.parse(doc.get_input_stream) 
wt = xml.root.xpath("//w:t", {"w" => "http://schemas.openxmlformats.org/wordprocessingml/2006/main"}).first 
wt.content = "New Text" 
zip.get_output_stream("word/document.xml") {|f| f << xml.to_s} 
zip.close 
+0

हैलो डेल्विन, मुझे एक ही समस्या मिली लेकिन मैं इसे एरिक के सुझाव के रूप में हल करने में सक्षम नहीं हूं। मेरे द्वारा इस समस्या का समाधान कैसे किया जा सकता है ? धन्यवाद – Rubyist

उत्तर

1

मैं पोस्ट करवाते हैं ठोकर खाकर गहरे लाल रंग का या nokogiri लेकिन के बारे में कुछ भी नहीं पता ...

ऐसा लगता है कि आप गलत तरीके से नई सामग्री reziping रहे हैं: यहाँ मेरी कोड है। मुझे रूबीज़िप के बारे में पता नहीं है, लेकिन आपको एंट्री शब्द/document.xml को अपडेट करने के लिए इसे बताने का एक तरीका चाहिए और फिर फ़ाइल को रीज/रीज़िप करें।

ऐसा लगता है कि आप नए डेटा के साथ प्रविष्टि को ओवरराइट कर रहे हैं, निश्चित रूप से एक अलग आकार होने वाला है और पूरी तरह से ज़िप फ़ाइल को पेंच कर रहा है।

मैं इस पोस्ट Parse text file and create an excel report

जो उपयोग भले ही मैं एक अलग ज़िप पुस्तकालय का उपयोग कर रहा है और वीबी (आईएम अभी भी वास्तव में कर रही है तुम क्या करने की कोशिश कर रहे हैं की हो सकता है में एक्सेल के लिए एक उदाहरण देता हूँ, मेरे कोड के बारे में है नीचे आधा रास्ता)

यहाँ

Using z As ZipFile = ZipFile.Read(xlStream.BaseStream) 
'Grab Sheet 1 out of the file parts and read it into a string. 
Dim myEntry As ZipEntry = z("xl/worksheets/sheet1.xml") 
Dim msSheet1 As New MemoryStream 
myEntry.Extract(msSheet1) 
msSheet1.Position = 0 
Dim sr As New StreamReader(msSheet1) 
Dim strXMLData As String = sr.ReadToEnd 

'Grab the data in the empty sheet and swap out the data that I want 
Dim str2 As XElement = CreateSheetData(tbl) 
Dim strReplace As String = strXMLData.Replace("<sheetData/>", str2.ToString) 
z.UpdateEntry("xl/worksheets/sheet1.xml", strReplace) 
'This just rezips the file with the new data it doesnt save to disk 
z.Save(fiRet.FullName) 
End Using 
12

मैं कल रात rubyzip के साथ एक ही भ्रष्टाचार समस्या में पड़ गए लागू होने वाला हिस्सा है। मैंने इसे सब कुछ एक नई ज़िप फ़ाइल में कॉपी करके हल किया, फ़ाइलों को आवश्यकतानुसार बदल दिया।

#!/usr/bin/env ruby 

require 'rubygems' 
require 'zip/zip' # rubyzip gem 
require 'nokogiri' 

class WordXmlFile 
    def self.open(path, &block) 
    self.new(path, &block) 
    end 

    def initialize(path, &block) 
    @replace = {} 
    if block_given? 
     @zip = Zip::ZipFile.open(path) 
     yield(self) 
     @zip.close 
    else 
     @zip = Zip::ZipFile.open(path) 
    end 
    end 

    def merge(rec) 
    xml = @zip.read("word/document.xml") 
    doc = Nokogiri::XML(xml) {|x| x.noent} 
    (doc/"//w:fldSimple").each do |field| 
     if field.attributes['instr'].value =~ /MERGEFIELD (\S+)/ 
     text_node = (field/".//w:t").first 
     if text_node 
      text_node.inner_html = rec[$1].to_s 
     else 
      puts "No text node for #{$1}" 
     end 
     end 
    end 
    @replace["word/document.xml"] = doc.serialize :save_with => 0 
    end 

    def save(path) 
    Zip::ZipFile.open(path, Zip::ZipFile::CREATE) do |out| 
     @zip.each do |entry| 
     out.get_output_stream(entry.name) do |o| 
      if @replace[entry.name] 
      o.write(@replace[entry.name]) 
      else 
      o.write(@zip.read(entry.name)) 
      end 
     end 
     end 
    end 
    @zip.close 
    end 
end 

if __FILE__ == $0 
    file = ARGV[0] 
    out_file = ARGV[1] || file.sub(/\.docx/, ' Merged.docx') 
    w = WordXmlFile.open(file) 
    w.force_settings 
    w.merge('First_Name' => 'Eric', 'Last_Name' => 'Mason') 
    w.save(out_file) 
end 
+0

'w.force_settings' पंक्ति क्या करती है/संदर्भित करती है? – Simmo

+1

यह सुनिश्चित नहीं है कि यह तरीका कैसे छोड़ा गया है, लेकिन यह यह है: https://gist.github.com/ericmason/7200421 यहां मेरे पास नवीनतम प्रतिलिपि से पूरी फ़ाइल भी है: https: //gist.github। com/ericmason/7200448 –

1

official Github documentation, आपको चाहिए Use write_buffer instead open के अनुसार:

यहाँ अवधारणा के अपने काम करने के सबूत है। लिंक पर एक कोड उदाहरण भी है।

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