找了好久好久的方法,结果无意间发现了,感激上苍啊
只能合并DOCX噢,不能合并DOC,强制修改文件名后缀也是不可以的哟,所以又花了好久找上一篇文章的方法。
废话不多说,上代码,很简洁,用DOC4J。
用到的jar包有docx4j-3.3.1.jar和commons-io-2.2.jar
public static void main(String[] args) {
try {
List<InputStream> streams = new ArrayList<InputStream>();
streams.add(new FileInputStream("D://4.docx"));
streams.add(new FileInputStream("D://5.docx"));
InputStream stream = mergeDocx(streams);
saveFile(IOUtils.toByteArray(stream), "D://6.docx");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void saveFile(byte[] bfile, String filePath) {
BufferedOutputStream bos = null;
FileOutputStream fos = null;
File file = null;
try {
file = new File(filePath);
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(bfile);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
public static InputStream mergeDocx(final List<InputStream> streams)
throws Docx4JException, IOException {
WordprocessingMLPackage target = null;
final File generated = File.createTempFile("generated", ".docx");
int chunkId = 0;
Iterator<InputStream> it = streams.iterator();
while (it.hasNext()) {
InputStream is = it.next();
if (is != null) {
if (target == null) {
// Copy first (master) document
OutputStream os = new FileOutputStream(generated);
os.write(IOUtils.toByteArray(is));
os.close();
target = WordprocessingMLPackage.load(generated);
} else {
// Attach the others (Alternative input parts)
insertDocx(target.getMainDocumentPart(),
IOUtils.toByteArray(is), chunkId++);
}
}
}
if (target != null) {
target.save(generated);
return new FileInputStream(generated);
} else {
return null;
}
}