1、docx4j操作wordDocx4j操作word1.Docx4j介绍1.1.Docx4j介绍docx4j是一个用于创建和操作Microsoft Open XML (Word docx, Powerpoint pptx, 和 Excel xlsx)文件的Java类库。http:/www.docx4java.org/trac/docx4j 官方主页。2.Docx4j操作2.1.初始读取word WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage .load(WordChartDataRenderTest.class.get
2、ClassLoader().getResourceAsStream(tpl.docx);2.2.标签替换在操作word的时候,多数情况的下是通过标签进行替换相关的内容。标签在word中可以定义一个位置,或者标示一个段落内容。在一个模板中定义好标签,在插入-书签:然后定义好名称。在java的代码中对标签进行遍历,得到该名称,并替换成相关的内容。/ try List paragraphs = wordMLPackage.getMainDocumentPart().getContent(); RangeFinder rt = new RangeFinder(CTBookmark, CTMarkupR
3、ange); new TraversalUtil(paragraphs, rt); / 遍历所有的标签 for (CTBookmark bm : rt.getStarts() if (StringUtil.isEmpty(bm.getName() continue; ReportData obj = data.get(bm.getName(); if (obj = null | !(obj instanceof ReportData) if(bm.getName().indexOf(_) = 0) else logger.error(bookmark fill data, data is em
4、pty! + bm.getName(); continue; try List theList = null; ParaRPr rpr = null; if (bm.getParent() instanceof P) PPr pprTemp = (P) (bm.getParent().getPPr(); if (pprTemp = null) rpr = null; else rpr = (P) (bm.getParent().getPPr().getRPr(); theList = (ContentAccessor) (bm.getParent().getContent(); else co
5、ntinue; int rangeStart = -1; int rangeEnd = -1; int i = 0; for (Object ox : theList) Object listEntry = XmlUtils.unwrap(ox); if (listEntry.equals(bm) rangeStart = i + 1; else if (listEntry instanceof CTMarkupRange) if (CTMarkupRange) listEntry).getId().equals(bm.getId() rangeEnd = i - 1; break; i+;
6、if (rangeStart = 0) for (int j = rangeEnd; j = rangeStart; j-) theList.remove(j); org.docx4j.wml.R run = factory.createR(); org.docx4j.wml.Text t = factory.createText(); run.getContent().add(t); if (rpr != null) run.setRPr(paraRPr2RPr(rpr, factory); t.setValue(value); theList.add(rangeStart, run); c
7、atch (Exception cce) logger.error(cce.getMessage(), cce); throw cce; catch (Exception e) throw e; 找到相应的位置然后替换,相应的文本,需要注意的是替换相关的内容的格式。2.3.chart图表内容替换chart图的替换有两种方法,一种是word里面的插入的图表,这时在进行更改值的时候,需要更改图标的内容,然后再更新excel的相关内容。【没有找到更新一个自动更新另一个的方法。】public class BarChartTest public static void main(String args)
8、 throws Docx4JException WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage .load(WordChartDataRenderTest.class.getClassLoader().getResourceAsStream(tpl.docx); ChartData data = new ChartData(); ObjectFactory factory = new org.docx4j.wml.ObjectFactory(); List paragraphs = wordMLPackage.ge
9、tMainDocumentPart().getContent(); HashMap parts = wordMLPackage.getParts().getParts(); parts.forEach(partName, part) - if (partName.getName().toLowerCase().indexOf(excel) 0) / s System.out.println(part.getClass().getName(); / if (partName.getName().indexOf(charts) 0 & (part instanceof Chart) Chart c
10、hart = (Chart) part; List objects; try objects = chart.getContents().getChart().getPlotArea().getAreaChartOrArea3DChartOrLineChart(); if (objects.size() = 1) objects.forEach(obj) - if (obj instanceof CTBarChart) CTBarChart ctRadarChart = (CTBarChart) obj; String str = partName.getName(); str = str.s
11、ubstring(str.lastIndexOf(/) + 1); System.out.println(str); BarChartTest._renderCTBarChart(ctRadarChart, Arrays.asList(Arrays.asList(12, 23), Arrays.asList(89, 56), Arrays.asList(A, b), Arrays.asList(A11, b11); ); catch (Docx4JException e) e.printStackTrace(); / end if ); EmbeddedPackagePart epp = (E
12、mbeddedPackagePart) wordMLPackage.getParts() .get(new PartName(/word/embeddings/Microsoft_Excel_1.xlsx); if (epp = null) throw new Docx4JException(Could find EmbeddedPackagePart:/word/embeddings/Microsoft_Excel_1.xlsx ); InputStream is = BufferUtil.newInputStream(epp.getBuffer(); SpreadsheetMLPackag
13、e spreadSheet = (SpreadsheetMLPackage) SpreadsheetMLPackage.load(is); Map partsMap = spreadSheet.getParts().getParts(); IteratorEntry it = partsMap.entrySet().iterator(); while (it.hasNext() Map.Entry pairs = it.next(); if (partsMap.get(pairs.getKey() instanceof WorksheetPart) WorksheetPart wsp = (W
14、orksheetPart) partsMap.get(pairs.getKey(); List rows = wsp.getJaxbElement().getSheetData().getRow(); for (Row row : rows) List cells = row.getC(); for (Cell cell : cells) if (cell.getR().equals(B2) & cell.getV() != null) System.out.println(B2 CELL VAL: + cell.getV(); / change the B2 cell value cell.
15、setT(STCellType.N); cell.setV(3); else if (cell.getR().equals(B3) & cell.getV() != null) System.out.println(B3 CELL VAL: + cell.getV(); / Change the B3 cell value cell.setT(STCellType.N); cell.setV(3); ByteArrayOutputStream baos = new ByteArrayOutputStream(); SaveToZipFile saver = new SaveToZipFile(
16、spreadSheet); saver.save(baos); epp.setBinaryData(baos.toByteArray(); wordMLPackage.save(new File(./sss.docx); private static void _renderCTBarChart(CTBarChart chart, ListList data, List strName, List txList) List list = chart.getSer(); int ii = 0; while (data.size() list.size() CTBarSer ser = new C
17、TBarSer(); CTUnsignedInt index = new CTUnsignedInt(); index.setVal(list.size(); CTSerTx tx = new CTSerTx(); CTStrRef cTStrReftx = new CTStrRef(); cTStrReftx.setF(); cTStrReftx.setExtLst(new CTExtensionList(); cTStrReftx.setStrCache(new CTStrData(); tx.setStrRef(cTStrReftx); ser.setTx(tx); CTNumDataS
18、ource CTNumDataSource = new CTNumDataSource(); CTNumRef CTNumRef = new CTNumRef(); CTNumRef.setF(); CTNumRef.setExtLst(new CTExtensionList(); CTNumRef.setNumCache(new CTNumData(); CTNumDataSource.setNumRef(CTNumRef); / CTNumDataSource ser.setVal(CTNumDataSource); / ser.s CTAxDataSource CTAxDataSourc
19、e = list.get(ii).getCat(); ser.setCat(CTAxDataSource); ser.setIdx(index); ser.setOrder(index); ser.setInvertIfNegative(list.get(ii).getInvertIfNegative(); ser.setSpPr(list.get(ii).getSpPr(); list.add(ser); ii+; for (int j = 0; j list.size() & j data.size(); j+) / 值 List ctNumVals = list.get(j).getVa
20、l().getNumRef().getNumCache().getPt(); / 横坐标 List ctStrVals = list.get(j).getCat().getStrRef().getStrCache().getPt(); / List txStrVals = list.get(j).getTx().getStrRef().getStrCache().getPt(); ctNumVals.clear(); ctStrVals.clear(); while (data.get(j).size() ctNumVals.size() CTNumVal numVal = new CTNum
21、Val(); numVal.setIdx(ctNumVals.size(); ctNumVals.add(ctNumVals.size(), numVal); while (strName.size() ctStrVals.size() CTStrVal strVal = new CTStrVal(); strVal.setIdx(ctStrVals.size(); ctStrVals.add(ctStrVals.size(), strVal); if (txStrVals.size() 1) CTStrVal strVal = new CTStrVal(); strVal.setIdx(tx
22、StrVals.size(); txStrVals.add(txStrVals.size(), strVal); txStrVals.get(0).setV(txList.get(j); for (int i = 0; i data.get(j).size(); i+) try ctStrVals.get(i).setV(strName.get(i); ctNumVals.get(i).setV(String.valueOf(data.get(j).get(i); catch (Exception e) e.printStackTrace(); / private static void _r
23、enderCTRadarChart(CTRadarChart chart, List data, List name) List list = chart.getSer(); for (int j = 0; j list.size(); j+) List ctNumVals = list.get(j).getVal().getNumRef().getNumCache().getPt(); List ctStrVals = list.get(j).getCat().getStrRef().getStrCache().getPt(); ctNumVals.clear(); ctStrVals.cl
24、ear(); while (data.size() ctNumVals.size() CTNumVal numVal = new CTNumVal(); numVal.setIdx(ctNumVals.size(); ctNumVals.add(ctNumVals.size(), numVal); while (data.size() ctStrVals.size() CTStrVal strVal = new CTStrVal(); strVal.setIdx(ctStrVals.size(); ctStrVals.add(ctStrVals.size(), strVal); for (in
25、t i = 0; i data.size(); i+) ctStrVals.get(i).setV(name.get(i); ctNumVals.get(i).setV(String.valueOf(data.get(i); 另一种使用jfreechart生成一个图片,然后以图片的形式插入进入。2.4.插入图片可以使用标签的形式插入图片。通过书签找到要插入的位置,然后按照下面方法进行插入。Byte 内为图片的内容。public class WordImageDataRender implements IWordReportDataRender public void render(Report
26、Data data, ItemConsumer consumer, ObjectFactory factory, WordprocessingMLPackage wordMLPackage) throws Exception if (!(data instanceof ImageData) return; ImageData imageData = (ImageData) data; byte bytes = imageData.getBody(); String filenameHint = null; String altText = null; int id1 = 0; int id2 = 1; R p3 = newImage(wordMLPackage, factory, bytes, filenameHint, altText, id1, id2); consumer.accept(p3); return; private static R newImage(WordprocessingMLPackage wordMLPackage, ObjectFactory factory, byte bytes, String filenameHint, String a
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1