Recentemente, um projeto precisa exportar um documento do Word. Trabalho duro há muito tempo. Descobri que é mais conveniente e conveniente usar modelos Freemarker. Vou resumir as principais etapas para sua referência. Aqui está um exemplo simples da geração de papel de teste.
1. Produção de modelos
Primeiro use o Word para fazer um modelo, conforme mostrado na figura abaixo:
(Observe que há uma tabela acima, eu defino a borda invisível) e salve -a como um arquivo XML e, em seguida, uso a ferramenta para abrir o arquivo XML. Alguém usa o FirstObject XML Editor para sentir que não é tão bom quanto o bloco de notas ++. Eu uso o NotePad ++ aqui, principalmente porque ele tem destaque e emparelha automaticamente com elementos. O efeito é o seguinte:
O local preto acima é basicamente o local que queremos substituir mais tarde. Por exemplo, se o xytitle for substituído por $ {xytitle}, você deve prestar muita atenção à tabela. Por exemplo, a tabela abaixo de perguntas de múltipla escolha pode ser posicionada pesquisando perguntas de múltipla escolha. Um par de <w: tr> </w: tr> representa uma linha, ou seja, um registro (uma pergunta). Aqui precisamos usar um par de <#list> </#list> para incluí -lo para preencher posteriormente os dados. Para detalhes, consulte a gramática da página Freemarker. Por exemplo, aqui as perguntas de múltipla escolha, temos dois comportamentos e um registro, por isso precisamos <#list> </#list> para incluir duas linhas, conforme mostrado em: <#list tabela1 como plano1> <w: tr> no número da pergunta </w: tr> <w: tr> opção </w: tr> </#list>, e então encontre o correspondente xz xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, com uma opção, e depois, e encontre o correspondente xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, xz, com uma opção, e depois encontre-se, e depois encontre o correspondente xz, xz, xz. com $ {plan1.xzn}, $ {plan1.xztest}, $ {plan1.ans1}, $ {plan1.ans2}, $ {plan1.ans3}, $ {plan1.ans4}, observe que a tabela e o plano1 são nomeados aqui. Tabela1 e dados de preenchimento subsequentes devem ser usados. Outras substituições são iguais, e os resultados são os seguintes:
Depois de salvar, modifique o nome do sufixo para FTL e o modelo é concluído.
2. Implementação de programação
O pacote Freemarker-2.3.13.jar é usado aqui, e o código é o seguinte:
pacote comum; importar java.io.bufferedwriter; importar java.io.file; importar java.io.filenotfoundException; importar java.io.fileOutputStream; importar java.io.ioException; importar java.io.OutputStreamWriter; importar java.io.unsupportEnCodingException; importar java.io.writer; importar java.util.map; importar freemarker.template.configuration; importar freemarker.template.template; importar freemarker.template.template; importar freemarker.template.templateException; classe pública DocumentHandler {Configuração de configuração privada = null; public DocumentHandler () {Configuration = new Configuration (); Configuration.SetDefaultEncoding ("UTF-8"); } public void CreateDoc (map <string, object> datamap, string filename) lança UnsupportEnCodingException {// DATAMAP para preencher o arquivo de dados do script modulo // Defina o método e o caminho do dispositivo de script módulo, o FreeMarker suporta vários métodos de carga. Você pode ser servido novamente, o ClassPath e o carregamento do banco de dados. // Aqui, nosso modelo é colocado sob o pacote de modelos Configuration.setClassfortemplatELoading (this.getclass (), "/modelo"); Modelo t = nulo; tente {//test.ftl é o modelo a ser carregado t = configuration.getTemplate ("fctestpaper.ftl"); } catch (ioexception e) {e.printStackTrace (); } // Saída Caminho do documento e arquivo de nome outfile = novo arquivo (nome do arquivo); Escritor out = null; FileOutputStream fos = null; tente {fos = new FileOutputStream (outfile); OutputStreamWriter owriter = new OatdStreamWriter (Fos, "UTF-8"); // Este local é indispensável para a codificação de streaming. Quando chamado separadamente usando o main (), deve estar ok, mas se for uma solicitação da Web para exportar o documento do Word, não será aberto após a exportação e o arquivo XML do pacote está incorreto. A principal razão é que o formato de codificação está incorreto e não pode ser analisado. // out = new BufferWriter (novo outputStreamWriter (new FileOutputStream (outfile))); out = new BufferWriter (Owriter); } catch (filenotfoundException e1) {e1.printStackTrace (); } tente {t.process (datamap, out); out.Close (); fos.close (); } catch (modelplateException e) {e.printStackTrace (); } catch (ioexception e) {e.printStackTrace (); } //System.out.println("------------------------------------------------------------------------------------------------------------------------ Em seguida, prepare a chamada de dados, o código é o seguinte:
pacote com.havenliu.document; importar java.io.unsupportEnCodingException; importar java.util.arraylist; importar java.util.hashmap; importar java.util.list; importar java.util.map; classe pública main { / ** * @param args * @THOWS UnsupportEdEncodingException * / public static void main (string [] args) lança UnsupportEnCodingException {; Mapa <string, object> datamap = new hashmap <string, object> (); datamap.put ("xytitle", "papel de exame"); int index = 1; // Lista de múltiplas opções <map <string, object >> list1 = new ArrayList <map <string, object >> (); // Lista de perguntas <map <string, object >> list11 = new ArrayList <map <string, object >> (); // Índice de resposta = 1; for (int i = 0; i <5; i ++) {map <string, object> map = new hashmap <string, object> (); map.put ("xzn", index + "."); map.put ("xztest", "() sistema operacional permite que vários terminais sejam conectados a um host ao mesmo tempo, e vários usuários podem usar o computador interativamente através de seus respectivos terminais ao mesmo tempo."); map.put ("ANS1", "A" + Index); map.put ("ANS2", "B" + índice); map.put ("ANS3", "C" + Index); map.put ("ANS4", "D" + índice); list1.add (mapa); Mapa <string, objeto> map1 = new hashmap <string, object> (); map1.put ("foda -se", index + "."); map1.put ("abc", "a" + index); List11.add (map1); índice ++; } datamap.put ("Tabela1", List1); datamap.put ("Tabela11", Lista11); // preencha a lista de espaços em branco <map <string, object>> list2 = new ArrayList <map <string, object >> (); List <map <string, objeto >> 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", index + "."); map.put ("tktest", "o sistema operacional é um software ___ sistema________ no sistema de computador, que gerencia e controla _________ no sistema de computador."); list2.add (mapa); Mapa <string, objeto> map1 = new hashmap <string, object> (); map1.put ("preenchimento", index + "."); map1.put ("def", "agendamento intermediário" + índice); list12.add (map1); índice ++; } datamap.put ("Tabela2", List2); datamap.put ("Tabela12", List12); // Lista de perguntas do julgamento <map <string, object >> list3 = new ArrayList <map <string, object >> (); List <map <string, objeto >> 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", index + "."); Map.put ("PDTest", "Firewall Composite Firewall é o ponto de isolamento entre a rede interna e a rede externa e desempenha o papel de monitorar e isolar o fluxo de comunicação da camada de aplicação e também é frequentemente combinado com a função dos filtros"); list3.add (mapa); Mapa <string, objeto> map1 = new hashmap <string, object> (); map1.put ("juiz", índice + "."); map1.put ("hij", "v" + index); list13.add (map1); índice ++; } datamap.put ("Tabela3", List3); datamap.put ("Tabela13", List13); // Lista de perguntas de resposta curta <map <string, object >> list4 = new ArrayList <map <string, object >> (); List <map <string, objeto >> 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", index + "."); map.put ("jdtest", "descreva a diferença entre agendamento de empregos, agendamento intermediário e agendamento de processos e analise qual nível de agendador deve ser responsável pelos seguintes problemas."); list4.Add (mapa); Mapa <string, objeto> map1 = new hashmap <string, object> (); map1.put ("Resposta", índice + "."); Map1.put ("XYZ", "Descreva a diferença entre agendamento de empregos, agendamento intermediário e agendamento de processos e analise qual nível de agendador deve ser responsável pelos seguintes problemas."); list14.add (map1); índice ++; } datamap.put ("Tabela4", List4); datamap.put ("Tabela14", List14); Mdoc mdoc = novo mdoc (); mdoc.createdoc (datamap, "e: /outfile.doc"); }} Observe que a chave no mapa acima deve corresponder ao modelo, caso contrário, um erro será relatado. Os efeitos são os seguintes:
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.