java实现将多个word⽂档合并⼤概流程是:
1、使⽤OPCPackage将每⼀个⽂档打开并且存储起来
2、将其转成字符串合并
3、再将字符串转换成对应得XWPFDocument 对象写出即可
代码如下:
/**
* 合并docx⽂件
*
* @param srcDocxs 需要合并的⽬标docx⽂件
* @param destDocx 合并后的docx输出⽂件
*/
public static void mergeDoc(List<String> srcDocxs, String destDocx){
OutputStream dest = null;
List<OPCPackage> opcpList =new ArrayList<OPCPackage>();
int length = null == srcDocxs ?0: srcDocxs.size();
/**
* 循环获取每个docx⽂件的OPCPackage对象
*/
for(int i =0; i < length; i++){
String doc = (i);
OPCPackage srcPackage = null;
try{
srcPackage = OPCPackage.open(doc);
}catch(Exception e){
e.printStackTrace();
}
if(null != srcPackage){
opcpList.add(srcPackage);
}
}
int opcpSize = opcpList.size();
//获取的OPCPackage对象⼤于0时,执⾏合并操作
if(opcpSize >0){
try{
dest =new FileOutputStream(destDocx);
XWPFDocument src1Document =new (0));
CTBody src1Body = Document().getBody();
//OPCPackage⼤于1的部分执⾏合并操作
if(opcpSize >1){
for(int i =1; i < opcpSize; i++){
OPCPackage src2Package = (i);
XWPFDocument src2Document =new XWPFDocument(src2Package);
CTBody src2Body = Document().getBody();
appendBody(src1Body, src2Body);
}
}
//将合并的⽂档写⼊⽬标⽂件中
src1Document.write(dest);
}catch(FileNotFoundException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}finally{
/
/关闭流
IOUtils.closeQuietly(dest);
}
}
}
/**
* 合并⽂档内容
*
* @param src    ⽬标⽂档
replaceall()* @param append 要合并的⽂档
* @throws Exception
*/
private static void appendBody(CTBody src, CTBody append)throws Exception {
XmlOptions optionsOuter =new XmlOptions();
optionsOuter.setSaveOuter();
String appendString = lText(optionsOuter);
//替换word中得空⾏、根据⾃⼰需求来选择需不需要
//word⽂档其实是由xml⽂件合成得,⼀下替换得是作者对应得xml⽂件中得空⾏标签
appendString = placeAll("<w:p><w:pPr><w:spacing w:line=\\\"360\\\" w:lineRule=\\\"auto\\\"/><w:jc w:val=\\\"right\\\"/><w:rPr><w:rFonts w:ascii=\\\"仿宋\\\" w:eastAsia=\\\"仿宋\\\" w:hAnsi=\\\"仿宋\\\"/><w:sz w:val=\\\"24\\\"/></w:rPr></w:pPr></w:p>","");
appendString = placeAll("<w:p><w:pPr xsi:nil=\\\"true\\\" xmlns:xsi=\\\"xsi\\\"/></w:p>","");
appendString = placeAll("<w:p><w:pPr><w:ind w:firstLineChars=\\\"200\\\" w:firstLine=\\\"600\\\"/><w:jc w:val=\\\"right\\\"/><w:rPr><w:rF onts w:ascii=\\\"仿宋\\\" w:eastAsia=\\\"仿宋\\\" w:hAnsi=\\\"仿宋\\\"/><w:sz w:val=\\\"30\\\"/><w:szCs w:val=\\\"30\\\"/></w:rPr></w:pPr></w:p>","");
appendString = placeAll("<w:spacing w:line=\\\"360\\\" w:lineRule=\\\"auto\\\"/>","");;
String srcString = lText();
srcString = placeAll("<w:p><w:pPr><w:ind w:firstLineChars=\\\"200\\\" w:firstLine=\\\"600\\\"/><w:jc w:val=\\\"right\\\"/><w:rPr><w:rFonts w:as cii=\\\"仿宋\\\" w:eastAsia=\\\"仿宋\\\" w:hAnsi=\\\"仿宋\\\"/><w:sz w:val=\\\"30\\\"/><w:szCs w:val=\\\"30\\\"/></w:rPr></w:pPr></w:p>","");
srcString = placeAll("<w:spacing w:line=\\\"360\\\" w:lineRule=\\\"auto\\\"/>","");
srcString = placeAll("<w:p><w:pPr><w:spacing w:line=\\\"360\\\" w:lineRule=\\\"auto\\\"/><w:jc w:val=\\\"right\\\"/><w:rPr><w:rFonts w:ascii=\\ \"仿宋\\\" w:eastAsia=\\\"仿宋\\\" w:hAnsi=\\\"仿宋\\\"/><w:sz w:val=\\\"24\\\"/></w:rPr></w:pPr></w:p>","");
srcString = placeAll("<w:p><w:pPr xsi:nil=\\\"true\\\" xmlns:xsi=\\\"xsi\\\"/></w:p>","");
String prefix = srcString.substring(0, srcString.indexOf(">")+1);
String mainPart = srcString.substring(srcString.indexOf(">")+1,
srcString.lastIndexOf("<"));
String sufix = srcString.substring(srcString.lastIndexOf("<"));
String addPart = appendString.substring(appendString.indexOf(">")+1,
appendString.lastIndexOf("<"));
CTBody makeBody = CTBody.Factory.parse(prefix + mainPart + addPart
+ sufix);
src.set(makeBody);
}
/
/测试代码如下:
public static void main(String[] args){
List<String> srcs =new ArrayList<>();
for(int i =0; i <=23; i++){
if(i !=1){
srcs.add("E:\\workIreport\\"+ i +".doc");
}
}
mergeDoc(srcs,"E:\\workIreport\\test.doc");
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。