poi 4.11版本 word模板操作
写代码之前先说说遇到的问题,之前word模板是使用poi 3.9的包实现的,之后又写了exlce上传下载的功能使用的是poi 4.11的版本,他们之间融合的时候发现包冲突,总有一个功能不能使用,之后发现poi 4 之后把一些poi 3支持的方法直接放弃了,导致之前好用的功能不好用。为了看poi4.11版本如何操作word模板网上找了很多资料没有一个可以直接拿来用的,后来又通过各种调试修改终于搞成了。输入的文本只能是.docx,生成的可以是.docx也可以是.doc。
操作word模板文本和表格还不是一个方法,新版本设置个字体都挺费劲,网上可用的资料太少了。废话不说了直接上代码
注:实际的操作中有的时候会发现 ${name} 这样一个标记为有的时候会被代码认成是 ${、name 、} 这三个字符导致替换失败,解决办法是,把${name}写在txt里然后直接粘贴在word里,不要在word里手敲${name} ,这真是个坑人的点。
一、pom.xnl
依赖的核心包
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.1</version> </dependency>
二、代码
public class WordDoUtil { public static void main(String[] args) { System.out.println("path:"+System.getProperty("user.dir").toString()); Map map=new HashMap(); map.put("${name}","张三"); map.put("${num}","123456"); map.put("${agree}","■"); map.put("${refuse}","□"); map.put("${ha}","11111"); getBuild("doc/在校证明.docx",map,"D:/在校证明1.doc"); } public static void getBuild(String tmpFile, Map<String, String> map, String exportFile){ XWPFDocument document = null; try { document = new XWPFDocument( POIXMLDocument.openPackage(System.getProperty("user.dir").toString()+"\\"+tmpFile)); } catch (IOException e) { e.printStackTrace(); } // 替换段落中的指定文字 Iterator<XWPFParagraph> itPara = document.getParagraphsIterator(); while (itPara.hasNext()) { XWPFParagraph paragraph = (XWPFParagraph) itPara.next(); String s = paragraph.getParagraphText(); System.out.println("s:"+s); Set<String> set = map.keySet(); Iterator<String> iterator = set.iterator(); while (iterator.hasNext()) { String key = iterator.next(); List<XWPFRun> run=paragraph.getRuns(); for(int i=0;i<run.size();i++) { if(run.get(i).getText(run.get(i).getTextPosition())!=null && run.get(i).getText(run.get(i).getTextPosition()).equals(key)) { /**参数0表示生成的文字是要从哪一个地方开始放置,设置文字从位置0开始 * 就可以把原来的文字全部替换掉了 * */ run.get(i).setText(map.get(key),0); } } } } // 替换表格中的指定文字 Iterator<XWPFTable> itTable = document.getTablesIterator(); while (itTable.hasNext()) { XWPFTable table = (XWPFTable) itTable.next(); int rcount = table.getNumberOfRows(); for (int i = 0; i < rcount; i++) { XWPFTableRow row = table.getRow(i); List<XWPFTableCell> cells = row.getTableCells(); for (XWPFTableCell cell : cells) { String tempText = cell.getText(); int have = 0; for (Map.Entry<String, String> e : map.entrySet()) { if (tempText.contains(e.getKey())) { have =1; tempText = tempText.replace(e.getKey(),e.getValue()); } } if(have ==1) { cell.removeParagraph(0); //------------设置字体式样----- XWPFParagraph pIO =cell.addParagraph(); XWPFRun rIO = pIO.createRun(); rIO.setFontFamily("楷体"); rIO.setFontSize(9); rIO.setText(tempText); //这样写格式没用 // cell.setText(tempText); } } } } FileOutputStream outStream = null; try { outStream = new FileOutputStream(exportFile); document.write(outStream); outStream.close(); } catch (Exception e) { e.printStackTrace(); } } }
资源丰富的的网盘资源:网盘资源大全! 推荐一个适合零基础学习SQL的网站:不用安装数据库,在线轻松学习SQL!