public static String getWordFile(String templates, String filePath, String fileName, Map<String, String> params) throws IOException {
File file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
try(InputStream inputStream = WordUtil.class.getClassLoader().getResourceAsStream(templates);
OutputStream outputStream = new FileOutputStream(filePath + "/" + fileName);){
XWPFDocument document = new XWPFDocument(inputStream);
replaceInPara(document, params);
document.write(outputStream);
}catch (IOException e){
throw new IOException("io异常",e);
}
return filePath;
}
public static String getTableWordFile(String templates, String filePath, String fileName, Map<String, String> params) throws IOException {
File file = new File(filePath);
if (!file.exists()) {
file.mkdirs();
}
try( InputStream inputStream = WordUtil.class.getClassLoader().getResourceAsStream(templates);
OutputStream outputStream = new FileOutputStream(filePath + "/" + fileName);) {
XWPFDocument document = new XWPFDocument(inputStream);
replaceInTable(document, params);
document.write(outputStream);
}catch (IOException e){
throw new IOException("io异常",e);
}
return filePath;
}
private static void replaceInPara(XWPFDocument document, Map<String, String> params) {
Iterator<XWPFParagraph> iterator = document.getParagraphsIterator();
XWPFParagraph para;
while (iterator.hasNext()) {
para = iterator.next();
replaceInPara(para, params);
}
}
private static void replaceInTable(XWPFDocument document, Map<String, String> params) {
Iterator<XWPFParagraph> iteratorHr = document.getParagraphsIterator();
XWPFParagraph paraHr;
while(iteratorHr.hasNext()) {
paraHr = iteratorHr.next();
if(replaceTablePara(paraHr, params,false)){
break;
}
}
Iterator<XWPFTable> iterator = document.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) {
replaceTablePara(para, params,true);
}
}
}
}
}
private static void replaceInPara(XWPFParagraph para, Map<String, String> params) {
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 (Map.Entry<String, String> entry : params.entrySet()) {
runText = runText.replace(entry.getKey(), entry.getValue());
}
String font = run.getFontFamily();
int fontSize = run.getFontSize();
para.removeRun(i);
run = para.insertNewRun(i);
run.setFontFamily(font);
run.setFontSize(fontSize);
run.setText(runText);
}
}
/**
* 替换段落里面的变量
* @param para 要替换的段落
* @param params 参数
* @param tableIn 是否有table内
*/
private static boolean replaceTablePara(XWPFParagraph para, Map<String, String> params,boolean tableIn) {
boolean res=false;
List<XWPFRun> runs;
runs = para.getRuns();
if(tableIn) {
for (int i = 0; i < runs.size(); i++) {
XWPFRun run = runs.get(i);
String runText = run.toString().trim();
if(StringUtil.isNull(runText)){
continue;
}
System.out.println(runText);
if (StringUtil.isNotEmpty(params.get(runText))) {
runText = runText.replace(runText, params.get(runText));
String font = run.getFontFamily();
int fontSize = run.getFontSize();
para.removeRun(i);
run = para.insertNewRun(i);
run.setFontFamily(font);
run.setFontSize(fontSize);
if ("NULL".equals(runText)) {
run.setText("");
} else {
run.setText(runText);
}
}
}
}else {
for (int j = 0; j < runs.size(); j++) {
XWPFRun run = runs.get(j);
String runText = run.toString().trim();
System.out.println("处理表格外数据:"+runText);
if (StringUtil.isNotEmpty(params.get(runText))&& "currentDate_Head".equals(runText)) {
res=true;
runText = runText.replace(runText, params.get(runText));
String font = run.getFontFamily();
int fontSize = run.getFontSize();
para.removeRun(j);
run = para.insertNewRun(j);
run.setFontFamily(font);
run.setFontSize(fontSize);
if ("NULL".equals(runText)) {
run.setText("");
} else {
run.setText(runText);
}
}
}
}
return res;
}