应客户需求,需要将excel导入的数据按照查找内容把doc文档中的文字替换成需要替换的文字,以下为主要代码。(注:有时候doc文档中的某些词组获取到的时候是单个文字或者整个词组分开的,这样会使某些内容不能替换成功,可以将此词组复制到text文件中,然后再复制进doc文档中,猜测可能出现这个原因是doc文档的底层代码里,这个词组分裂了,待验证。)
public class ModuleReplace {
private static PrintXWPFDocument doc = null;
private static Log log = LogFactory.getLog(ModuleReplace.class);
public static PrintXWPFDocument replaceContent(InputStream inputStream, List<BloodModuleDetail> list) throws IOException{
//获取doc文件中的所有的内容
getXWPFdoc(inputStream);
// getParagraphs(inputStream,list);
replaceInPara(list);
loadTableBookMark(doc.getTables(),list);
// replaceInTable(list);
return doc;
}
private static PrintXWPFDocument getParagraphs(InputStream inputStream, List<BloodModuleDetail> list) throws IOException {
if (doc != null) {
if (doc.getParagraphs() != null) {
for (XWPFParagraph paragraph : doc.getParagraphs()) {
if(paragraph!=null && paragraph.getText() !=null) {
System.out.println(paragraph.getText());
int num = 0;
String paraText = paragraph.getText();
for (BloodModuleDetail detail : list) {
if(paraText.contains(detail.getFindContent())&&!StringUtil.isNullStr(detail.getReplaceContent())) {
System.out.println(detail.getFindContent()+"#########"+detail.getReplaceContent());
num++;
paraText = paraText.replaceAll(detail.getFindContent(), detail.getReplaceContent());
}
}
if(num > 0) {
List<XWPFRun> runs = paragraph.getRuns();
XWPFRun run1 = paragraph.createRun();
run1.setText(paraText);
for (int i = 0; i < runs.size(); i++) {
paragraph.removeRun(i);
}
System.out.println(paraText+"===========");
paragraph.addRun(run1);
}
}
}
}
loadTableBookMark(doc.getTables(),list);
}
return doc;
}
private static void loadTableBookMark(List<XWPFTable> tables,List<BloodModuleDetail> list) {
if (tables == null) {
return;
}
// 遍历表格
for (XWPFTable table : tables) {
List<XWPFTableRow> rows = table.getRows();
if (rows == null) {
continue;
}
// 遍历行
for (XWPFTableRow row : rows) {
List<XWPFTableCell> cells = row.getTableCells();
if (cells == null) {
continue;
}
// 遍历单元格
for (XWPFTableCell cell : cells) {
// 递归遍历单元格中的表格
List<XWPFTable> cellTables = cell.getTables();
if (cellTables != null && cellTables.size() > 0) {
loadTableBookMark(cellTables,list);
}
List<XWPFParagraph> cellParagraphs = cell.getParagraphs();
if (cellParagraphs == null) {
continue;
}
for (XWPFParagraph paragraph : cellParagraphs) {
if(paragraph!=null && paragraph.getText() !=null) {
System.out.println(paragraph.getText());
int num = 0;
String paraText = paragraph.getText();
for (BloodModuleDetail detail : list) {
if(paraText.contains(detail.getFindContent())&&!StringUtil.isNullStr(detail.getReplaceContent())) {
System.out.println(detail.getFindContent()+"#########"+detail.getReplaceContent());
num++;
paraText = paraText.replaceAll(detail.getFindContent(), detail.getReplaceContent());
}
}
if(num > 0) {
System.out.println(paraText);
List<XWPFRun> runs = paragraph.getRuns();
for (int i = 0; i < runs.size(); i++) {
paragraph.removeRun(i);
}
XWPFRun run1 = paragraph.createRun();
run1.setText(paraText);
paragraph.addRun(run1);
}
}
}
}
}
}
}
private static void getXWPFdoc(InputStream inputStream) {
try {
doc = new PrintXWPFDocument(inputStream);
inputStream.close();
} catch (Exception e) {
log.info(e);
}
}
/**
* 替换段落里面的变量
* @param doc 要替换的文档
* @param params 参数
*/
private static void replaceInPara(List<BloodModuleDetail> list) {
for (XWPFParagraph paragraph : doc.getParagraphs()) {
replaceInPara(paragraph, list);
}
}
/**
* 替换段落里面的变量
* @param para 要替换的段落
* @param params 参数
*/
private static void replaceInPara(XWPFParagraph para, List<BloodModuleDetail> list){
List<XWPFRun> runs;
runs = para.getRuns();
for (int i=0; i<runs.size(); i++) {
XWPFRun run = runs.get(i);
String runText = run.toString();
System.out.println(runText+"===");
for (BloodModuleDetail detail : list) {
if(runText.contains(detail.getFindContent())&&!StringUtil.isNullStr(detail.getReplaceContent())) {
System.out.println(runText+"==="+detail.getFindContent()+"---"+detail.getReplaceContent());
runText = runText.replace(detail.getFindContent(), detail.getReplaceContent());
para.removeRun(i);
XWPFRun newRun = para.insertNewRun(i);
newRun.setText(runText);
newRun.setUnderline(UnderlinePatterns.SINGLE);
run.removeCarriageReturn();
}
}
}
}
private static void replaceInPara1(XWPFParagraph para, List<BloodModuleDetail> list){
List<XWPFRun> runs = para.getRuns();
for (int i=0; i<runs.size(); i++) {
XWPFRun run = runs.get(i);
String runText = run.getText(0);
for (BloodModuleDetail detail : list) {
if(runText.contains(detail.getFindContent())&&!StringUtil.isNullStr(detail.getReplaceContent())) {
System.out.println(runText+"==="+detail.getFindContent()+"---"+detail.getReplaceContent());
runText = runText.replace(detail.getFindContent(), detail.getReplaceContent());
para.removeRun(i);
para.insertNewRun(i).setText(runText);
}
}
}
}
/**
* 替换表格里面的变量
* @param doc 要替换的文档
* @param params 参数
*/
private static void replaceInTable(List<BloodModuleDetail> list) {
Iterator<XWPFTable> iterator = doc.getTablesIterator();
XWPFTable table;
List<XWPFTableRow> rows;
List<XWPFTableCell> cells;
List<XWPFParagraph> paras;
while (iterator.hasNext()) {
table = iterator.next();
rows = table.getRows();
for (XWPFTableRow row : rows) {
cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
paras = cell.getParagraphs();
for (XWPFParagraph para : paras) {
replaceInPara1(para, list);
}
}
}
}
}
}