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;


}
}


原创粉丝点击