Recientemente, un proyecto tiene que exportar un documento de Word. He estado trabajando duro durante mucho tiempo. Descubrí que es más conveniente y conveniente usar plantillas de marca freem. Resumiré los pasos clave para su referencia. Aquí hay un ejemplo simple de la generación de documentos de prueba.
1. Producción de plantillas
Primero use la palabra para hacer una plantilla, como se muestra en la figura a continuación:
(Tenga en cuenta que hay una tabla arriba, configuré el borde invisible) Luego guárdelo como un archivo XML y luego uso la herramienta para abrir el archivo XML. Alguien usa el editor de FirstObject XML para sentir que no es tan bueno como PhitEpad ++. Utilizo Notepad ++ aquí, principalmente porque tiene resaltado y se combina automáticamente con elementos. El efecto es el siguiente:
El lugar negro de arriba es básicamente el lugar que queremos reemplazar más tarde. Por ejemplo, si Xytitle es reemplazado por $ {xytitle}, debe prestar mucha atención a la mesa. Por ejemplo, la tabla debajo de preguntas de opción múltiple se puede colocar buscando preguntas de opción múltiple. Un par de <w: tr> </w: tr> representa una fila, es decir, un registro (una pregunta). Aquí necesitamos usar un par de <#list> </#list> para incluirlo para completar posteriormente los datos. Para más detalles, consulte la gramática de la página de Freemarker. Por ejemplo, aquí las preguntas de opción múltiple, tenemos dos comportamientos y un registro, por lo que necesitamos <#list> </#list> para incluir dos filas, como se muestra en: <#list tabla1 como plan1> <w: tr> número de preguntas preguntas </w: tr> <w: tr> opción </w: tr> </#list>, y luego encontrar el corresponsal XZNN, XZTEST, ANS1, ANS1, ANS2, ANS4 y ANS4 y ANS4, y ANS4, y ANS4, y ANS4, ANS4, ANS4 Y ANS4 Y ANS4 Y ANS4, ANS4, ANS4 Y ANS4 Y ANS4 Y ANS4, ANS4 Y ANS4, ANS4 Y ANS4 Y ANS4 Y ANS4 Y ANS4 Y ANS4 Y ANS4 Y ANS4, ANS4 Y ANS4 Y ANS4 Y ANS4 Y ANS4 Y ANS. Con $ {plan1.xzn}, $ {plan1.xztest}, $ {plan1.ans1}, $ {plan1.ans2}, $ {plan1.ans3}, $ {plan1.ans4}, tenga en cuenta que la Tabla1 y el plan1 se nombran aquí. La Tabla1 y los datos de llenado posteriores deben usarse. Otros reemplazos son los mismos, y los resultados son los siguientes:
Después de guardar, modifique el nombre del sufijo a FTL y se completa la plantilla.
2. Implementación de programación
El paquete Freemarker-2.3.13.Jar se usa aquí, y el código es el siguiente:
paquete común; import java.io.bufferedwriter; import java.io.file; import java.io.filenotfoundException; import java.io.fileOutputStream; import java.io.ioException; import java.io.outputstreamwriter; import java.io.unsupportedencodingException; import java.io.writer; import java.util.map; importar freemarker.template.configuration; importar freemarker.template.template; importar freemarker.template.template; importar freemarker.template.templateException; Public Class DocumentHandler {Configuración privada Configuración = NULL; public DocumentHandler () {Configuration = New Configuration (); configuración.setDefaultEncoding ("UTF-8"); } public void creatocoC (map <string, object> dataMap, string fileName) lanza UnsupportedEncodingException {// dataMap para completar el archivo de datos del script de módulo // Establecer el método y la ruta del dispositivo de script de módulo, FreeMarker admite múltiples métodos de carga de plantillas. Puede volver a servir, classpath y la carga de la base de datos. // Aquí nuestra plantilla se coloca debajo de la configuración del paquete de plantilla.setClassfortEmplateloading (this.getClass (), "/Template"); Plantilla t = nulo; Prueba {//test.ftl es la plantilla que se cargará t = configuration.gettemplate ("fctestpaper.ftl"); } catch (ioException e) {E.PrintStackTrace (); } // Salida de la ruta del documento y el archivo de nombre Outfile = nuevo archivo (nombre de archivo); Escritor fuera = nulo; FileOutputStream fos = null; intente {fos = new FileOutputStream (outFile); OutputStreamWriter Owriter = new OutputStreamWriter (FOS, "UTF-8"); // Este lugar es indispensable para codificar la transmisión. Cuando se llama por separado usando Main (), debe estar bien, pero si se trata de una solicitud web para exportar el documento Word no se abrirá después de exportar, y el archivo XML del paquete es incorrecto. La razón principal es que el formato de codificación es incorrecto y no se puede analizar. // out = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (OUTFILE))); out = new BufferedWriter (owriter); } Catch (FileNotFoundException e1) {e1.printstackTrace (); } try {t.process (dataMap, out); out.close (); fos.close (); } catch (TemplateException e) {E.PrintStackTrace (); } catch (ioException e) {E.PrintStackTrace (); } //System.out.println("------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------- Luego prepare la llamada de datos, el código es el siguiente:
paquete com.havenliu.document; import java.io.unsupportedencodingException; import java.util.arrayList; import java.util.hashmap; import java.util.list; import java.util.map; public class Main { / ** * @param args * @throws UnsupportedEncodingException * / public static void main (string [] args) lanza no comportedEncodingException {; Map <string, object> datAMAP = new HashMap <String, Object> (); datAMAP.put ("xytitle", "examen de examen"); INT índice = 1; // Lista de múltiples opciones <map <string, object >> list1 = new ArrayList <map <string, object >> (); // Lista de preguntas <map <string, object >> list11 = new ArrayList <map <string, object >> (); // respuesta index = 1; for (int i = 0; i <5; i ++) {map <string, object> map = new HashMap <String, object> (); map.put ("xzn", índice + "."); El sistema operativo map.put ("xztest", "() permite conectarse múltiples terminales a un host al mismo tiempo, y múltiples usuarios pueden usar la computadora de manera interactiva a través de sus respectivos terminales al mismo tiempo"); map.put ("ANS1", "A" + índice); map.put ("ANS2", "B" + índice); map.put ("ANS3", "C" + índice); map.put ("ANS4", "D" + índice); list1.add (mapa); Map <string, object> map1 = new HashMap <String, Object> (); map1.put ("joder", índice + "."); map1.put ("ABC", "A" + índice); list11.add (map1); índice ++; } dataMap.put ("Tabla1", list1); datAMAP.put ("Tabla11", list11); // Complete la lista en blanco <map <string, object >> list2 = new ArrayList <map <string, object >> (); List <map <string, object >> list12 = new ArrayList <map <string, object >> (); índice = 1; for (int i = 0; i <5; i ++) {map <string, object> map = new HashMap <String, object> (); map.put ("tkn", índice + "."); map.put ("tktest", "El sistema operativo es un ___ software del sistema________ en el sistema informático, que administra y controla _________ en el sistema informático"); list2.Add (mapa); Map <string, object> map1 = new HashMap <String, Object> (); map1.put ("relleno", índice + "."); map1.put ("def", "programación intermedia" + índice); list12.Add (MAP1); índice ++; } dataMap.put ("Tabla2", list2); datAMAP.put ("Tabla12", list12); // Lista de preguntas de juicio <map <string, object >> list3 = new ArrayList <map <string, object >> (); List <map <string, object >> list13 = new ArrayList <map <string, object >> (); índice = 1; for (int i = 0; i <5; i ++) {map <string, object> map = new HashMap <String, object> (); map.put ("PDN", índice + "."); MAP.put ("PDTest", "Compuesto Firewall Firewall es el punto de aislamiento entre la red interna y la red externa, y desempeña el papel de monitoreo y aislamiento del flujo de comunicación de la capa de aplicación, y también a menudo se combina con la función de los filtros"); list3.Add (mapa); Map <string, object> map1 = new HashMap <String, Object> (); map1.put ("Juez", índice + "."); map1.put ("hij", "v" + índice); list13.Add (MAP1); índice ++; } dataMap.put ("Tabla3", list3); datAMAP.put ("Tabla13", list13); // Lista de preguntas de respuesta corta <map <string, object >> list4 = new ArrayList <map <string, object >> (); List <map <string, object >> list14 = new ArrayList <map <string, object >> (); índice = 1; for (int i = 0; i <5; i ++) {map <string, object> map = new HashMap <String, object> (); map.put ("jdn", índice + "."); MAP.put ("JDTest", "Describa la diferencia entre la programación de trabajo, la programación intermedia y la programación de procesos, y analice qué nivel de programador debería ser responsable de los siguientes problemas"); list4.Add (mapa); Map <string, object> map1 = new HashMap <String, Object> (); map1.put ("respuesta", índice + "."); MAP1.put ("XYZ", "Describa la diferencia entre la programación de trabajo, la programación intermedia y la programación de procesos, y analice qué nivel de programador debería ser responsable de los siguientes problemas"); list14.Add (MAP1); índice ++; } dataMap.put ("Tabla4", list4); datAMAP.put ("Tabla14", list14); MDOC MDOC = new MDoc (); MDOC.CreateDoc (DataMap, "E: /Outfile.doc"); }} Tenga en cuenta que la clave en el mapa anterior debe corresponder a la plantilla, de lo contrario se informará un error. Los efectos son los siguientes:
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.