2010-09-21 23 views
2

J'ai utilisé l'automation OLE depuis Java pour accéder à des méthodes pour word.Diviser le fichier Word en plusieurs fichiers de mots plus petits à l'aide de OLE Automation à partir de Java

j'ai réussi à faire ce qui suit en utilisant l'automatisation OLE:

Ouvrir le fichier de modèle de document Word. Mail fusionne le modèle de document Word avec un fichier de source de données CSV. Enregistrer le fichier fusionné dans un nouveau fichier de document Word. Ce que je dois faire maintenant est d'être en mesure d'ouvrir le fichier fusionné de courrier, puis en utilisant OLE par programme le diviser en plusieurs fichiers. Je veux dire si le fichier original fusionné a 6000 pages et que mes pages max par propriété de fichier sont de 3000 pages. J'ai besoin de créer deux nouveaux fichiers de document Word et placer les 3000 premières pages dans l'une et les 3000 dernières dans l'autre.

Lors de mes premières tentatives, j'ai pris le nombre de lignes dans le fichier csv et je l'ai multiplié par le nombre de pages dans le modèle pour obtenir le nombre total de pages après sa fusion. Ensuite, j'ai utilisé la fusion pour créer les fichiers multiples. Le problème est cependant que je ne peux pas calculer exactement combien de pages le document fusionné sera, car dans certains cas, tous disons que 9 pages du modèle ne seront pas utilisées en raison des données et des champs de fusion utilisés. Ainsi, dans certains cas, une ligne ne créera que 3 pages (en utilisant le modèle de 9 pages) et d'autres pourraient créer 9 pages (en utilisant le modèle de 9 pages) pendant la fusion du courrier. La seule solution consiste donc à fusionner toutes les lignes en un seul document, puis à les diviser en plusieurs documents pour s'assurer que le nombre exact de pages, comme la propriété 3000 pages, est effectivement dans chaque fichier jusqu'à ce qu'il ne reste plus de pages. le fichier fusionné d'origine.

J'ai déjà essayé plusieurs choses en utilisant le site msdn pour obtenir des méthodes et leurs propriétés, mais je n'ai pas pu le faire.

Lors de mes dernières tentatives, j'ai essayé d'utiliser GoTo pour obtenir un numéro de page spécifique et supprimer la page. J'allais essayer de faire ceci un par un pour chaque page jusqu'à ce que je me rende à l'endroit où je veux que le fichier commence et ensuite l'enregistrer comme un nouveau fichier mais j'ai été incapable de le faire aussi bien.

S'il vous plaît quelqu'un peut-il suggérer quelque chose qui pourrait m'aider?

Merci et salutations Sean

Un exemple d'ouvrir un fichier Word en utilisant l'OLE AUTOMATION à partir jave est inclus ci-dessous:

Code sample 
OleAutomation documentsAutomation = this.getChildAutomation(this.wordAutomation, "Documents"); 

int [ ] id = documentsAutomation.getIDsOfNames(new String[]{"Open"}); 

Variant[] arguments = new Variant[1]; 

arguments[0] = new Variant(fileName); // where filename is the absolute path to the docx file 

Variant invokeResult = documentsAutomation.invoke(id[0], arguments); 

private OleAutomation getChildAutomation(OleAutomation automation, String childName) { 

int[] id = automation.getIDsOfNames(new String[]{childName}); 

Variant pVarResult = automation.getProperty(id[0]); 

return(pVarResult.getAutomation()); 

} 

Code sample 
+0

J'ai oublié d'ajouter que j'utilise la bibliothèque suivante pour faire cela qui est incluse dans la version Helios d'Eclipse. org.eclipse.swt.win32.win32.x86_64_3.6.0-v3650b.jar –

+0

J'ai maintenant réussi à utiliser la méthode Goto avec succès pour aller à des pages spécifiques et les supprimer jusqu'à ce que je n'ai que les pages dont j'ai besoin dans le document après lequel je l'enregistre dans un nouveau document. Ce n'est pas encore parfait mais il semble être une approche à prendre au moins. –

+0

Juste une note finale je me suis retrouvé avec une seule page vierge à la fin de mes fichiers fractionnés parce que le modèle utilisé pour faire du publipostage avec un saut de page sur la dernière page. Pour supprimer la dernière page vide du fichier, je ne pouvais pas utiliser Delete sur l'objet Range car cela supprime simplement le contenu et non la page. La solution de contournement que j'ai découverte consiste à utiliser la méthode TypeBackspaceKey une fois que vous avez utilisé la méthode Goto pour accéder à la dernière page. Cela a supprimé la page vide du document de mot divisé parfaitement. –

Répondre

1

On dirait que vous avez PEGGED déjà. Une autre approche que vous pourriez prendre qui éviterait de construire puis de supprimer serait de regarder les parties de votre modèle qui peuvent faire la plus grande différence avec le numéro de votre modèle (c'est là que les données peuvent être multi-lignes). Si vous prenez ensuite ces champs et regardez la police, l'interlignage et le type de largeur de ligne, vous pourrez calculer la place que vos données prendront dans le modèle et limiter vos données à ce moment-là. Java FontMetrics peut vous aider avec cela.