packagecom.xfzx.test.POI.main;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importjava.util.Map.Entry;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importorg.apache.poi.POIXMLDocument;importorg.apache.poi.hwpf.HWPFDocument;importorg.apache.poi.hwpf.usermodel.Range;importorg.apache.poi.xwpf.usermodel.XWPFDocument;importorg.apache.poi.xwpf.usermodel.XWPFParagraph;importorg.apache.poi.xwpf.usermodel.XWPFRun;importorg.apache.poi.xwpf.usermodel.XWPFTable;importorg.apache.poi.xwpf.usermodel.XWPFTableCell;importorg.apache.poi.xwpf.usermodel.XWPFTableRow;public classWordPOI {//返回Docx中需要替换的特殊字符,没有重复项//推荐传入正则表达式参数"\$\{[^{}]+\}"
public ArrayListgetReplaceElementsInWord(String filePath,
String regex) {
String[] p= filePath.split("\.");if (p.length > 0) {//判断文件有无扩展名//比较文件扩展名
if (p[p.length - 1].equalsIgnoreCase("doc")) {
ArrayList al = new ArrayList<>();
File file= newFile(filePath);
HWPFDocument document= null;try{
InputStream is= newFileInputStream(file);
document= newHWPFDocument(is);
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
Range range=document.getRange();
String rangeText=range.text();
CharSequence cs= rangeText.subSequence(0, rangeText.length());
Pattern pattern=Pattern.compile(regex);
Matcher matcher=pattern.matcher(cs);int startPosition = 0;while(matcher.find(startPosition)) {if (!al.contains(matcher.group())) {
al.add(matcher.group());
}
startPosition=matcher.end();
}returnal;
}else if (p[p.length - 1].equalsIgnoreCase("docx")) {
ArrayList al = new ArrayList<>();
XWPFDocument document= null;try{
document= newXWPFDocument(
POIXMLDocument.openPackage(filePath));
}catch(IOException e) {
e.printStackTrace();
}//遍历段落
Iterator itPara =document
.getParagraphsIterator();while(itPara.hasNext()) {
XWPFParagraph paragraph=(XWPFParagraph) itPara.next();
String paragraphString=paragraph.getText();
CharSequence cs= paragraphString.subSequence(0,
paragraphString.length());
Pattern pattern=Pattern.compile(regex);
Matcher matcher=pattern.matcher(cs);int startPosition = 0;while(matcher.find(startPosition)) {if (!al.contains(matcher.group())) {
al.add(matcher.group());
}
startPosition=matcher.end();
}
}//遍历表
Iterator itTable =document.getTablesIterator();while(itTable.hasNext()) {
XWPFTable table=(XWPFTable) itTable.next();int rcount =table.getNumberOfRows();for (int i = 0; i < rcount; i++) {
XWPFTableRow row=table.getRow(i);
List cells =row.getTableCells();for(XWPFTableCell cell : cells) {
String cellText= "";
cellText=cell.getText();
CharSequence cs= cellText.subSequence(0,
cellText.length());
Pattern pattern=Pattern.compile(regex);
Matcher matcher=pattern.matcher(cs);int startPosition = 0;while(matcher.find(startPosition)) {if (!al.contains(matcher.group())) {
al.add(matcher.group());
}
startPosition=matcher.end();
}
}
}
}returnal;
}else{return null;
}
}else{return null;
}
}
//替换word中需要替换的特殊字符
public static booleanreplaceAndGenerateWord(String srcPath,
String destPath, Mapmap) {
String[] sp= srcPath.split("\.");
String[] dp= destPath.split("\.");if ((sp.length > 0) && (dp.length > 0)) {//判断文件有无扩展名//比较文件扩展名
if (sp[sp.length - 1].equalsIgnoreCase("docx")) {try{
XWPFDocument document= newXWPFDocument(
POIXMLDocument.openPackage(srcPath));//替换段落中的指定文字
Iterator itPara =document
.getParagraphsIterator();while(itPara.hasNext()) {
XWPFParagraph paragraph=(XWPFParagraph) itPara.next();
List runs =paragraph.getRuns();for (int i = 0; i < runs.size(); i++) {
String oneparaString=runs.get(i).getText(
runs.get(i).getTextPosition());for (Map.Entryentry : map
.entrySet()) {
oneparaString=oneparaString.replace(
entry.getKey(), entry.getValue());
}
runs.get(i).setText(oneparaString,0);
}
}//替换表格中的指定文字
Iterator itTable =document.getTablesIterator();while(itTable.hasNext()) {
XWPFTable table=(XWPFTable) itTable.next();int rcount =table.getNumberOfRows();for (int i = 0; i < rcount; i++) {
XWPFTableRow row=table.getRow(i);
List cells =row.getTableCells();for(XWPFTableCell cell : cells) {
String cellTextString=cell.getText();for (Entrye : map.entrySet()) {if(cellTextString.contains(e.getKey()))
cellTextString=cellTextString
.replace(e.getKey(),
e.getValue());
}
cell.removeParagraph(0);
cell.setText(cellTextString);
}
}
}
FileOutputStream outStream= null;
outStream= newFileOutputStream(destPath);
document.write(outStream);
outStream.close();return true;
}catch(Exception e) {
e.printStackTrace();return false;
}
}else
//doc只能生成doc,如果生成docx会出错
if ((sp[sp.length - 1].equalsIgnoreCase("doc"))&& (dp[dp.length - 1].equalsIgnoreCase("doc"))) {
HWPFDocument document= null;try{
document= new HWPFDocument(newFileInputStream(srcPath));
Range range=document.getRange();for (Map.Entryentry : map.entrySet()) {
range.replaceText(entry.getKey(), entry.getValue());
}
FileOutputStream outStream= null;
outStream= newFileOutputStream(destPath);
document.write(outStream);
outStream.close();return true;
}catch(FileNotFoundException e) {
e.printStackTrace();return false;
}catch(IOException e) {
e.printStackTrace();return false;
}
}else{return false;
}
}else{return false;
}
}public static voidmain(String[] args) {//TODO Auto-generated method stub
String filepathString = "D:/2.doc";
String destpathString= "D:/2ttt.doc";
Map map = new HashMap();
map.put("${NAME}", "王五王五啊柯乐义的辣味回答侯何问起网");
map.put("${NsAME}", "王五王五啊王力味回答侯何问起网");
map.put("${NAMaE}", "王五王五啊柯乐义侯何问起网");
map.put("${NArME}", "王五王五啊柯乐义的辣味回答东拉网");
map.put("${NwAME}", "王五王五啊王的辣味回答侯何问起网");
map.put("${NA4ME}", "王五王五啊王力侯何问起网");
map.put("${N5AME}", "王五王五辣味回答侯何问起网");
map.put("${NAadwME}", "王五力宏的辣味回答侯何问起网");
System.out.println(replaceAndGenerateWord(filepathString,
destpathString, map));
}
}



