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();
}
}
相關文章
- vim的批量替換
- mysql批量替換指定字串MySql字串
- VI中的批量替換
- "Hello world!" 混亂程式碼比賽第一名作品解析
- mysql型別批量替換工具MySql型別
- Lumen 替換 world 裡面變數並匯出 PDF 圖片變數
- 批量修改檔名 與 批量檔案字元替換字元
- perl命令:批量修改替換檔案
- php怎麼替換文件中手機號碼PHP
- 混亂C原始碼的幾個錯誤,你犯了嗎?原始碼
- 替換NULL值幫助文件Null
- WPS中實現文件特定字元的字型替換字元
- linux中批量替換文字中字串Linux字串
- pandas列值根據字典批量替換
- 使用變數替換批量部署GoldenGate變數Go
- FreeMarker模版引擎實現匯出world文件到本地
- grep、sed批量替換檔案內容shell
- rhel5 vi 批量替換匹配的字串字串
- Docxtor(iWork 文件批量轉換工具)
- C#解析Markdown文件,實現替換圖片連結操作C#
- SHELL程式設計實現批量Netatalk字符集檔名替換程式設計
- shell替換程式碼
- 上傳Text文件並轉換為PDF(解決亂碼)
- 文字編碼轉換工具iconv 附批量轉換檔案編碼命令
- 解決Java POI 匯出Excel時檔名中文亂碼,相容瀏覽器JavaExcel瀏覽器
- Jmeter執行後出現亂碼JMeter
- em 出現亂碼的處理
- requests介面響應出現亂碼
- Kettle資料抽取(轉換)mysql出現亂碼問題解決方法MySql
- poi 匯出Excel java程式碼ExcelJava
- 國際C語言混亂程式碼大賽C語言
- 【Spring原始碼分析】.properties檔案讀取及佔位符${...}替換原始碼解析Spring原始碼
- Word文件格式也能查詢與替換
- 批次word文件內容查詢替換的方法
- 偽元素 content 出現中文亂碼
- 匯入sql檔案出現亂碼SQL
- linux啟動時出現亂碼Linux
- 不停機替換線上原始碼,教你一招So Easy原始碼