Récemment, un projet doit exporter un document Word. Je travaille dur depuis longtemps. J'ai trouvé qu'il était plus pratique et pratique d'utiliser des modèles Freemarker. Je vais résumer les étapes clés de votre référence. Voici un exemple simple de la génération de papier de test.
1. Production de modèles
Utilisez d'abord le mot pour faire un modèle, comme indiqué dans la figure ci-dessous:
(Notez qu'il y a un tableau ci-dessus, je définis la bordure invisible) puis l'enregistrez en tant que fichier XML, puis j'utilise l'outil pour ouvrir le fichier XML. Quelqu'un utilise l'éditeur XML FirstObject pour penser qu'il n'est pas aussi bon que Notepad ++. J'utilise Notepad ++ ici, principalement parce qu'il a mis en évidence et se marie automatiquement avec des éléments. L'effet est le suivant:
L'endroit noir ci-dessus est essentiellement l'endroit que nous voulons remplacer plus tard. Par exemple, si Xytitle est remplacé par $ {xytitle}, vous devriez prêter une grande attention à la table. Par exemple, le tableau ci-dessous des questions à choix multiples peut être positionné en recherchant des questions à choix multiples. Une paire de <w: tr> </ w: tr> représente une ligne, c'est-à-dire un enregistrement (une question). Ici, nous devons utiliser une paire de <#List> </ # list> pour l'inclure afin de remplir par la suite les données. Pour plus de détails, veuillez consulter la grammaire de la page Freemarker. Par exemple, ici des questions à choix multiples, nous avons deux comportements et un enregistrement, nous avons donc besoin de <#List> </ # list> pour inclure deux lignes, comme indiqué dans: <#list Table1 As Plan1> <W: Tr> Numéro de question Question </ W: tr> <W: Tr> Option </ w: tr> </ # list>, et ensuite trouver le XZN correspondant, xztest, ans1, ans2, ars3, et ancy $ {plan1.xzn}, $ {plan1.xztest}, $ {plan1.ans1}, $ {plan1.ans2}, $ {plan1.ans3}, $ {plan1.ans4}, note que Table1 et Plan1 sont nommés ici. Le tableau 1 et les données de remplissage ultérieures doivent être utilisées. Les autres remplacements sont les mêmes et les résultats sont les suivants:
Après l'enregistrement, modifiez le nom du suffixe en FTL et le modèle est terminé.
2. Implémentation de programmation
Le package Freemarker-2.3.13.jar est utilisé ici, et le code est le suivant:
package commun; Importer java.io.BufferedWriter; Importer java.io.file; import java.io.filenotfoundException; Importer java.io.fileOutputStream; Importer java.io.ioException; import java.io.outputStreamWriter; Importer java.io.UNSUPPORTEDENCODINGException; Importer java.io.writer; importation java.util.map; Importer Freemarker.Template.configuration; Importer Freemarker.Template.Template; Importer Freemarker.Template.Template; Importer Freemarker.Template.TemplateException; classe publique DocumentHandler {Private Configuration Configuration = NULL; public documentHandler () {configuration = new Configuration (); configuration.setDefaultEncoding ("UTF-8"); } public void CreatedOC (map <string, object> dataMap, String FileName) lève unporttedencodingException {// dataMap pour remplir le fichier de données du script modulo // définir la méthode du périphérique de script modulo et le chemin, Freemarker prend en charge plusieurs méthodes de chargement de modèle. Vous pouvez re-service, ClassPath et chargement de base de données. // Ici, notre modèle est placé sous la configuration du package de modèle.SetClassForTemplateLoading (this.getClass (), "/ template"); Modèle t = null; try {//test.ftl est le modèle à charger t = configuration.getTemplate ("fCTestpaper.ftl"); } catch (ioException e) {e.printStackTrace (); } // PATH DE DOCUMENT DE SORTIE ET FILE NOM OUTFILE = NOUVEAU FILE (Nom de fichier); Écrivain out = null; FileoutputStream fos = null; try {fos = new FileOutputStream (outfile); OutputStreamWriter owriter = new OutputStreamWriter (FOS, "UTF-8"); // Cet endroit est indispensable pour le streaming de codage. Lorsqu'il est appelé séparément à l'aide de Main (), il devrait être OK, mais s'il s'agit d'une demande Web d'exportation, le document Word ne sera pas ouvert après l'exportation et le fichier XML du package est incorrect. La raison principale est que le format de codage est incorrect et ne peut pas être analysé. // out = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (OutFile))); out = new BufferedWriter (owriter); } catch (filenotfoundException e1) {e1.printStackTrace (); } essayez {t.process (dataMap, out); out.close (); fos.close (); } catch (templateException e) {e.printStackTrace (); } catch (ioException e) {e.printStackTrace (); } //System.out.println("------------------------------------------------------------------------------------------------------------ Préparez ensuite l'appel de données, le code est le suivant:
Package com.havenliu.Document; Importer java.io.UNSUPPORTEDENCODINGException; import java.util.arraylist; import java.util.hashmap; Importer java.util.list; importation java.util.map; classe publique Main {/ ** * @param args * @throws unpportedEncodingException * / public static void main (String [] args) lève unportdedencodingException {; Map <string, objet> dataMap = new HashMap <String, objet> (); dataMap.put ("xytitle", "document d'examen"); int index = 1; // Liste de choix multiple <map <string, objet >> list1 = new ArrayList <map <string, objet >> (); // List <map <string, objet >> list11 = new ArrayList <map <string, objet >> (); // Réponse index = 1; for (int i = 0; i <5; i ++) {map <string, object> map = new HashMap <String, object> (); map.put ("xzn", index + "."); Map.put ("xztest", "() Le système d'exploitation permet à plusieurs terminaux d'être connectés à un hôte en même temps, et plusieurs utilisateurs peuvent utiliser l'ordinateur de manière interactive via leurs bornes respectives en même temps."); map.put ("ANS1", "A" + index); map.put ("ANS2", "B" + index); map.put ("ANS3", "C" + index); map.put ("ANS4", "D" + index); list1.add (map); Map <string, objet> map1 = new HashMap <String, objet> (); map1.put ("Fuck", index + "."); map1.put ("ABC", "A" + index); list11.add (map1); index ++; } dataMap.put ("Table1", list1); dataMap.put ("Table11", list11); // Remplissez la liste des blancs <map <string, objet >> list2 = new ArrayList <map <string, objet >> (); List <map <string, objet >> list12 = new ArrayList <map <string, objet >> (); index = 1; for (int i = 0; i <5; i ++) {map <string, object> map = new HashMap <String, object> (); map.put ("tkn", index + "."); map.put ("tktest", "Le système d'exploitation est un logiciel système ___________ dans le système informatique, qui gère et contrôle _________ dans le système informatique."); list2.add (map); Map <string, objet> map1 = new HashMap <String, objet> (); map1.put ("remplir", index + "."); map1.put ("def", "planification intermédiaire" + index); list12.add (map1); index ++; } dataMap.put ("Table2", list2); dataMap.put ("Table12", list12); // Liste de questions de jugement <map <string, objet >> list3 = new ArrayList <map <string, objet >> (); List <map <string, objet >> list13 = new ArrayList <map <string, objet >> (); index = 1; for (int i = 0; i <5; i ++) {map <string, object> map = new HashMap <String, object> (); map.put ("pdn", index + "."); Map.put ("PDTEST", "pare-feu composite pare-feu est le point d'isolement entre le réseau interne et le réseau externe, et joue le rôle de la surveillance et de l'isolement du flux de communication de la couche d'application, et est également souvent combiné avec la fonction des filtres."); list3.add (map); Map <string, objet> map1 = new HashMap <String, objet> (); map1.put ("juge", index + "."); map1.put ("hij", "v" + index); list13.Add (map1); index ++; } dataMap.put ("table3", list3); dataMap.put ("table13", list13); // Réponse courte Liste de questions <map <string, objet >> list4 = new ArrayList <map <string, objet >> (); List <map <string, objet >> list14 = new ArrayList <map <string, objet >> (); index = 1; for (int i = 0; i <5; i ++) {map <string, object> map = new HashMap <String, object> (); map.put ("jdn", index + "."); map.put ("jdtest", "Décrivez la différence entre la planification des travaux, la planification intermédiaire et la planification des processus, et analyser le niveau de planificateur doit être responsable des problèmes suivants."); list4.add (map); Map <string, objet> map1 = new HashMap <String, objet> (); map1.put ("Réponse", index + "."); map1.put ("xyz", "Décrivez la différence entre la planification des travaux, la planification intermédiaire et la planification des processus, et analyser le niveau de planificateur doit être responsable des problèmes suivants."); list14.Add (map1); index ++; } dataMap.put ("Table4", list4); dataMap.put ("Table14", list14); Mdoc mdoc = new mdoc (); mdoc.createdoc (dataMap, "e: /outfile.doc"); }} Notez que la clé de la carte ci-dessus doit correspondre au modèle, sinon une erreur sera signalée. Les effets sont les suivants:
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.