java word 模板 数据填充

MatchData.java

public class MatchData {

private int start;

private int end;

private String match;

private String key;

public int getStart() {

return start;

}


public void setStart(int start) {

this.start = start;

}


public int getEnd() {

return end;

}


public void setEnd(int end) {

this.end = end;

}


public String getMatch() {

return match;

}


public void setMatch(String match) {

this.match = match;

}


public String getKey() {

return key;

}


public void setKey(String key) {

this.key = key;

}


public MatchData(int start,int end,String match,String key){

this.start = start;

this.end = end;

this.match = match;

this.key = key;

}

}


RunData.java

import org.apache.poi.xwpf.usermodel.XWPFRun;


public class RunData {

private XWPFRun run;

private int start;

private int end;

private String text;

public RunData(XWPFRun run,int start,int end){

this.run = run;

this.start = start;

this.end = end;

this.text = run.getText(0);

}

public XWPFRun getRun() {

return run;

}

public void setRun(XWPFRun run) {

this.run = run;

}

public int getStart() {

return start;

}

public void setStart(int start) {

this.start = start;

}

public int getEnd() {

return end;

}

public void setEnd(int end) {

this.end = end;

}

public String getText() {

return text;

}

public void setText(String text) {

this.text = text;

}

}



POIUtils.java

import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


import javax.servlet.http.HttpServletResponse;


import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;


public class POIUtils {
static String regex = "\\$\\{(.*?)\\}";


public static XWPFDocument XWPFDocument(InputStream in, Map<String, Object> data) {
/*
* Map map = new HashMap(); map = getChildTables(sourceFile, childName);
*/
XWPFDocument document;
try {
document = new XWPFDocument(in);
replaceText(document, data);
replaceTables(document, data);
in.close();
return document;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


return null;


// document.write(out);
// out.close();
}


private static void replaceText(XWPFDocument document, Map<String, Object> data) {
Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();
while (itPara.hasNext()) {
XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
String paragraphString = paragraph.getText();
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(paragraphString);
int startPosition = 0;
List<MatchData> matchDataList = new ArrayList<>();
while (matcher.find(startPosition)) {
int start = matcher.start();
startPosition = matcher.end();
matchDataList.add(new MatchData(start, startPosition, matcher.group(), matcher.group(1)));
}
replaceParagraph(paragraph, data, matchDataList);
}
}


private static void replaceParagraph(XWPFParagraph paragraph, Map<String, Object> data,
List<MatchData> matchDataList) {
String paragraphText = paragraph.getText();
paragraphText = paragraphText.replaceAll("\t", "");
List<XWPFRun> runs = paragraph.getRuns();
List<RunData> runDatas = new ArrayList<>();
int postion = 0;
for (int i = 0; i < runs.size(); i++) {
XWPFRun run = runs.get(i);
String oneparaString = run.getText(0);
if (oneparaString != null) {
int textStart = postion;
int textEnd = postion + oneparaString.length();
postion = textEnd;
runDatas.add(new RunData(run, textStart, textEnd));
}
}


for (int i = matchDataList.size() - 1; i >= 0; i--) {
MatchData match = matchDataList.get(i);
Object object = data.get(match.getKey());
String value = "    ";
if (object != null) {
value = object.toString();
}
for (int j = runDatas.size() - 1; j >= 0; j--) {
RunData runData = runDatas.get(j);
if (runData.getStart() >= match.getEnd()) {// run的起点在match终点后面那么没有配上
                           // 不做操作


// run的起点在中间那么适配了一部分
} else if (runData.getStart() < match.getEnd() && runData.getStart() > match.getStart()) {
// 如果run的终点也小于match的终点 那么整个run都是匹配的一部分。直接抛弃
if (runData.getEnd() <= match.getEnd()) {
System.out.println("匹配一部分直接抛弃" + runData.getText() + " - > ");
runData.getRun().setText("", 0);


// 如果run的终点是大于match的终点的话那么前半部分是废弃的。
} else {
String runStr = runData.getRun().getText(0);
System.out.println("前半部分是废弃的" + runStr + " - > ");
runStr = runStr.substring(match.getEnd() - runData.getStart());
// System.out.println(runStr);
runData.getRun().setText(runStr, 0);
}
// run的起点小于match起点
} else {
String runStr = runData.getRun().getText(0);


// 完整的匹配
if (runData.getEnd() >= match.getEnd()) {
System.out.println("完整的匹配" + runStr + " - > ");
runStr = runStr.substring(0, match.getStart() - runData.getStart()) + value
+ runStr.substring(match.getEnd() - runData.getStart());
runData.getRun().setText(runStr, 0);
// System.out.println(runStr);
// run的后部分匹配
} else if (runData.getEnd() > match.getStart()) {
System.out.println("后部分匹" + runStr + " - > ");
runStr = runStr.substring(0, match.getStart() - runData.getStart()) + value;
runData.getRun().setText(runStr, 0);
// System.out.println(runStr);
// 没有匹配
} else {


}
}
}
}
}


private static void replaceTables(XWPFDocument document, Map<String, Object> data) {
List<XWPFTable> tables = document.getTables();
for (int i = 0; i < tables.size(); i++) {
XWPFTable table = tables.get(i);
replaceTable(table, data);
}
}


@SuppressWarnings("unchecked")
private static void replaceTable(XWPFTable table, Map<String, Object> data) {
List<XWPFTableRow> listRows = table.getRows();
int rowNum = 0;
for (; rowNum < listRows.size(); rowNum++) {
XWPFTableRow row = listRows.get(rowNum);
List<XWPFTableCell> listCells = row.getTableCells();


Integer columnSize = listCells.size();
if (columnSize <= 0) {
continue;
}


replaceTableAtRow(table, data, rowNum);
}
}


private static void replaceTableAtRow(XWPFTable table, Map<String, Object> data, int beginRowNum) {
XWPFTableRow row = table.getRow(beginRowNum);
Pattern pattern = Pattern.compile(regex);
for (XWPFTableCell cell : row.getTableCells()) {
List<XWPFParagraph> paras = cell.getParagraphs();


for (int n = 0; n < paras.size(); n++) {
XWPFParagraph paragraph = (XWPFParagraph) paras.get(n);
String paragraphString = paragraph.getText();
Matcher matcher = pattern.matcher(paragraphString);
int startPosition = 0;
List<MatchData> matchDataList = new ArrayList<>();
while (matcher.find(startPosition)) {
int start = matcher.start();
startPosition = matcher.end();
matchDataList.add(new MatchData(start, startPosition, matcher.group(), matcher.group(1)));
}


replaceParagraph(paragraph, data, matchDataList);
}
}
}


//下载生成的文件
public static void getExportedFile(XWPFDocument document, String name, HttpServletResponse response)
throws Exception {
BufferedOutputStream fos = null;
try {
String fileName = name + ".docx";
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition",
"attachment;filename=" + new String(fileName.getBytes("gb2312"), "ISO8859-1"));
fos = new BufferedOutputStream(response.getOutputStream());
document.write(fos);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
fos.close();
}
}
}


