Comment générer des documents Word avec OLE et Ruby ? Je vais être honnête avec vous, je ne suis pas pour l'utilisation de Word, mais les personnes travaillant avec moi, utilisent majoritairement cet outil et ne jurent que par celui-ci. Afin d'utiliser correctement OLE avec Ruby, il faut avoir à sa disposition plusieurs outils, :-)
- win32ole Elle fait partie de la librairie standard de Ruby et d'une très grande utilité ;-) sans ça, il est impossible de pouvoir utiliser Word via OLE.
- ole_browser.rb qui est un script permettant d'introspecter les objets disponibles. Cet outil a été écrit par Dave Burt et Masaki Suketa.
#!/usr/bin/env ruby require "win32ole"Définition d'une nouvelle méthode basée sur l'opérateur '/' afin de sucharger la classe String.
class String def / ( other ) File.join( self, other ) end endEtant donné que je n'avais pas envie d'écrire tout le temps du code inutilement, et que j'adore refactoriser, j'ai ajouté une petite méthode au module Kernel. Celle me permet de gagner un peu de lisibilité, mais pas grand chose, je la met dans la zone des Helpers.
module Kernel def with( obj ) yield obj end endBon, commençons par le plus intéressant, je pense que le plus intéressant est tout de même de charger Word :D donc, voici comment charger cet outil.
word = WIN32OLE.new( "Word.Application" )Dans mon exemple, je ne veux pas voir l'interface de Word, de ce fait, je n'active pas sa visibilité.
word.Visible = falseEtant donné que cet article parle de la création de document, il ne s'agit pas d'ouvrir un document Word et de lui rajouter des infos, on part de zéro.
document = word.Documents.Add()Afin que vous ne soyez pas perdu dans des nombres magiques, j'ai ajouté une petite liste de constantes, permettant de cette manière une utilisation plus aisée des composants.
module Word module PageSetup module Orientation Portrait = 0 Landscape = 1 end module Size PaperA4 = 7 end end module Font module ColorIndex Black = 1 Blue = 2 Turquoise = 3 BrightGreen = 4 Pink = 5 Red = 6 Yellow = 7 White = 8 DarkBlue = 9 Teal = 10 Green = 11 Violet = 12 DarkRed = 13 DarkYellow = 14 end end module ParagraphAlignment Left = 0 Center = 1 Right = 2 Justify = 3 Distribute = 4 JustifyMed = 5 JustifyHi = 7 JustifyLow = 8 ThaiJustify = 9 end endCette partie est bête, mais spécifie le format de la page, de cette manière j'indique le format A4 en Paysage ( LandScape )
document.PageSetup.PaperSize = Word::PageSetup::Size::PaperA4 document.PageSetup.Orientation = Word::PageSetup::Orientation::LandscapePour toutes les sections se trouvant dans le document, nous allons ajoutés un en-tête et un pied de page. Création de l'entête avec une police de caractères ayant la couleur Violet, et dont le contenu sera "En-tête d'exemple"
for section in document.Sections with section.Headers( 1 ).Range do |range| range.Font.ColorIndex = Word::Font::ColorIndex::Violet range.Text = "En-tête d'exemple" end with section.Footers( 1 ).Range do |range| range.ParagraphFormat.Alignment = Word::ParagraphAligment::Right range.Font.ColorIndex = Word::Font::ColorIndex::DarkRed range.Text = "Stephane Wirtel < stephane DOT wirtel AT gmail DOT com>" end end
with word.Selection do |sel| # Ajout d'une image, picture = sel.InlineShapes.AddPicture( Dir.pwd() / 'change_directory.png', nil, true ) # Bon, on insère un break, c'est à dire une nouvelle page sel.InsertBreak() [ "Je ne suis pas Superman, mais j'y arrive :D", "Une option en plus que les autres :D" ].each do |line| sel.TypeText( "#{line}\n" ) end sel.InsertBreak() # Spécification de la taille de la police à utiliser with sel.Font do |font| font.Name = "Bitstream Vera Sans Mono" font.Size = 10 font.Bold = false end # On ajoute l'heure avec la date de cette manière, on peut déjà savoir la date de création du document sel.TypeText( Time.now.to_s ) sel.InsertBreak() endEt si on enregistrait le document, ça serait cool, vous ne pensez pas ? Tout ce travail pour ne pas le sauver, ça serait débile :D Donc, tadaaaaam
document.SaveAs( Dir.pwd() / 'test.doc' ) document.close()Maintenant il ne reste plus qu'à fermer l'application Word, si nous ne le faisons pas, il restera une instance Word ouverte, ce qui peut provoquer des problèmes.
word.Quit()Imaginez maintenant la création d'un DSL pour simplifier tout ce code, ou aussi l'utilisation de Textile
1 comment:
Bonjour,
Comment est il possible de définir un saut de ligne ?
InsertBreak() fonctionne bien, mais quelle est la methode pour passer a la ligne ??
Merci d'avance :)
Post a Comment