版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010295735/article/details/79448259
网上可以找到很多POI替换Word中指定文字的代码,然而基本上都没有对文档中的表格中包含的段落(回车)进行处理。自己写了,代码记录如下:
/**
*
*@templetStream 文档的输入流
*@data 要替换的key,value的map,将文档中的@key@替换为value值
*
**/
public byte[] genWord2003ByTemplet(InputStream templetStream,Map<String, String> data) throws IOException {
XWPFDocument doc = new XWPFDocument(templetStream);
// 替换段落中的指定文字
Iterator<XWPFParagraph> itPara = doc.getParagraphsIterator();
while (itPara.hasNext()) {
XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
List<XWPFRun> runs = paragraph.getRuns();
String beforeOneparaString="";
for (int i=0; runs!=null&&i<runs.size(); i++) {
String oneparaString = runs.get(i).getText(
runs.get(i).getTextPosition());
for (Map.Entry<String, String> entry : data
.entrySet()) {
if(oneparaString != null){
if(oneparaString.contains(String.format("@%s@", entry.getKey()))){
oneparaString = oneparaString.replace(String.format("@%s@", entry.getKey()),
Strings.nullToEmpty(entry.getValue()));
}else if(oneparaString.contains(entry.getKey()) && beforeOneparaString.endsWith("@")){
oneparaString = oneparaString.replace(entry.getKey(), Strings.nullToEmpty(entry.getValue()));
runs.get(i-1).setText(beforeOneparaString.substring(0,beforeOneparaString.length()-1), 0);
if(i+1<runs.size()){
String afterOneparaString=runs.get(i+1).getText(runs.get(i+1).getTextPosition());
runs.get(i+1).setText(afterOneparaString.substring(0,beforeOneparaString.length()-1), 0);
}
}
}
}
runs.get(i).setText(oneparaString, 0);
beforeOneparaString=oneparaString;
}
}
// 替换表格中的指定文字
Iterator<XWPFTable> itTable = doc.getTablesIterator();
while (itTable.hasNext()) {
XWPFTable table = (XWPFTable) itTable.next();
int rcount = table.getNumberOfRows();
for (int i = 0; i < rcount; i++) {
XWPFTableRow row = table.getRow(i);
List<XWPFTableCell> cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
//表格中处理段落(回车)
List<XWPFParagraph> cellParList= cell.getParagraphs();
for(int p=0; cellParList!=null&&p<cellParList.size();p++){ //每个格子循环
List<XWPFRun> runs = cellParList.get(p).getRuns(); //每个格子的内容都要单独处理
String beforeOneparaString="";
for (int q = 0; runs!=null&&q<runs.size(); q++) {
String oneparaString = runs.get(q).getText(runs.get(q).getTextPosition());
for (Map.Entry<String, String> entry : data.entrySet()) {
if(oneparaString!=null){
if(oneparaString.contains(String.format("@%s@", entry.getKey()))){
oneparaString = oneparaString.replace(String.format("@%s@", entry.getKey()),
Strings.nullToEmpty(entry.getValue()));
}else if(oneparaString.contains(entry.getKey()) && beforeOneparaString.endsWith("@")){
oneparaString = oneparaString.replace(entry.getKey(),
Strings.nullToEmpty(entry.getValue()));
runs.get(q-1)
.setText(beforeOneparaString.substring(0,beforeOneparaString.length()-1), 0);
if(q+1<runs.size()){
String afterOneparaString=runs
.get(q+1).getText(runs.get(q+1).getTextPosition());
runs.get(q+1)
.setText(afterOneparaString.substring(0,beforeOneparaString.length()-1), 0);
}
}
}
}
runs.get(q).setText(oneparaString, 0);
beforeOneparaString=oneparaString;
}
}
}
}
}
ByteArrayOutputStream os = new ByteArrayOutputStream();
if (doc != null) {
doc.write(os);
}
byte[] b = os.toByteArray();
Closeables.close(templetStream, true);
Closeables.close(os, true);
return b;
}