/**
* 根据模板生成新word文档
* 判断表格是需要替换还是需要插入,判断逻辑有$为替换,表格无$为插入
* @param inputUrl 模板存放地址
* @param outputUrl 新文档存放地址
* @param textMap 需要替换的信息集合
*/
public static boolean changWord(String inputUrl, String outputUrl, Map<String, List<String>> textMap, String date) {
//模板转换默认成功
boolean changeFlag = true;
try {
//获取docx解析对象
XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(inputUrl));
//解析替换文本段落对象
changeText(document, textMap, date);
//解析替换表格对象
//changeTable(document, textMap, tableList);
//生成新的word
File file = new File(outputUrl);
FileOutputStream stream = new FileOutputStream(file);
document.write(stream);
stream.flush();
stream.close();
System.out.println("成功生成!");
} catch (IOException e) {
e.printStackTrace();
changeFlag = false;
}
return changeFlag;
}
/**
* 替换段落文本
* @param document docx解析对象
* @param textMap 需要替换的信息集合
*/
public static void changeText(XWPFDocument document, Map<String, List<String>> textMap,String date){
//获取段落集合
List<XWPFParagraph> paragraphs = document.getParagraphs();
String date1 = TimeUtil.getCurrentDateString();
TimeUtil.getDayOfMonth();
for (XWPFParagraph paragraph : paragraphs) {
//判断此段落时候需要进行替换
String text = paragraph.getText();
if(matchStr(text)){
if(text.contains("$jt$") || text.contains("$bs$") || text.contains("$dw$")){
String mapkey = text.substring(text.indexOf("$"), (text.lastIndexOf("$")+1));
createContentLine(paragraph, textMap.get(mapkey));
}else {
List<XWPFRun> runs = paragraph.getRuns();
for (XWPFRun run : runs) {
// todo 防止空指针异常 这里会出现"" 空串 则不处理 赋原值 返回
if(StrUtil.isBlank(run.getText(0))){
run.setText(run.getText(0), 0);
continue ;
}
//替换模板原来位置
// run.setText(changeValue(run.toString(), textMap),0);
String oldVal = run.toString();
//run.
if(!matchStr(oldVal)){
continue;
}
if(oldVal.indexOf("$y$")>-1){
String year = date.substring(0,4);
String newVal = oldVal.replace("$y$", String.valueOf(Integer.valueOf(year)));
run.setText(newVal,0);
}
if(oldVal.indexOf("$m$")>-1){
String month = date.substring(5,7);
String newVal = oldVal.replace("$m$", String.valueOf(Integer.valueOf(month)));
run.setText(newVal,0);
}
if(oldVal.indexOf("$d$")>-1){
String day = date.substring(8);
String newVal = oldVal.replace("$d$", String.valueOf(Integer.valueOf(day)));
run.setText(newVal,0);
}
if(oldVal.indexOf("$M$")>-1){
String month = date1.substring(5,7);
String newVal = oldVal.replace("$M$", String.valueOf(Integer.valueOf(month)));
run.setText(newVal,0);
}
if(oldVal.indexOf("$D$")>-1){
String day = date1.substring(8);
String newVal = oldVal.replace("$D$", String.valueOf(Integer.valueOf(day)));
run.setText(newVal,0);
}
if(oldVal.indexOf("$w$")>-1){
int week = TimeUtil.dateWeekday(date);
String weekVal = "";
switch (week){
case 0: weekVal = "日"; break;
case 1: weekVal = "一"; break;
case 2: weekVal = "二"; break;
case 3: weekVal = "三"; break;
case 4: weekVal = "四"; break;
case 5: weekVal = "五"; break;
case 6: weekVal = "六"; break;
}
String newVal = oldVal.replace("$w$", weekVal);
run.setText(newVal,0);
}
}
}
}
}
}
public static void createContentLine(XWPFParagraph paragraph, List<String> textList){
paragraph.removeRun(0);
for(String val : textList){
if(val.contains(":")){
// 新建 字体配置对象
//中文
int index = val.indexOf(":")+1;
if(val.length() == index){
//创建段落对象
XWPFRun run = paragraph.createRun();
run.setText(val);
setRunFont2(run);
run.addBreak();
run.addTab();
}else {
String str1 = val.substring(0, index);
String str2 = val.substring(index);
XWPFRun run1 = paragraph.createRun();
run1.setText(str1);
setRunFont2(run1);
XWPFRun run2 = paragraph.createRun();
run2.setText(str2);
setRunFont1(run2);
run2.addBreak();
run2.addTab();
}
}
}
}
/**
* 设置字体 仿宋
* @param run
*/
private static void setRunFont1(XWPFRun run){
//设置字体信息
CTRPr rpr = run.getCTR().isSetRPr() ? run.getCTR().getRPr() : run.getCTR().addNewRPr();
//设置字体
CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
fonts.setEastAsia("仿宋");
fonts.setHAnsi("Times New Roman");
fonts.setAscii("Times New Roman");
}
/**
* 设置字体 黑体
* @param run
*/
private static void setRunFont2(XWPFRun run){
//设置字体信息
CTRPr rpr = run.getCTR().isSetRPr() ? run.getCTR().getRPr() : run.getCTR().addNewRPr();
//设置字体
CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
fonts.setEastAsia("黑体");
fonts.setHAnsi("Times New Roman");
fonts.setAscii("Times New Roman");
}
/**
* //匹配【$字符串$】
* @param matchStr
* @return
*/
private static boolean matchStr(String matchStr){
String pattern = ".*\\$[A-Za-z0-9_]*\\$.*";
//String pattern = "^\\$1\\$$";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(matchStr);
return m.matches();
}
第一次接触Apache POI初体验
最新推荐文章于 2023-11-09 21:24:48 发布