1 依赖引入
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.8.2</version>
</dependency>
2 新建word模板
Word模板中所有变量以{{开头,以}}结尾,不同内容变量声明如下
1){{template}} 普通文本,渲染数据为:String或者TextRenderData
2){{#template}} 表格,渲染数据为:TableRenderData
3)当生成图表时,新建图表—>右键编辑替换文字—>{{barLineCharts}} 图表变量,如下图(可能不同版本编辑替换文字位置不同。)
3 java获取数据,生成word
1)声明模板的位置:
XWPFTemplate template = pile("./src/main/resources/templates/template.docx");
2)导出word路径,名称
FileOutputStream out = new FileOutputStream("./src/main/resources/templates/output_"+String.valueOf(Math.random())+".docx");
3)填充数据
//声明map存放模板中的内容HashMap<String, Object> data = new HashMap<String, Object>();data.put("title","hello world");//Logger.info("hello");/*测试文本插入------------------------------*///先定义文本对象TextRenderData textRenderData = new TextRenderData();//设置文本内容textRenderData.setText("张三");//设置文本格式Style style = new Style();style.setBold(true);style.setColor("000F00");style.setFontSize(20);textRenderData.setStyle(style);//将文本数据和模板中变量对应data.put("name", textRenderData);
/* 测试表格插入---------------------------------------*///定义表格的头//方式一//RowRenderData headerData = RowRenderData.build("电灯名称","使用率");//设置样式TableStyle tStyle = new TableStyle();tStyle.setBackgroundColor("87CEEB");//表头方式二/*RowRenderData headerData = RowRenderData.build(new TextRenderData("FFFFFF","仪器名称"),new TextRenderData("FFFFFF","使用率"));*///表头方式三List<CellRenderData> listCellRenderDatas =new ArrayList<CellRenderData>();CellRenderData cellRenderData1 = new CellRenderData();cellRenderData1.setCellText(new TextRenderData("000000","电灯名称"));listCellRenderDatas.add(cellRenderData1);CellRenderData cellRenderData2 = new CellRenderData();cellRenderData2.setCellText(new TextRenderData("000000","使用率"));listCellRenderDatas.add(cellRenderData2);CellRenderData cellRenderData3 = new CellRenderData();cellRenderData3.setCellText(new TextRenderData("000000","使用年限"));listCellRenderDatas.add(cellRenderData3);RowRenderData headerData = new RowRenderData(listCellRenderDatas);headerData.setRowStyle(tStyle);headerData.setCells(listCellRenderDatas);List<RowRenderData> listRowList = new ArrayList<RowRenderData>();//将数据存储为了后边生成图样式List<String> devname = new ArrayList<String>();List<Double> useRate = new ArrayList<Double>();List<Integer> useYear = new ArrayList<Integer>();for(int i = 0; i < 5; i++){//生成一行数据listRowList.add(RowRenderData.build("电灯_"+i,String.valueOf(Math.random()*100)+"%",String.valueOf(i+1)));//存入list,为了生成图表devname.add("电灯_"+i);useRate.add(Math.random()*100);useYear.add(i+1);}data.put("table",new MiniTableRenderData(headerData,listRowList));/* 测试图表的插入-------------------------------------*///柱状图生成ChartMultiSeriesRenderData bar = new ChartMultiSeriesRenderData();bar.setChartTitle("barCharts");//参数为数组bar.setCategories(devname.toArray(new String[devname.size()]));List<SeriesRenderData> seriesRenderDatas = new ArrayList<SeriesRenderData>();seriesRenderDatas.add(new SeriesRenderData("使用率",useRate.toArray(new Double[useRate.size()])));seriesRenderDatas.add(new SeriesRenderData("使用年限",useYear.toArray(new Integer[useYear.size()])));bar.setSeriesDatas(seriesRenderDatas);data.put("barCharts",bar);//折线图生成ChartMultiSeriesRenderData line = new ChartMultiSeriesRenderData();line.setChartTitle("lineCharts");//参数为数组line.setCategories(devname.toArray(new String[devname.size()]));List<SeriesRenderData> seriesRenderDatas1 = new ArrayList<SeriesRenderData>();seriesRenderDatas1.add(new SeriesRenderData("使用率",useRate.toArray(new Double[useRate.size()])));seriesRenderDatas1.add(new SeriesRenderData("使用年限",useYear.toArray(new Integer[useYear.size()])));line.setSeriesDatas(seriesRenderDatas1);data.put("lineCharts",line);//柱状图、折线图共存ChartMultiSeriesRenderData barLine = new ChartMultiSeriesRenderData();barLine.setChartTitle("barLineCharts");barLine.setCategories(devname.toArray(new String[devname.size()]));List<SeriesRenderData> seriesRenderDatas2 = new ArrayList<SeriesRenderData>();SeriesRenderData seriesRenderData1 = new SeriesRenderData();seriesRenderData1.setName("使用率bar");seriesRenderData1.setValues(useRate.toArray(new Double[useRate.size()]));seriesRenderData1.setComboType(boType.BAR);seriesRenderDatas2.add(seriesRenderData1);SeriesRenderData seriesRenderData2 = new SeriesRenderData();seriesRenderData2.setName("使用年限line");seriesRenderData2.setValues(useYear.toArray(new Integer[useYear.size()]));seriesRenderData2.setComboType(boType.LINE);seriesRenderDatas2.add(seriesRenderData2);SeriesRenderData seriesRenderData3 = new SeriesRenderData();seriesRenderData3.setName("使用率line");seriesRenderData3.setValues(useRate.toArray(new Double[useRate.size()]));seriesRenderData3.setComboType(boType.LINE);seriesRenderDatas2.add(seriesRenderData3);SeriesRenderData seriesRenderData4 = new SeriesRenderData();seriesRenderData4.setName("使用年限bar");seriesRenderData4.setValues(useYear.toArray(new Integer[useYear.size()]));seriesRenderData4.setComboType(boType.BAR);seriesRenderDatas2.add(seriesRenderData4);barLine.setSeriesDatas(seriesRenderDatas2);data.put("barLineCharts",barLine);//饼状图ChartSingleSeriesRenderData pie = new ChartSingleSeriesRenderData();pie.setChartTitle("饼状图");pie.setCategories(devname.toArray(new String[devname.size()]));pie.setSeriesData(new SeriesRenderData("电灯数量",new Integer[]{120,25,89,65,49}));data.put("pie", pie);
4)写入数据导出
/*将输入写入模板中------------------------------------------*/try {//将map数据放入模板template.render(data);//模板数据写入template.write(out);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}out.flush();out.close();template.close();
只写了用到的变量,还可以导入图片,可以参考官方文档。参考链接:/poi-tl/