java word 模板 数据填充
来源:互联网 发布:多线程编程 实例 c语言 编辑:程序博客网 时间:2024/06/01 09:39
MatchData.java
public class MatchData {
private int start;
private int end;
private String match;
private String key;
public int getStart() {
returnstart;
}
public void setStart(intstart) {
this.start =start;
}
public int getEnd() {
returnend;
}
public void setEnd(intend) {
this.end =end;
}
public String getMatch() {
returnmatch;
}
public void setMatch(Stringmatch) {
this.match =match;
}
public String getKey() {
returnkey;
}
public void setKey(Stringkey) {
this.key =key;
}
public MatchData(intstart,int end,Stringmatch,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,intend){
this.run =run;
this.start =start;
this.end =end;
this.text =run.getText(0);
}
public XWPFRun getRun() {
returnrun;
}
public void setRun(XWPFRunrun) {
this.run =run;
}
public int getStart() {
returnstart;
}
public void setStart(intstart) {
this.start =start;
}
public int getEnd() {
returnend;
}
public void setEnd(intend) {
this.end =end;
}
public String getText() {
returntext;
}
public void setText(Stringtext) {
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;
}
}
- java word 模板 数据填充
- 填充数据到word模板中
- MVC5中根据word模板填充数据生成word
- java 编码填充 word 模板生成 word合同,并将word合同转成pdf 文档
- 把Excel数据填充word模板生成多份word文档
- java控制自动填充数据到world模板
- java 填充word中的表格
- java 填充word中的表格
- 使用XML模板填充数据
- aspose.word根据word模板填充对应信息并导出
- 用程序把word模板中的一个表格复制为多个表格然后填充数据(工资单的例子)
- Java中根据模板导出数据到word的解决方案
- JAVA 数据导出Word文档模板的功能实现
- java导出word模板
- java操作word模板
- java导出word模板
- Java 生成word模板
- vb向excel模板中填充数据
- Tomcat启动
- Intellij idea创建javaWeb
- JSP与JavaBean相关的动作标签
- AtomicInteger类的理解与使用
- 值类型和引用类型
- java word 模板 数据填充
- Android中去掉标题栏(项目名称那栏)正确方法!
- UVa11572 Unique Snowflakes (贪心+尺取法+set容器)
- eclipse出现There are no resources that can be added or removed from the server
- 2017/06/21 星榕基笔试题
- 网口信号灯的作用
- Spark SQL Hive Tables
- CentOS openJdk1.7升级1.8
- 字符集ANSI、UNICODE和VCEmpress局限