apache poi 修改docx表格_word 模板内容的替换和生成word 表格(使用poi)
1. maven 相關(guān)依賴 和模板
org.apache.poi
poi-ooxml
3.15-beta2
org.apache.poi
ooxml-schemas
1.1
2.? 工具類中的方法
// 給生成的表格設(shè)置樣式
public static void setCellWitchAndAlign(XWPFTableCell cell,String width,STVerticalJc.Enum typeEnum,STJc.Enum align){
CTTc cttc = cell.getCTTc();
CTTcPr ctPr = cttc.addNewTcPr();
ctPr.addNewVAlign().setVal(typeEnum);
cttc.getPList().get(0).addNewPPr().addNewJc().setVal(align);
CTTblWidth ctTblWidth = (ctPr != null && ctPr.isSetTcW() && ctPr.getTcW()!=null &&ctPr.getTcW().getW()!=null) ? ctPr.getTcW(): ctPr.addNewTcW();
if(StringUtils.isNotBlank(width)){
ctTblWidth.setW(new BigInteger(width));
ctTblWidth.setType(STTblWidth.DXA);
}
}
/**
* 生成word文檔下載
*/
public static void DownloadWord(HttpServletResponse response,List list, Map map,String file){
XWPFDocument document = null;
ServletOutputStream servletOS = null;
ByteArrayOutputStream ostream = null;
//添加表格
try {
servletOS = response.getOutputStream();
ostream = new ByteArrayOutputStream();
document = new XWPFDocument(POIXMLDocument.openPackage(file));// 生成word文檔并讀取模板
/* ***********************比賽報(bào)名表基本信息******************************begin */
Iterator it = document.getTablesIterator();
//表格內(nèi)容替換添加
while(it.hasNext()){
XWPFTable table = it.next();
int rcount = table.getNumberOfRows();
for(int i =0 ;i < rcount;i++){
XWPFTableRow row = table.getRow(i);
List cells = row.getTableCells();
for (XWPFTableCell cell : cells){
for(Entry e : map.entrySet()){
if (cell.getText().equals(e.getKey())){
//刪除原來內(nèi)容
cell.removeParagraph(0);
//寫入新內(nèi)容
cell.setText((String) e.getValue());
}
}
}
}
}
//換行
XWPFParagraph paragraph2 = document.createParagraph();
XWPFRun paragraphRun2 = paragraph2.createRun();
paragraphRun2.setText("\r");
/* ***********************比賽報(bào)名表基本信息******************************end */
//添加標(biāo)題
XWPFParagraph titleParagraph2 = document.createParagraph();
//設(shè)置段落靠左
titleParagraph2.setAlignment(ParagraphAlignment.LEFT);
XWPFRun titleParagraphRun2 = titleParagraph2.createRun();
titleParagraphRun2.setText("附: 作品清單");
titleParagraphRun2.setColor("000000");
titleParagraphRun2.setFontSize(10);
//附表格
XWPFTable ComTable = document.createTable();
//列寬自動(dòng)分割
/*CTTblWidth comTableWidth = ComTable.getCTTbl().addNewTblPr().addNewTblW();
comTableWidth.setType(STTblWidth.DXA);
comTableWidth.setW(BigInteger.valueOf(9072));*/
//表格第一行
XWPFTableRow comTableRowOne = ComTable.getRow(0);
// 表格標(biāo)題內(nèi)容的填充
// 因?yàn)閐ocument.createTable() 創(chuàng)建表格后默認(rèn)是一行一列,所以第一行第一列是直接comTableRowOne.getCell(0).setText("序號(hào)"); 賦值的。
// 第一行的其他列需要?jiǎng)?chuàng)建后才能賦值 comTableRowOne.addNewTableCell().setText("作品類型");
comTableRowOne.getCell(0).setText("序號(hào)");
comTableRowOne.addNewTableCell().setText("作品類型");
comTableRowOne.addNewTableCell().setText("作品名稱");
comTableRowOne.addNewTableCell().setText("作品署名");
// 表格標(biāo)題劇中+單元格大小設(shè)置
setCellWitchAndAlign(comTableRowOne.getCell(0),"700",STVerticalJc.CENTER,STJc.CENTER);
setCellWitchAndAlign(comTableRowOne.getCell(1),"1500",STVerticalJc.CENTER,STJc.CENTER);
setCellWitchAndAlign(comTableRowOne.getCell(2),"3200",STVerticalJc.CENTER,STJc.CENTER);
setCellWitchAndAlign(comTableRowOne.getCell(3),"3200",STVerticalJc.CENTER,STJc.CENTER);
XWPFTableRow comTableRow = null;
// 生成表格內(nèi)容
// 根據(jù)上面的表格標(biāo)題 確定列數(shù),所以下面創(chuàng)建的是行數(shù)。
// comTableRow.getCell(1).setText(user.getName()); 確定第幾列 然后創(chuàng)建賦值
// 注意:我這邊是列數(shù)較少固定的,如果列數(shù)不固定可循環(huán)創(chuàng)建上面的列數(shù)
for (int i=0;i < list.size();i++) {
comTableRow = ComTable.createRow();
// 表格內(nèi)容的填充
DisUser user = list.get(i);
comTableRow.getCell(0).setText(((Integer)(i+1)).toString());
comTableRow.getCell(1).setText(user.getName());
comTableRow.getCell(2).setText(user.getCname());
comTableRow.getCell(3).setText(user.getCnreason());
// 表格內(nèi)容劇中+單元格大小設(shè)置
setCellWitchAndAlign(comTableRow.getCell(0),"700",STVerticalJc.CENTER,STJc.CENTER);
setCellWitchAndAlign(comTableRow.getCell(1),"1500",STVerticalJc.CENTER,STJc.CENTER);
setCellWitchAndAlign(comTableRow.getCell(2),"3200",STVerticalJc.CENTER,STJc.LEFT);
setCellWitchAndAlign(comTableRow.getCell(3),"3200",STVerticalJc.CENTER,STJc.LEFT);
}
//換行
XWPFParagraph paragraph3 = document.createParagraph();
XWPFRun paragraphRun3 = paragraph3.createRun();
paragraphRun3.setText("\r");
//添加標(biāo)題
XWPFParagraph titleParagraph3 = document.createParagraph();
//設(shè)置段落靠左
titleParagraph3.setAlignment(ParagraphAlignment.RIGHT);
XWPFRun titleParagraphRun3 = titleParagraph3.createRun();
titleParagraphRun3.setText("單位(蓋 章)"+"\t");
titleParagraphRun3.setColor("000000");
titleParagraphRun3.setFontSize(10);
document.createParagraph();// 換行
//添加標(biāo)題
XWPFParagraph titleParagraph4 = document.createParagraph();
//設(shè)置段落靠左
titleParagraph4.setAlignment(ParagraphAlignment.RIGHT);
XWPFRun titleParagraphRun4 = titleParagraph4.createRun();
titleParagraphRun4.setText("年 月 日");
titleParagraphRun4.setColor("000000");
titleParagraphRun4.setFontSize(10);
//輸出word內(nèi)容文件流,提供下載
response.setContentType("application/x-msdownload");
String name = java.net.URLEncoder.encode("生成word.docx", "UTF8");
name = new String((name).getBytes("UTF-8"), "ISO-8859-1");
response.addHeader("Content-Disposition", "attachment; filename*=utf-8'zh_cn'"+name);
document.write(ostream);
servletOS.write(ostream.toByteArray());
} catch (Exception e1) {
e1.printStackTrace();
}finally{
try{
if(ostream != null){
ostream.close();
}
if(servletOS != null){
servletOS.close();
}
}
catch(IOException e){
e.printStackTrace();
}
}
}
*? 其中的list 是生成表格填充的內(nèi)容,map是模板word表格內(nèi)容替換的集合,file是模板word表格的地址
3.? controller 控制臺(tái)的部分
/**
* 功能描述:動(dòng)態(tài)替換docx 表格內(nèi)容 并下載
* @param id
* @return
* @Date 2019年3月8日
*/
@RequestMapping(value = "/shengWord", produces = "application/json;charset=UTF-8")
@ResponseBody
public void shengWord(HttpServletRequest request, HttpServletResponse response){
String file = "D:\\報(bào)名表模板.docx";// 文件路徑
Map map = new HashMap();// 動(dòng)態(tài)上傳數(shù)據(jù)
map.put("$(“name”)", "張三");
map.put("$(“sex”)", "男");
map.put("$(“age”)", "24歲");
map.put("$(“addess”)", "北京瑞德凱勒科技有限公司");
map.put("$(“type”)", "內(nèi)蒙古醫(yī)科大學(xué)附屬醫(yī)院");
map.put("$(“zhi”)", "教師");
map.put("$(“xing”)", "人事管理員");
map.put("$(“dizhi”)", "北京市朝陽區(qū)潘家園弘善家園415號(hào)樓北京人衛(wèi)設(shè)電子音像出版社");
map.put("$(“phone”)", "0471-060605");
map.put("$(“telephone”)", "12345678909");
map.put("$(“email”)", "355365476@qq.com");
map.put("$(“chargeName”)", "記敘文一般可分為記人、敘事、寫景、詠物等幾種。記人,要表現(xiàn)人物的思想感情和性格;敘事,要寫出事件所蘊(yùn)涵的意義,這些意義可以是政治思想方面的,也可以表達(dá)某種哲理,或某種情趣;寫景,要通過景物描寫表現(xiàn)出個(gè)人某種感情或深刻的感悟;詠物,或透露出世間人生的某種樂趣,或托物言志,表現(xiàn)對(duì)社會(huì)上某種人某種現(xiàn)象的情感。因此,我們寫記敘文總會(huì)有一定的目的,總要表達(dá)一定的思想和感情,實(shí)際上就是我們平常所講的“文章的主題”,主題是文章的靈魂,它像一根紅線貫串于文章的始終。沒有明確主題的記敘文,只能是一篇流水帳,所以要寫好記敘文,就必須要明確“為何敘”,即主題要明確。要主題明確可注意三點(diǎn):第一,要有積極意義,即確定的主題思想感情必須是健康的,有意義的。");
map.put("$(“jian”)", "先說文章的結(jié)構(gòu),即所要寫的這篇記敘文用什么結(jié)構(gòu)來表現(xiàn)出來。它包括這篇文章分幾層寫,哪些材料先寫,哪些后寫,哪些詳寫,哪些略寫,如何安排過渡,于何處伏筆,在哪里呼應(yīng),如何開頭,怎樣結(jié)尾,等等。從整篇記敘文來看、常見的結(jié)構(gòu)有順序、倒敘、插敘。順敘,就是按照事情發(fā)生、發(fā)展的,過程進(jìn)行敘述。包括以下幾種情況:其一,按時(shí)間的推移來敘述;其二,按事情的發(fā)展來敘述;其三,按認(rèn)識(shí)發(fā)展的過程來敘述;其四,按作者的行蹤來敘述。倒敘,就是把事情的結(jié)局,或某個(gè)突出的精彩片斷提到前邊寫,然后再按事件發(fā)生、發(fā)展的順序敘述。倒敘的運(yùn)用有四種類型:一種是把事件的結(jié)局提前,造成懸念,然后再按時(shí)間順序敘述事情的發(fā)生與發(fā)展;一種是把事件中最精彩的或最緊張的片斷截取下來,寫在前面,震動(dòng)和吸引讀者,然后按時(shí)間的順序敘述事件的起因、發(fā)展與結(jié)局;一種是先寫眼前的事物,由此及彼,引起回憶,再追敘往事,形成倒敘,一種是先寫當(dāng)前情況,再回憶過去的情況,以形成鮮明的對(duì)比,給讀者留下深刻印象。插敘,是在文章的敘述中,暫時(shí)中斷敘述的線索,插入一些與中心事件有關(guān)的內(nèi)容,然后再繼續(xù)進(jìn)行原來的敘述。插敘的具體內(nèi)容和形式有種種不同:有的是追敘,對(duì)過去事件片斷進(jìn)行回憶,有的是補(bǔ)敘,對(duì)有關(guān)人和事作必要的補(bǔ)充、解釋;有的是逆敘,對(duì)有關(guān)內(nèi)容由近及遠(yuǎn)、由今及古地回溯,靈活多樣的插敘,可以使主題開掘得更深刻,情節(jié)展開得更充分,內(nèi)容表現(xiàn)得更充實(shí),人物形象刻畫得更豐滿,避免了平輔直敘。");
map.put("$(“yijian”)", "無");
List list = new ArrayList();
DisUser user1 = new DisUser();
user1.setUserid(1l);
user1.setName("張三");
user1.setCname("文檔");
user1.setCnreason("fjsdn");
DisUser user2 = new DisUser();
user2.setUserid(2l);
user2.setName("趙四");
user2.setCname("文檔");
user2.setCnreason("放手發(fā)動(dòng)");
DisUser user3 = new DisUser();
user3.setUserid(3l);
user3.setName("呂五");
user3.setCname("文檔");
user3.setCnreason("居然敢");
list.add(user1);
list.add(user2);
list.add(user3);
ResolutionWord.DownloadWord(response,list,map,file);
}
4. 運(yùn)行結(jié)果
5. 第一個(gè)表格是 按照模板替換的內(nèi)容? ? 第二個(gè)表格是純 java 生成的表格
* :注意:代碼只適合 使用 poi 操作word 2007 以上版本(docx)? 不適合 word 2003(doc)
總結(jié)
以上是生活随笔為你收集整理的apache poi 修改docx表格_word 模板内容的替换和生成word 表格(使用poi)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一颗门牙种植牙多少钱
- 下一篇: django filter查询多选_Dj