java poi生.docx_PoiDocxDemo【Android将表单数据生成Word文档的方案之二(基于Poi4.0.0),目前只能java生成】...

packagecom.why.main;importorg.apache.poi.xwpf.usermodel.XWPFDocument;importorg.apache.poi.xwpf.usermodel.XWPFParagraph;importorg.apache.poi.xwpf.usermodel.XWPFRun;importorg.apache.poi.xwpf.usermodel.XWPFTable;importorg.apache.poi.xwpf.usermodel.XWPFTableCell;importorg.apache.poi.xwpf.usermodel.XWPFTableRow;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.util.HashMap;importjava.util.Iterator;importjava.util.List;importjava.util.Map;public classPoiUtils {//测试

public static voidmain(String[] args) {

String templetDocPath= "D:/temp/请假单模板1.docx";

String targetDocPath= "D:/temp/请假单1.docx";

Map dataMap = new HashMap();

dataMap.put("writeDate", "2018年10月14日");

dataMap.put("name", "HaiyuKing");

dataMap.put("dept", "移动开发组");

dataMap.put("leaveType", "☑倒休 √年假 ✔事假 ☐病假 ☐婚假 ☐产假 ☐其他");

dataMap.put("leaveReason", "倒休一天。");

dataMap.put("leaveStartDate", "2018年10月14日上午");

dataMap.put("leaveEndDate", "2018年10月14日下午");

dataMap.put("leaveDay", "1");

dataMap.put("leaveLeader", "同意");

dataMap.put("leaveDeptLeaderImg", "同意!");

PoiUtils.writeToDocx(templetDocPath,targetDocPath,dataMap);try{

PoiUtils.readDocx(targetDocPath);

}catch(Exception e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}/*** 通过XWPFDocument对内容进行访问。对于XWPF文档而言,用这种方式进行读操作更佳。

*@throwsException*/

public static void readDocx(String templetDocPath) throwsException {

InputStream is= newFileInputStream(templetDocPath);

XWPFDocument doc= newXWPFDocument(is);

List paras =doc.getParagraphs();for(XWPFParagraph para : paras) {//当前段落的属性

System.out.println("para=="+para.getText());

}//获取文档中所有的表格

List tables =doc.getTables();

Listrows;

Listcells;for(XWPFTable table : tables) {//获取表格对应的行

rows =table.getRows();for(XWPFTableRow row : rows) {//获取行对应的单元格

cells =row.getTableCells();for(XWPFTableCell cell : cells) {

System.out.println("cell=="+cell.getText());;

}

}

}if (is != null) {try{

is.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}/*** 生成一个docx文件

*@paramtempletDocPath 模板文件的完整路径

*@paramtargetDocPath 生成的目标文件的完整路径

*@paramdataMap 替换的数据*/

public static void writeToDocx(String templetDocPath, String targetDocPath, MapdataMap){try{//得到模板doc文件的HWPFDocument对象

InputStream in = newFileInputStream(templetDocPath);

writeToDocx(in,targetDocPath,dataMap);

}catch(IOException e)

{

e.printStackTrace();

}

}/*** 生成一个docx文件,主要用于直接读取asset目录下的模板文件,不用先复制到sd卡中

*@paramtempletDocInStream 模板文件的InputStream

*@paramtargetDocPath 生成的目标文件的完整路径

*@paramdataMap 替换的数据*/

public static void writeToDocx(InputStream templetDocInStream, String targetDocPath, MapdataMap){try{//得到模板doc文件的HWPFDocument对象

XWPFDocument HDocx = newXWPFDocument(templetDocInStream);//替换段落里面的变量

replaceInPara(HDocx, dataMap);//替换表格里面的变量

replaceInTable(HDocx, dataMap);//写到另一个文件中

OutputStream os = newFileOutputStream(targetDocPath);//把doc输出到输出流中

HDocx.write(os);

os.close();

templetDocInStream.close();

}catch(IOException e)

{

e.printStackTrace();

}catch(Exception e)

{

e.printStackTrace();

}

}/*** 替换段落里面的变量

*@paramdoc 要替换的文档

*@paramparams 参数*/

private static void replaceInPara(XWPFDocument doc, Mapparams) {

Iterator iterator =doc.getParagraphsIterator();

XWPFParagraph para;while(iterator.hasNext()) {

para=iterator.next();

replaceInPara(para, params);

}

}/*** 替换段落里面的变量

*@parampara 要替换的段落

*@paramparams 参数*/

private static void replaceInPara(XWPFParagraph para, Mapparams) {

Listruns;

System.out.println("para.getParagraphText()=="+para.getParagraphText());

runs=para.getRuns();for (int i=0; i

XWPFRun run=runs.get(i);

String runText=run.toString();

System.out.println("runText=="+runText);//替换文本内容,将自定义的$xxx$替换成实际文本

for(Map.Entryentry : params.entrySet())

{

runText= runText.replace(entry.getKey(), entry.getValue()+"");//直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,//所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。

para.removeRun(i);

para.insertNewRun(i).setText(runText);

}

}

}/*** 替换表格里面的变量

*@paramdoc 要替换的文档

*@paramparams 参数*/

private static void replaceInTable(XWPFDocument doc, Mapparams) {

Iterator iterator =doc.getTablesIterator();

XWPFTable table;

Listrows;

Listcells;

Listparas;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) {

replaceInPara(para, params);

}

}

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值