1、编辑word模板,需要动态填充数据的用对应的占位符替代,表格的话只保留表格的头即可。
2、dom4j读取模板,然后进行填充数据。
3、输出word格式的xml。
@SuppressWarnings("unchecked") public class Test2 { /** * @param args */ public static void main(String[] args) throws Exception { File file = new File("c:\\t2007.xml"); handleWord(file); } public static void handleWord(File file) throws Exception { Map<String, String> map = new HashMap(); map.put("orderCd", "10004"); map.put("workContent", "word工作测试"); map.put("preparePerson", "王五"); map.put("prepareTime", "2010年10月2日"); map.put("backPerson", "李四"); map.put("backDate", "2012年12月23日"); map.put("bjclPreparePerson", "绿茶"); map.put("bjclPrepareTime", "2012年12月9日"); map.put("bjclBackPerson", "可乐"); map.put("bjclBackDate", "2014年1月2日"); List datas = new ArrayList(); List temp = new ArrayList(); temp.add(new Object[] { "1", "http://schemas.openxmlformats.org/wordprocessingml/2006/main", "b1", "c1", "c1" }); temp.add(new Object[] { "1", "http://schemas.openxmlformats.org/wordprocessingml/2006/main", "b2", "c2", "c1" }); temp.add(new Object[] { "1", "a3", "b3", "c3", "c1" }); temp.add(new Object[] { "2", "a3", "b3", "c3", "c1" }); temp.add(new Object[] { "3", "a3", "b3", "c3", "c1" }); temp.add(new Object[] { "3", "a3", "b3", "c3", "c1" }); temp.add(new Object[] { "3", "a3", "b3", "c3", "c1" }); datas.add(temp); temp = new ArrayList(); temp.add(new Object[] { "1", "aa1", "bb1", "cc1", "c1" }); temp.add(new Object[] { "2", "http://schemas.openxmlformats.org/wordprocessingml/2006/main", "bb2", "cc2", "c1" }); temp.add(new Object[] { "3", "aa3", "bb3", "cc3", "c1" }); datas.add(temp); SAXReader reader = new SAXReader(); InputStream inputStream=new FileInputStream(file); // inputStream.read(data); Document doc = reader.read(inputStream);// 获取document replaceText(doc, map); appendTable(doc, datas); DefaultXPath xpath = new DefaultXPath("//w:document//w:body//w:tbl"); xpath .setNamespaceURIs(Collections .singletonMap("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main")); List<Element> tables = xpath.selectNodes(doc); handle(doc,tables.get(0),new String[]{"0"}); XMLWriter writer = null; OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("utf-8"); writer = new XMLWriter(new FileOutputStream(new File("c:\\o2007.xml")), format);
writer.write(doc); writer.flush(); writer.close(); } /** * * @param document * @param map * @throws Exception */ public static void replaceText(Document document, Map<String, String> map) throws Exception { DefaultXPath xpath = new DefaultXPath("//w:document//w:body//w:t"); xpath .setNamespaceURIs(Collections .singletonMap("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main")); List<Element> texts = xpath.selectNodes(document); for (Element element : texts) { if ("".equals(element.getTextTrim())) continue; for (Map.Entry<String, String> entry : map.entrySet()) { if (element.getText().contains(entry.getKey())) { element.setText(entry.getValue()); } } } } /** * * @param document * @param list * @throws Exception */ public static void appendTable(Document document, List datas) throws Exception { DefaultXPath xpath = new DefaultXPath("//w:document//w:body//w:tbl"); xpath .setNamespaceURIs(Collections .singletonMap("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main")); List<Element> tables = xpath.selectNodes(document); List data = null; Element table, tr, td, p, t, r; Object[] obj; // table for (int i = 0; i < tables.size(); i++) { if (i >= datas.size()) break; data = (List) datas.get(i); // 取得一个table对象 table = tables.get(i); // 行数 for (int j = 0; j < data.size(); j++) { obj = (Object[]) data.get(j); tr = table.addElement("w:tr"); // 对列对象进行数据填充 for (int k = 0; k < obj.length; k++) { td = tr.addElement("w:tc"); td.addAttribute("w:val", (String) obj[k]); p = td.addElement("w:p"); r = p.addElement("w:r"); t = r.addElement("w:t"); t.setText((String) obj[k]); } } } } public static void handle(Document document,Element table,String[] columnIdx) throws Exception { Element line, column; List<Element> lines,columns; Attribute attribute = null; lines = table.elements("tr"); MultiHashMap multiHashMap = new MultiHashMap(); for (int i = 1; i < lines.size(); i++) { line = lines.get(i); columns = line.elements("tc"); for(String index:columnIdx) { column = columns.get(Integer.parseInt(index)); attribute = column.attribute("w:val"); multiHashMap.put(attribute.getText(), column); } } //进行合并单元格 String key = null; Collection collection = null; Element[] vMergeArr = null; boolean flag; for (Iterator iterator = multiHashMap.keySet().iterator(); iterator .hasNext();) { flag = true; key = (String) iterator.next(); collection = multiHashMap.getCollection(key); if (collection.size() > 1) { vMergeArr = (Element[]) collection.toArray(new Element[0]); for (Element e : vMergeArr) { if (flag) { e.addElement("w:vMerge").addAttribute("w:val", "restart"); flag = false; } else { e.addElement("w:vMerge"); } } } } } }