1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
public class GenerateDocxUtil { private static Logger logger = LoggerFactory.getLogger(GenerateDocxUtil.class); public static void freemarkerDocxTest(String rootPath, Map<String,Object> dataMap, String docxPath) throws Exception{ Configuration configuration = new Configuration(); String fileDirectory = rootPath; configuration.setDirectoryForTemplateLoading(new File(fileDirectory)); String temName = "tem1.xml"; String docxZipPath = rootPath + "tem1.zip"; Template template = configuration.getTemplate(temName);
String outFilePath = rootPath + UUID.randomUUID().toString().replace("-","") + ".xml"; File docXmlFile = new File(outFilePath); FileOutputStream fos = new FileOutputStream(docXmlFile); Writer out = new BufferedWriter(new OutputStreamWriter(fos),10240); template.process(dataMap,out); if(out != null){ out.close(); }
ZipInputStream zipInputStream = wrapZipInputStream(new FileInputStream(new File(docxZipPath))); ZipOutputStream zipOutputStream = wrapZipOutputStream(new FileOutputStream(new File(docxPath))); List<String> itemNameList = new ArrayList<>(); itemNameList.add("word/document.xml");
List<InputStream> itemInputStreamList = new ArrayList<>(); itemInputStreamList.add(new FileInputStream(new File(outFilePath)));
replaceItemList(zipInputStream, zipOutputStream, itemNameList, itemInputStreamList); new File(outFilePath).delete(); logger.info("Word-docx文档生成完成"); }
public static ZipInputStream wrapZipInputStream(InputStream inputStream){ ZipInputStream zipInputStream = new ZipInputStream(inputStream); return zipInputStream; }
public static ZipOutputStream wrapZipOutputStream(OutputStream outputStream){ ZipOutputStream zipOutputStream = new ZipOutputStream(outputStream); return zipOutputStream; }
public static void replaceItemList(ZipInputStream zipInputStream, ZipOutputStream zipOutputStream, List<String> itemNameList, List<InputStream> itemInputStreamList){ if(null == zipInputStream){return;} if(null == zipOutputStream){return;} ZipEntry entryIn; try { while((entryIn = zipInputStream.getNextEntry())!=null){ String entryName = entryIn.getName(); ZipEntry entryOut = new ZipEntry(entryName); zipOutputStream.putNextEntry(entryOut); byte [] buf = new byte[8*1024]; int len;
if(itemNameList.indexOf(entryName) != -1){ while((len = (itemInputStreamList.get(itemNameList.indexOf(entryName)).read(buf))) > 0) { zipOutputStream.write(buf, 0, len); } } else { while((len = (zipInputStream.read(buf))) > 0) { zipOutputStream.write(buf, 0, len); } } zipOutputStream.closeEntry();
} } catch (IOException e) { e.printStackTrace(); }finally { for (InputStream itemInputStream:itemInputStreamList) { close(itemInputStream); } close(zipInputStream); close(zipOutputStream); } }
private static void close(InputStream inputStream){ if (null != inputStream){ try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }
private static void close(OutputStream outputStream){ if (null != outputStream){ try { outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
|