xwpfdocument 保存修改_POI XWPFDocument 来实现这个功能

1.经过一段时间的操作,大概是能修改市面上常见的财务报表了,这般这种报表有两部分组成,段落、表格,XWPFDocument API 上也是能获取这两个部分,把代码直接贴上来把!下次写篇文章 针对 POI 处理 word 文档的专题。

private void replaceInWord(Map replacements, XWPFDocument doc, File outfile) throws IOException {

long count1 = 0;

long count2 = 0;

List paragraphs = doc.getParagraphs();

List tables = doc.getTables();

count1 = replaceInParagraphs(replacements, paragraphs, false);

count2 = replaceInTables(replacements, tables);

doc.write(new FileOutputStream(outfile));

System.out.println("段落替换数量累计:" + count1);

System.out.println("表格替换数量累计:" + count2);

}

/**

* 1.替换段落中的文本

*

* @param replacements

* @param count

* @param paragraphs

* @return

*/

private long replaceInParagraphs(Map replacements, List paragraphs, boolean flag) {

long count = 0;

String pString = flag ? "表格" + "段落清晰:" : "段落:";

for (XWPFParagraph paragraph : paragraphs) {

System.out.println(pString + paragraph.getText());

List runs = paragraph.getRuns();

for (Map.Entry replPair : replacements.entrySet()) {

String oldText = replPair.getKey();

String newText = replPair.getValue();

// 获取文本段

TextSegement tSegement = paragraph.searchText(oldText, new PositionInParagraph());

if (tSegement != null) {

int beginRun = tSegement.getBeginRun();

int endRun = tSegement.getEndRun();

System.out.println(beginRun + " " + endRun);

count++;

if (beginRun == endRun) {

// whole search string is in one Run

XWPFRun run = runs.get(beginRun);

String runText = run.getText(0);

System.out.println("runText:" + runText);

String replaced = runText.replace(oldText, newText);

run.setText(replaced, 0);

} else {

// The search string spans over more than one Run

// Put the Strings together

StringBuilder b = new StringBuilder();

for (int runPos = beginRun; runPos <= endRun; runPos++) {

XWPFRun run = runs.get(runPos);

b.append(run.getText(0));

}

String connectedRuns = b.toString();

String replaced = connectedRuns.replace(oldText, newText);

// The first Run receives the replaced String of all

// connected Runs

XWPFRun partOne = runs.get(beginRun);

partOne.setText(replaced, 0);

// Removing the text in the other Runs.

for (int runPos = beginRun + 1; runPos <= endRun; runPos++) {

XWPFRun partNext = runs.get(runPos);

partNext.setText("", 0);

}

}

}

}

}

return count;

}

/**

* 1.替换表格中的文本

*

* @param replacements

* @param count

* @param paragraphs

* @return

*/

private long replaceInTables(Map replacements, List tables) {

long count = 0;

for (XWPFTable table : tables) {

for (XWPFTableRow row : table.getRows()) {

for (XWPFTableCell cell : row.getTableCells()) {

List paragraphs = cell.getParagraphs();

count += replaceInParagraphs(replacements, paragraphs, true);

}

}

}

return count;

}

测试效果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值