// 读取网络文件
public static InputStream getInputStream(String urlStr) {
InputStream inputStream = null;
HttpURLConnection httpURLConnection = null;

try {
URL url = new URL(urlStr);
httpURLConnection = (HttpURLConnection) url.openConnection();
// 设置网络连接超时时间
httpURLConnection.setConnectTimeout(3000);
// 设置应用程序要从网络连接读取数据
httpURLConnection.setDoInput(true);

httpURLConnection.setRequestMethod("GET");
int responseCode = httpURLConnection.getResponseCode();
if (responseCode == 200) {
// 从服务器返回一个输入流
inputStream = httpURLConnection.getInputStream();


}


} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


return inputStream;


}
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,可以使用 Apache POI 库来操作 Word 文档。要实现动态填充数据,可以使用 Word 模板和占位符。具体步骤如下: 1. 创建 Word 模板,并在需要填充数据的位置添加占位符,例如 ${name}。 2. 使用 Apache POI 打开模板文件,并读取文件中的内容。 3. 将读取到的内容转换为一个 XWPFDocument 对象。 4. 使用 XWPFDocument 对象中的方法,查找并替换所有的占位符,例如使用 replaceAll 方法将 ${name} 替换为具体的数据。 5. 保存修改后的 Word 文档。 下面是一个示例代码,演示如何实现动态填充数据: ``` import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; public class WordFiller { public static void main(String[] args) throws IOException { // 读取 Word 模板 FileInputStream fis = new FileInputStream("template.docx"); XWPFDocument doc = new XWPFDocument(fis); // 填充数据 Map<String, String> data = new HashMap<>(); data.put("name", "张三"); data.put("age", "20"); for (XWPFParagraph p : doc.getParagraphs()) { String text = p.getText(); for (String key : data.keySet()) { if (text.contains("${" + key + "}")) { text = text.replace("${" + key + "}", data.get(key)); } } p.setText(text); } // 保存 Word 文档 FileOutputStream fos = new FileOutputStream("output.docx"); doc.write(fos); fos.close(); doc.close(); } } ``` 在代码中,我们首先读取了一个名为 template.docx 的 Word 模板文件。然后,我们定义了一个存储数据的 Map 对象,并将需要填充数据存储在其中。接下来,我们遍历文档中的所有段落,查找并替换所有的占位符。最后,我们将修改后的文档保存到一个名为 output.docx 的文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值