docx4j操作word.docx

上传人:b****5 文档编号:8787507 上传时间:2023-05-15 格式:DOCX 页数:14 大小:21.58KB
下载 相关 举报
docx4j操作word.docx_第1页
第1页 / 共14页
docx4j操作word.docx_第2页
第2页 / 共14页
docx4j操作word.docx_第3页
第3页 / 共14页
docx4j操作word.docx_第4页
第4页 / 共14页
docx4j操作word.docx_第5页
第5页 / 共14页
docx4j操作word.docx_第6页
第6页 / 共14页
docx4j操作word.docx_第7页
第7页 / 共14页
docx4j操作word.docx_第8页
第8页 / 共14页
docx4j操作word.docx_第9页
第9页 / 共14页
docx4j操作word.docx_第10页
第10页 / 共14页
docx4j操作word.docx_第11页
第11页 / 共14页
docx4j操作word.docx_第12页
第12页 / 共14页
docx4j操作word.docx_第13页
第13页 / 共14页
docx4j操作word.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

docx4j操作word.docx

《docx4j操作word.docx》由会员分享,可在线阅读,更多相关《docx4j操作word.docx(14页珍藏版)》请在冰点文库上搜索。

docx4j操作word.docx

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{

Listparagraphs=wordMLPackage.getMainDocumentPart().getContent();

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{

ListtheList=null;

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();

Listparagraphs=wordMLPackage.getMainDocumentPart().getContent();

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;

Listobjects;

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;i

try{

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;j

ListctNumVals=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;i

ctStrVals.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

展开阅读全文
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2