使用nokogiri和rubyzip编辑docx

时间:2012-01-31 05:23:58

标签: ruby zip nokogiri replace document-management

在这里,我使用rubyzip和nokogiri来修改.docx文件。

RubyZip -> Unzip .docx file
Nokogiri -> Parse and change in content of the body of word/document.xml

正如我在下面编写示例代码但代码修改了文件但其他文件受到干扰。换句话说,更新的文件未打开,显示文字处理器崩溃的错误。我该如何解决这个问题?

require 'zip/zipfilesystem'
require 'nokogiri'
zip = Zip::ZipFile.open("SecurityForms.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 = "FinalStatement"
zip.get_output_stream("word/document.xml") {|f| f << xml.to_s}
zip.close

2 个答案:

答案 0 :(得分:2)

根据official Github documentation,您应该Use write_buffer instead open。链接上还有一个代码示例。

答案 1 :(得分:1)

以下是编辑.docx模板文件内容的代码。首先创建template.docx的新副本,记住你将创建这个模板文件并将此文件保存在创建ruby类的同一文件夹中就像你将创建My_Class.rb并在其中复制以下代码。它适用于我的情况。请记住,你需要在gemset中安装rubyzip和nokogiri gem。(Google可以安装)。谢谢

require 'rubygems'
require 'zip/zipfilesystem'
require 'nokogiri'
class Edit_docx
def initialize
coupling =  [('a'..'z'),('A'..'Z')].map{|i| i.to_a}.flatten
secure_string  =  (0...50).map{ coupling[rand(coupling.length)] }.join
FileUtils.cp 'template.docx', "#{secure_string}.docx"
zip = Zip::ZipFile.open("#{secure_string}.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"})
#puts wt
wt.each_with_index do |tag,i|
tag.content = i.to_s + ""
end
zip.get_output_stream("word/document.xml") {|f| f << xml.to_s}
zip.close
puts secure_string
#FileUtils.rm("#{secure_string}.docx")
end
N.new
end