Подтвердить что ты не робот

Создание документов Microsoft Word (.docx) в Ruby

Есть ли простой способ создания документов Word (.docx) в приложении Ruby? На самом деле, в моем случае это приложение Rails, обслуживаемое с сервера Linux.

Драгоценный камень, похожий на Prawn, но для DOCX вместо PDF будет здорово!

4b9b3361

Ответ 1

Как уже отмечалось, нет библиотек для управления документами Open XML в Ruby, но OpenXML Developer имеет полную документацию в формате документов Open XML.

Если вы хотите отправить копию стандартного документа (например, буквы формы), настроенного для каждого пользователя, это должно быть довольно простым, если DOCX является ZIP файлом, который содержит различные части в иерархии каталогов. Имейте DOCX "шаблон", который содержит все части и древовидную структуру, которые вы хотите отправить пользователям all (без реального контента), а затем просто создайте новые (или измените существующие) части, содержащие требуемый для пользователя контент и вставляйте его в ZIP (файл DOCX) перед отправкой его пользователю.

Например: у вас может быть document-template.xml, который содержит Дорогой [USER-PLACEHOLDER]:. Когда пользователь запрашивает документ, вы заменяете [USER-PLACEHOLDER] на имя пользователя, затем добавляете полученный document.xml в ZIP файл your-template.docx (который будет содержать все изображения и другие части, которые вы хотите в документе Word), и отправляете этот итоговый документ пользователю.

Обратите внимание, что если вы переименуете файл .docx на .zip, тривиально изучить структуру и формат частей внутри. Вы можете легко или просто удалять или заменять изображения или другие части любыми инструментами обработки ZIP или программно с помощью кода.

Создание совершенно нового документа Word с полностью настраиваемым контентом из необработанного XML будет очень сложным без доступа к API, чтобы упростить работу. Если вам действительно нужно это сделать, вы можете установить Mono, затем использовать VB.NET, С# или IronRuby, чтобы создать ваши документы Open XML с помощью Open XML Format SDK 1.0. Поскольку вы просто используете Microsoft.Office.DocumentFormat.OpenXml.Packaging Namespace для управления документами Open XML, это должно работать нормально в Mono, что похоже, поддерживает все, что требуется SDK.

Ответ 2

Я знаю, что если вы будете служить HTML-документу в качестве документа с расширением .doc, он будет отлично открыт в Word. Просто не делайте ничего необычного.

Изменить: Вот пример использования классического ASP. http://www.aspdev.org/asp/asp-export-word/

Ответ 4

Это старый вопрос, но есть новый ответ. Если вы хотите превратить HTML-документ в документ Word (docx), просто используйте "htmltoword" gem:

https://github.com/nickfrandsen/htmltoword

Я не уверен, почему возникла кривая ответа, и все начали публиковать шаблонные решения, но это отвечает на вопрос OP. Как и Креветка, кроме Word вместо PDF.

UPDATE:

Там также pandoc и обертка API для pandoc, называемая docverter. Оба имеют несколько сложную установку, поскольку pandoc является библиотекой haskell.

Ответ 5

Это способ Doccy (doccyapp.com) имеет api, который делает именно то, что вы можете использовать. Поддерживает docx, odt и страницы и конвертирует в PDF, а если вам нравится

Ответ 6

Используя технику, очень похожую на предложенную Грантом Вагнером, я создал рубиновый html для word gem, который должен позволить вам легко выводить файлы 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

Раскрытие информации: Я являюсь лидером проекта docxtemplater.

Я знаю, что вы ищете рубиновое решение, но поскольку все другие решения говорят вам, как это сделать глобально, без предоставления вам библиотеки, которая делает именно то, что вы хотите, здесь решение на основе JS или NodeJS (работает в обоих)

Библиотека DocxTemplater

Демонстрация библиотеки

Вы также можете использовать его в командной строке:

npm install docxtemplater -g

docxtemplater <configFile>

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

Ответ 9

Кроме ответа на грант, вы также можете отправить Word в файл "Flat OPC", который, по сути, распакован и конкатенация docx для создания одного xml файла. Таким образом, вы можете заменить [USER-PLACEHOLDER] в один файл и сделать с ним (т.е. Без застегивания или разархивирования).

Ответ 11

Если вы работаете в Windows, конечно, это вопрос WIN32OLE и некоторая боль с объектами Word.

Скорее всего, ваша служба из среды * nix. Word 2007 использует формат Microsoft Office Open XML (*.docx), который можно открыть с помощью соответствующего пакет совместимости от Microsoft.

Некоторые из последних приложений Office (по крайней мере, 2002/XP и 2003) имели собственные XML-форматы, которые также могут быть использованы.

Я не знаю никаких инструментов Ruby, чтобы облегчить процесс, к сожалению.

Если это можно сделать приемлемым, я думаю, что я был бы склонен сходить по файлу renamed-html. Я просто сохранил документ в формате HTML из WordXP, переименовал его в .doc и открыл его без проблем.

Ответ 13

Я столкнулся с той же проблемой. К сожалению, я не мог манипулировать xml, потому что мои клиенты должны сами заполнить шаблоны. И делать это не всегда возможно (например, офис для mac не допускает этого).

В качестве решения этой проблемы я сделал простой камень, который можно использовать в качестве шаблона документа rtf со встроенным рубином: https://github.com/eicca/rtf-templater

Я тестировал его, и он работает нормально для заполнения отчетов и документов. Однако форматирование плохо отображается для сложных циклов и условий.

Ответ 14

Теперь я начинаю изучать Ruby, поэтому, возможно, я пошлю свой офисный модуль от JS до драгоценного камня Ruby.