在Ruby中创建Microsoft Word(.docx)文档

时间:2009-03-30 14:40:57

标签: ruby-on-rails ruby ms-word documents

是否有一种在Ruby应用程序中创建Word文档(.docx)的简单方法?实际上,在我的情况下,它是从Linux服务器提供的Rails应用程序。

类似于Prawn的宝石,但对于DOCX而不是PDF会很棒!

13 个答案:

答案 0 :(得分:41)

正如已经指出的那样,在Ruby中似乎没有任何库来操作Open XML文档,但是OpenXML Developer有关于Open XML文档格式的完整文档。

如果你想要的是发送为每个用户定制的标准文档(如格式信件)的副本,那么它应该相当简单,因为DOCX是包含目录层次结构中各个部分的ZIP文件。拥有一个DOCX“模板”,其中包含您要发送给all个用户的所有部分和树结构(没有真实内容),然后只需创建包含特定于用户的内容的新(或修改现有)部分你想要并在将它发送给用户之前将其注入ZIP(DOCX文件)。

例如:您可以document-template.xml包含亲爱的[USER-PLACEHOLDER]:。当用户请求文档时,您将[USER-PLACEHOLDER]替换为用户名,然后将生成的document.xml添加到your-template.docx ZIP文件(其中包含您想要的所有图像和其他部分) Word文档)并将生成的文档发送给用户。

请注意,如果将.docx文件重命名为.zip,则可以轻松探索内部零件的结构和格式。您可以使用任何ZIP操作工具或使用代码以编程方式轻松删除或替换图像或其他部分。

如果不访问API以使工作更轻松,则从原始XML生成具有完全自定义内容的全新Word文档将非常困难。如果您确实需要这样做,可以考虑安装Mono,然后使用VB.NET,C#或IronRuby使用Open XML Format SDK 1.0创建Open XML文档。由于您只是使用Microsoft.Office.DocumentFormat.OpenXml.Packaging Namespace来操作Open XML文档,因此它在Mono中可以正常工作,它似乎支持SDK所需的一切。

答案 1 :(得分:7)

您可以使用Apache POI。它是用Java编写的,但是integrates with Ruby as an extension

答案 2 :(得分:6)

我知道如果你将HTML文档作为带有.doc扩展名的word文档提供,它将在Word中打开就好了。只是不要做任何幻想。

编辑:以下是使用经典ASP的示例。 http://www.aspdev.org/asp/asp-export-word/

答案 3 :(得分:6)

这是一个老问题,但有一个新答案。如果您想将HTML文档转换为Word(docx)文档,只需使用' htmltoword'宝石:

https://github.com/nickfrandsen/htmltoword

我不确定为什么有回答蠕变,每个人都开始发布模板解决方案,但这回答了OP的问题。就像Prawn一样,除了Word而不是PDF。

<强>更新

还有pandoc和pandoc的API包装器,名为docverter。两者都有稍微复杂的安装,因为pandoc是一个haskell库。

答案 4 :(得分:6)

Maybe this gem is interesting for you.

https://github.com/trade-informatics/caracal/

It like prawn but with docx.

答案 5 :(得分:4)

这是一种Doccy(doccyapp.com)有一个api,可以使用它。支持docx,odt和页面,如果你愿意,还可以转换为PDF

答案 6 :(得分:3)

使用非常类似于Grant Wagner建议的技术我创建了一个Ruby html to word gem,它可以让你轻松地从你的ruby应用程序输出Word docx文件。您可以在http://github.com/nickfrandsen/htmltoword查看 - 只需传递一个html字符串,它就会创建一个相应的单词docx文件。

def show
  respond_to do |format|
    format.docx do
      file = Htmltoword::Document.create params[:docx_html_source], "file_name.docx"
      send_file file.path, :disposition => "attachment"
    end
  end
end

希望你觉得它很有用。如果您有任何问题,请随时打开github问题。

答案 7 :(得分:3)

披露:我是docxtemplater项目的负责人。

我知道你正在寻找一个ruby解决方案,但是因为所有其他解决方案只告诉你如何在全球范围内完成它,而不是给你一个完全符合你想要的库,这里是一个基于JS或NodeJS的解决方案(工作原理)在两个)

DocxTemplater Library

Demo of the library

您也可以在命令行中使用它:

npm install docxtemplater -g

docxtemplater <configFile>

----config.docxFile: The input file in docx format
----config.outputFile: The outputfile of the document

答案 8 :(得分:2)

除了Grant的答案之外,您还可以向Word发送一个“Flat OPC”文件,该文件基本上是解压缩并连接的docx,以创建单个xml文件。这样,您可以在一个文件中替换[USER-PLACEHOLDER]并完成它(即没有压缩或解压缩)。

答案 9 :(得分:2)

如果还有人在看这个,这篇文章解释了如何使用XML数据源。这对我很有用。

http://seroter.wordpress.com/2009/12/23/populating-word-2007-templates-through-open-xml/

答案 10 :(得分:1)

如果你在Windows上运行,当然,这是WIN32OLE的问题,而且Word COM对象有些痛苦。

有可能是你在* nix环境中提供的服务。 Word 2007使用“Microsoft Office Open XML”格式(* .docx),可以使用相应的compatibility pack from Microsoft打开。

一些最新的Office应用程序(至少2002 / XP和2003)有their own XML formats,也可以使用。

我不知道有任何Ruby工具可以让这个过程变得更容易。

如果它可以接受,我想我会倾向于沿着重命名的html文件路线。我刚从WordXP中将文档保存为HTML,将其重命名为.doc并毫无问题地打开它。

答案 11 :(得分:1)

查看此github回购:https://github.com/jawspeak/ruby-docx-templater

它允许您从单词模板创建文档。

答案 12 :(得分:0)

我遇到了同样的问题。不幸的是我无法操纵xml,因为我的客户应该自己填写模板。要做到这一点并不总是可行的(例如,office for mac不允许这样做。)

作为这个问题的解决方案,我制作了一个简单的gem,它可以用作带有嵌入式ruby的rtf文档模板:https://github.com/eicca/rtf-templater

我对它进行了测试,它可以用于填写报告和文档。但是,格式错误地显示复杂的循环和条件。