POI批量替換world文件XWPFParagraph.getRuns 出現分段混亂(附原始碼)
問題:在操作POI
替換world
時發現getRuns
將我們預設的${product}
自動切換成了
${product, }]
${product }
成了兩個部分
解決方法一。(未嘗試)
強制把List
中的內容合併成一個字串,替換內容後,把段落中的XWPFRun
全部remove
掉,然後新建一個含有替換後內容的XPWFRun
,並賦給當前段落。
解決方法二.
請用複製貼上把你的${product}
新增進world文件裡面即可解決,不要手打 目前發現複製貼上是沒有問題的,感覺像是poi
的一個bug
不知道立貼為證。
注意:${這裡儘量不要存中文,否在還出現上面情況}
下面上程式碼:
public class WorldUtil {
public static String doc2String2() {
try {
WorldUtil wd = new WorldUtil();
Map<String, Object> params = new HashMap<String, Object>();
params.put("reportDate", "2014-02-28");
/* params.put("appleAmt", "100.00");
params.put("bananaAmt", "200.00");
params.put("totalAmt", "300.00");*/
String filePath = "d:\\1.docx";
InputStream is = new FileInputStream(filePath);
XWPFDocument doc = new XWPFDocument(is);
//替換段落裡面的變數
wd.replaceInPara(doc, params);
//替換表格裡面的變數
wd.replaceInTable(doc, params);
OutputStream os = new FileOutputStream("d:\\sample.docx");
doc.write(os);
wd.close(os);
wd.close(is);
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
/**
* 讀取doc檔案內容
* @param file 想要讀取的檔案物件
* @return 返回檔案內容
*/
public static String doc2String(){
try {
FileInputStream stream = new FileInputStream("d://1.docx");
XWPFDocument doc = new XWPFDocument(stream);// 建立Word檔案
for(XWPFParagraph p : doc.getParagraphs())//遍歷段落
{
System.out.println(p.getParagraphText());
}
for(XWPFTable table : doc.getTables())//遍歷表格
{
for(XWPFTableRow row : table.getRows())
{
for(XWPFTableCell cell : row.getTableCells())
{
System.out.println(cell.getText());
}
}
}
FileOutputStream out = new FileOutputStream("d://sample.docx");
doc.write(out);
out.close();
stream.close();
} catch (Exception e) {
// TODO: handle exception
}
return null;
}
/**
* 替換段落裡面的變數
* @param doc 要替換的文件
* @param params 引數
*/
private void replaceInPara(XWPFDocument doc, Map<String, Object> params) {
Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
XWPFParagraph para;
while (iterator.hasNext()) {
para = iterator.next();
this.replaceInPara(para, params);
}
}
/**
* 替換段落裡面的變數
* @param para 要替換的段落
* @param params 引數
*/
private void replaceInPara(XWPFParagraph para, Map<String, Object> params) {
List<XWPFRun> runs;
Matcher matcher;
if (matcher(para.getParagraphText()).find()) {
runs = para.getRuns();
for (int i=0; i<runs.size(); i++) {
XWPFRun run = runs.get(i);
String runText = run.toString();
matcher = matcher(runText);
System.out.println(runText);
if (matcher.find()) {
System.out.println("進1");
while ((matcher = this.matcher(runText)).find()) {
runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));
}
//直接呼叫XWPFRun的setText()方法設定文字時,在底層會重新建立一個XWPFRun,把文字附加在當前文字後面,
//所以我們不能直接設值,需要先刪除當前run,然後再自己手動插入一個新的run。
para.removeRun(i);
para.insertNewRun(i).setText(runText);
}
}
}
}
/**
* 替換表格裡面的變數
* @param doc 要替換的文件
* @param params 引數
*/
private void replaceInTable(XWPFDocument doc, Map<String, Object> params) {
Iterator<XWPFTable> iterator = doc.getTablesIterator();
XWPFTable table;
List<XWPFTableRow> rows;
List<XWPFTableCell> cells;
List<XWPFParagraph> paras;
while (iterator.hasNext()) {
table = iterator.next();
rows = table.getRows();
for (XWPFTableRow row : rows) {
cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
paras = cell.getParagraphs();
for (XWPFParagraph para : paras) {
this.replaceInPara(para, params);
}
}
}
}
}
/**
* 正則匹配字串
* @param str
* @return
*/
private Matcher matcher(String str) {
Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
return matcher;
}
/**
* 關閉輸入流
* @param is
*/
private void close(InputStream is) {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 關閉輸出流
* @param os
*/
private void close(OutputStream os) {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//doc2String();
doc2String2();
}
}
相關文章
- Lumen 替換 world 裡面變數並匯出 PDF 圖片變數
- linux中批量替換文字中字串Linux字串
- php怎麼替換文件中手機號碼PHP
- 混亂C原始碼的幾個錯誤,你犯了嗎?原始碼
- 替換NULL值幫助文件Null
- pandas列值根據字典批量替換
- grep、sed批量替換檔案內容shell
- Docxtor(iWork 文件批量轉換工具)
- C#解析Markdown文件,實現替換圖片連結操作C#
- 上傳Text文件並轉換為PDF(解決亂碼)
- 解決Java POI 匯出Excel時檔名中文亂碼,相容瀏覽器JavaExcel瀏覽器
- Jmeter執行後出現亂碼JMeter
- requests介面響應出現亂碼
- 偽元素 content 出現中文亂碼
- 用python批量替換MD檔案中的圖片地址Python
- 批次word文件內容查詢替換的方法
- poi 匯出Excel java程式碼ExcelJava
- 國際C語言混亂程式碼大賽C語言
- 匯入sql檔案出現亂碼SQL
- 網站程式碼修改替換流程圖,輕鬆掌握程式碼修改替換流程網站流程圖
- app直播原始碼,JS 替換日期的橫槓為斜槓APP原始碼JS
- 不停機替換線上原始碼,教你一招So Easy原始碼
- 如何在word中進行查詢與替換 word文件中的替換與查詢功能
- poi批量修改Excel文件,修改工作表中的目標單元格資料Excel
- Spring Boot + JPA實現MySQL批量更新原始碼 - githubSpring BootMySql原始碼Github
- 記錄一次亂碼問題修復經歷!排查修復Poi-tl使用HttpServletResponse匯出Word亂碼問題HTTPServlet
- mac下如何使用Sed批量替換資料夾下的字串Mac字串
- Java實現第一個程式碼,輸出 hello worldJava
- Apache POI處理Excel文件ApacheExcel
- 使用Selenium+POI實現Excel自動化批量查單詞Excel
- 出來混總是要還的-JS正則常用的有四種操作: 驗證、切分、提取、替換JS
- HTML 替換元素與非替換元素HTML
- 破譯替換密碼的方法密碼
- 星露穀物語角色替換Mod-設計文件
- Jmeter 切換中文亂碼,求解JMeter
- POI匯入Excel中文API文件ExcelAPI
- POI操作Excel文件-中級篇Excel
- Promise實現原理(附原始碼)Promise原始碼