web-dev-qa-db-fra.com

Création de documents Microsoft Word (.docx) dans Ruby

Existe-t-il un moyen facile de créer des documents Word (.docx) dans une application Ruby? En fait, dans mon cas, c'est une application Rails servie depuis un serveur Linux) .

Un bijou similaire à Prawn mais pour DOCX au lieu de PDF serait génial!

45
Javier

Comme cela a été noté, il ne semble pas y avoir de bibliothèques pour manipuler les documents Open XML dans Ruby, mais OpenXML Developer possède une documentation complète sur le format des documents Open XML.

Si vous voulez envoyer une copie d'un document standard (comme une lettre type) personnalisée pour chaque utilisateur, cela devrait être assez simple étant donné qu'un DOCX est un fichier Zip qui contient diverses parties dans une hiérarchie de répertoires. Avoir un "modèle" DOCX qui contient toutes les parties et la structure arborescente que vous souhaitez envoyer aux utilisateurs de all (sans contenu réel), puis créez simplement de nouvelles pièces (ou modifiez des pièces existantes) qui contiennent les spécificités de l'utilisateur le contenu que vous souhaitez et l'injecter dans le Zip (fichier DOCX) avant de l'envoyer à l'utilisateur.

Par exemple: Vous pourriez avoir document-template.xml Qui contient Cher [USER-PLACEHOLDER]: . Lorsqu'un utilisateur demande le document, vous remplacez [USER-PLACEHOLDER] Par le nom de l'utilisateur, puis ajoutez le document.xml Résultant au fichier Zip your-template.docx (Qui contiendrait toutes les images et autres parties que vous voulez dans le document Word) et envoyez ce document résultant à l'utilisateur.

Notez que si vous renommez un fichier .docx En .Zip, Il est trivial d'explorer la structure et le format des pièces à l'intérieur. Vous pouvez supprimer ou remplacer des images ou d'autres parties très facilement avec n'importe quel outil de manipulation Zip ou par programme avec du code.

La génération d'un tout nouveau document Word avec un contenu entièrement personnalisé à partir de XML brut serait très difficile sans accès à une API pour faciliter la tâche. Si vous avez vraiment besoin de le faire, vous pouvez envisager d'installer Mono , puis utilisez VB.NET, C # ou IronRuby pour créer vos documents Open XML en utilisant Ouvrir SDK au format XML 1. . Étant donné que vous utilisez simplement Microsoft.Office.DocumentFormat.OpenXml.Packaging Namespace pour manipuler les documents Open XML, cela devrait fonctionner correctement en Mono, qui semble prendre en charge tout ce dont le SDK a besoin.

41
Grant Wagner

Vous pouvez utiliser Apache POI . Il est écrit en Java, mais s'intègre avec Ruby en tant qu'extension

7
ykaganovich

C'est une vieille question mais il y a une nouvelle réponse. Si vous souhaitez transformer un document HTML en un document Word (docx), utilisez simplement le joyau 'htmltoword':

https://github.com/nickfrandsen/htmltoword

Je ne sais pas pourquoi il y a eu un fluage de réponse et tout le monde a commencé à publier des solutions de modèles, mais cela répond à la question du PO. Tout comme Prawn, sauf Word au lieu de PDF.

MISE À JOUR:

Il y a aussi pandoc et un wrapper API pour pandoc appelé docverter . Les deux ont des installations légèrement compliquées car pandoc est une bibliothèque haskell.

6
Archonic

Peut-être que ce joyau est intéressant pour vous.

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

C'est comme la crevette mais avec docx.

6
Théo Capdet

Je sais que si vous servez un document HTML en tant que document Word avec l'extension .doc, il s'ouvrira très bien dans Word. Ne fais rien d'extraordinaire.

Edit: Voici un exemple utilisant ASP classique. http://www.aspdev.org/asp/asp-export-Word/

6
Daniel A. White

C'est une façon dont Doccy ( doccyapp.com ) a une API qui fait juste ce que vous pouvez utiliser. Prend en charge docx, odt et pages et convertit en PDF également si vous le souhaitez

4
Michael Cindric

Divulgation: je suis le chef de file du projet docxtemplater.

Je sais que vous recherchez une solution Ruby, mais parce que toutes les autres solutions ne vous disent que comment le faire globalement, sans vous donner une bibliothèque qui fait exactement ce que vous voulez, voici une solution basée sur sur JS ou NodeJS (fonctionne dans les deux)

Bibliothèque DocxTemplater

Démo de la bibliothèque

Vous pouvez également l'utiliser dans la ligne de commande:

npm install docxtemplater -g

docxtemplater <configFile>

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

En utilisant une technique très similaire à celle suggérée par Grant Wagner, j'ai créé un Ruby html vers Word gem qui devrait vous permettre de sortir facilement des fichiers docx Word à partir de votre Ruby = app. Vous pouvez le vérifier sur http://github.com/nickfrandsen/htmltoword - Passez-lui simplement une chaîne html et il créera un fichier docx Word correspondant.

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

J'espère que vous le trouverez utile. Si vous avez des problèmes, n'hésitez pas à ouvrir un problème de github.

3
Nick

Suite à la réponse de Grant, vous pouvez également envoyer à Word un fichier "Flat OPC", qui est essentiellement le docx décompressé et concaténé pour créer un seul fichier xml. De cette façon, vous pouvez remplacer [USER-PLACEHOLDER] dans un fichier et en finir avec lui (c'est-à-dire sans zipper ou décompresser).

2
JasonPlutext

Si quelqu'un regarde toujours cela, cet article explique comment utiliser une source de données XML. Cela fonctionne bien pour moi.

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

2
Amala

Si vous utilisez Windows, bien sûr, c'est une question de WIN32OLE et de problèmes avec les objets Word COM.

Il y a de fortes chances pour que votre portion à partir d'un environnement * nix, cependant. Word 2007 utilise le format " Microsoft Office Open XML " (* .docx) qui peut être ouvert à l'aide du format approprié pack de compatibilité de Microsoft .

Certaines des applications Office les plus récentes (2002/XP et 2003 au moins) avaient leurs propres formats XML qui peuvent également être utilisables.

Je ne connais aucun outil Ruby pour rendre le processus plus facile, malheureusement.

Si cela peut être rendu acceptable, je pense que je serais enclin à descendre la route des fichiers renommés-html. Je viens d'enregistrer un document au format HTML à partir de WordXP, de le renommer en .doc et de l'ouvrir sans problème.

1
Mike Woodhouse

Découvrez ce dépôt github: https://github.com/jawspeak/Ruby-docx-templater

Il vous permet de créer un document à partir d'un modèle Word.

1
Kieran Andrews

J'ai rencontré le même problème. Malheureusement, je n'ai pas pu manipuler le xml car mes clients devraient eux-mêmes remplir des modèles. Et ce n'est pas toujours possible (par exemple, Office pour Mac ne le permet pas).

Pour résoudre ce problème, j'ai créé une gemme simple, qui peut être utilisée comme modèle de document rtf avec Ruby intégré: https://github.com/eicca/rtf-templater

Je l'ai testé et cela fonctionne bien pour remplir des rapports et des documents. Cependant, le formatage s'affiche mal pour les boucles et les conditions complexes.

0
Mik