docx4j操作word.docx
《docx4j操作word.docx》由会员分享,可在线阅读,更多相关《docx4j操作word.docx(14页珍藏版)》请在冰豆网上搜索。
![docx4j操作word.docx](https://file1.bdocx.com/fileroot1/2023-5/15/6773da7f-86b9-44e8-b6ae-c1ac9f3acd71/6773da7f-86b9-44e8-b6ae-c1ac9f3acd711.gif)
docx4j操作word
Docx4j操作word
1.Docx4j介绍
1.1.Docx4j介绍
docx4j是一个用于创建和操作MicrosoftOpenXML(Worddocx,Powerpointpptx,和Excelxlsx)文件的Java类库。
http:
//www.docx4java.org/trac/docx4j官方主页。
2.Docx4j操作
2.1.初始读取word
WordprocessingMLPackagewordMLPackage=WordprocessingMLPackage
.load(WordChartDataRenderTest.class.getClassLoader().getResourceAsStream("tpl.docx"));
2.2.标签替换
在操作word的时候,多数情况的下是通过标签进行替换相关的内容。
标签在word中可以定义一个位置,或者标示一个段落内容。
在一个模板中定义好标签,在插入-》书签:
然后定义好名称。
在java的代码中对标签进行遍历,得到该名称,并替换成相关的内容。
//
try{
List
RangeFinderrt=newRangeFinder("CTBookmark","CTMarkupRange");
newTraversalUtil(paragraphs,rt);
//遍历所有的标签
for(CTBookmarkbm:
rt.getStarts()){
if(StringUtil.isEmpty(bm.getName()))
continue;
ReportDataobj=data.get(bm.getName());
if(obj==null||!
(objinstanceofReportData)){
if(bm.getName().indexOf("_")==0){
}else{
logger.error("bookmarkfilldata,dataisempty!
"+bm.getName());
}
continue;
}
try{
List
ParaRPrrpr=null;
if(bm.getParent()instanceofP){
PPrpprTemp=((P)(bm.getParent())).getPPr();
if(pprTemp==null){
rpr=null;
}else{
rpr=((P)(bm.getParent())).getPPr().getRPr();
}
theList=((ContentAccessor)(bm.getParent())).getContent();
}else{
continue;
}
intrangeStart=-1;
intrangeEnd=-1;
inti=0;
for(Objectox:
theList){
ObjectlistEntry=XmlUtils.unwrap(ox);
if(listEntry.equals(bm)){
rangeStart=i+1;
}elseif(listEntryinstanceofCTMarkupRange){
if(((CTMarkupRange)listEntry).getId().equals(bm.getId())){
rangeEnd=i-1;
break;
}
}
i++;
}
if(rangeStart>=0){
for(intj=rangeEnd;j>=rangeStart;j--){
theList.remove(j);
}
org.docx4j.wml.Rrun=factory.createR();
org.docx4j.wml.Textt=factory.createText();
run.getContent().add(t);
if(rpr!
=null)
run.setRPr(paraRPr2RPr(rpr,factory));
t.setValue(value);
theList.add(rangeStart,run);
}
}catch(Exceptioncce){
logger.error(cce.getMessage(),cce);
throwcce;
}
}
}catch(Exceptione){
throwe;
}
找到相应的位置然后替换,相应的文本,需要注意的是替换相关的内容的格式。
2.3.chart图表内容替换
chart图的替换有两种方法,一种是word里面的插入的图表,这时在进行更改值的时候,需要更改图标的内容,然后再更新excel的相关内容。
【没有找到更新一个自动更新另一个的方法。
】
publicclassBarChartTest{
publicstaticvoidmain(String[]args)throwsDocx4JException{
WordprocessingMLPackagewordMLPackage=WordprocessingMLPackage
.load(WordChartDataRenderTest.class.getClassLoader().getResourceAsStream("tpl.docx"));
ChartDatadata=newChartData();
ObjectFactoryfactory=neworg.docx4j.wml.ObjectFactory();
List
HashMapparts=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&&(partinstanceofChart)){
Chartchart=(Chart)part;
List
try{
objects=chart.getContents().getChart().getPlotArea().getAreaChartOrArea3DChartOrLineChart();
if(objects.size()>=1){
objects.forEach((obj)->{
if(objinstanceofCTBarChart){
CTBarChartctRadarChart=(CTBarChart)obj;
Stringstr=partName.getName();
str=str.substring(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(Docx4JExceptione){
e.printStackTrace();
}
}//endif
});
EmbeddedPackagePartepp=(EmbeddedPackagePart)wordMLPackage.getParts()
.get(newPartName("/word/embeddings/Microsoft_Excel____1.xlsx"));
if(epp==null){
thrownewDocx4JException("CouldfindEmbeddedPackagePart:
/word/embeddings/Microsoft_Excel____1.xlsx");
}
InputStreamis=BufferUtil.newInputStream(epp.getBuffer());
SpreadsheetMLPackagespreadSheet=(SpreadsheetMLPackage)SpreadsheetMLPackage.load(is);
MappartsMap=spreadSheet.getParts().getParts();
Iterator>it=partsMap.entrySet().iterator();
while(it.hasNext()){
Map.Entrypairs=it.next();
if(partsMap.get(pairs.getKey())instanceofWorksheetPart){
WorksheetPartwsp=(WorksheetPart)partsMap.get(pairs.getKey());
Listrows=wsp.getJaxbElement().getSheetData().getRow();
for(Rowrow:
rows){
Listcells=row.getC(); |
for(Cellcell:
cells){
if(cell.getR().equals("B2")&&cell.getV()!
=null){
System.out.println("B2CELLVAL:
"+cell.getV());
//changetheB2cellvalue
cell.setT(STCellType.N);
cell.setV("3");
}elseif(cell.getR().equals("B3")&&cell.getV()!
=null){
System.out.println("B3CELLVAL:
"+cell.getV());
//ChangetheB3cellvalue
cell.setT(STCellType.N);
cell.setV("3");
}
}
}
}
}
ByteArrayOutputStreambaos=newByteArrayOutputStream();
SaveToZipFilesaver=newSaveToZipFile(spreadSheet);
saver.save(baos);
epp.setBinaryData(baos.toByteArray());
wordMLPackage.save(newFile("./sss.docx"));
}
privatestaticvoid_renderCTBarChart(CTBarChartchart,List>data,ListstrName,
ListtxList){
Listlist=chart.getSer();
intii=0;
while(data.size()>list.size()){
CTBarSerser=newCTBarSer();
CTUnsignedIntindex=newCTUnsignedInt();
index.setVal(list.size());
CTSerTxtx=newCTSerTx();
CTStrRefcTStrReftx=newCTStrRef();
cTStrReftx.setF("");
cTStrReftx.setExtLst(newCTExtensionList());
cTStrReftx.setStrCache(newCTStrData());
tx.setStrRef(cTStrReftx);
ser.setTx(tx);
CTNumDataSourceCTNumDataSource=newCTNumDataSource();
CTNumRefCTNumRef=newCTNumRef();
CTNumRef.setF("");
CTNumRef.setExtLst(newCTExtensionList());
CTNumRef.setNumCache(newCTNumData());
CTNumDataSource.setNumRef(CTNumRef);
//CTNumDataSource
ser.setVal(CTNumDataSource);
//ser.s
CTAxDataSourceCTAxDataSource=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(intj=0;j//值
ListctNumVals=list.get(j).getVal().getNumRef().getNumCache().getPt();
//横坐标
ListctStrVals=list.get(j).getCat().getStrRef().getStrCache().getPt();
//
ListtxStrVals=list.get(j).getTx().getStrRef().getStrCache().getPt();
ctNumVals.clear();
ctStrVals.clear();
while(data.get(j).size()>ctNumVals.size()){
CTNumValnumVal=newCTNumVal();
numVal.setIdx(ctNumVals.size());
ctNumVals.add(ctNumVals.size(),numVal);
}
while(strName.size()>ctStrVals.size()){
CTStrValstrVal=newCTStrVal();
strVal.setIdx(ctStrVals.size());
ctStrVals.add(ctStrVals.size(),strVal);
}
if(txStrVals.size()<1){
CTStrValstrVal=newCTStrVal();
strVal.setIdx(txStrVals.size());
txStrVals.add(txStrVals.size(),strVal);
}
txStrVals.get(0).setV(txList.get(j));
for(inti=0;itry{
ctStrVals.get(i).setV(strName.get(i));
ctNumVals.get(i).setV(String.valueOf(data.get(j).get(i)));
}catch(Exceptione){
e.printStackTrace();
}
}
}
//
}
privatestaticvoid_renderCTRadarChart(CTRadarChartchart,Listdata,Listname){
Listlist=chart.getSer();
for(intj=0;jListctNumVals=list.get(j).getVal().getNumRef().getNumCache().getPt();
ListctStrVals=list.get(j).getCat().getStrRef().getStrCache().getPt();
ctNumVals.clear();
ctStrVals.clear();
while(data.size()>ctNumVals.size()){
CTNumValnumVal=newCTNumVal();
numVal.setIdx(ctNumVals.size());
ctNumVals.add(ctNumVals.size(),numVal);
}
while(data.size()>ctStrVals.size()){
CTStrValstrVal=newCTStrVal();
strVal.setIdx(ctStrVals.size());
ctStrVals.add(ctStrVals.size(),strVal);
}
for(inti=0;ictStrVals.get(i).setV(name.get(i));
ctNumVals.get(i).setV(String.valueOf(data.get(i)));
}
}
}
}
另一种使用jfreechart生成一个图片,然后以图片的形式插入进入。
2.4.插入图片
可以使用标签的形式插入图片。
通过书签找到要插入的位置,然后按照下面方法进行插入。
Byte[]内为图片的内容。
publicclassWordImageDataRenderimplementsIWordReportDataRender{
publicvoidrender(ReportDatadata,ItemConsumerconsumer,ObjectFactoryfactory,
WordprocessingMLPackagewordMLPackage)throwsException{
if(!
(datainstanceofImageData)){
return;
}
ImageDataimageData=(ImageData)data;
byte[]bytes=imageData.getBody();
StringfilenameHint=null;
StringaltText=null;
intid1=0;
intid2=1;
Rp3=newImage(wordMLPackage,factory,bytes,filenameHint,altText,id1,id2);
consumer.accept(p3);
return;
}
privatestaticRnewImage(WordprocessingMLPackagewordMLPackage,ObjectFactoryfactory,byte[]bytes,
StringfilenameHint,Stringa