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 = XWPFTemplate.compile("./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(SeriesRenderData.ComboType.BAR);
seriesRenderDatas2.add(seriesRenderData1);
SeriesRenderData seriesRenderData2 = new SeriesRenderData();
seriesRenderData2.setName("使用年限line");
seriesRenderData2.setValues(useYear.toArray(new Integer[useYear.size()]));
seriesRenderData2.setComboType(SeriesRenderData.ComboType.LINE);
seriesRenderDatas2.add(seriesRenderData2);
SeriesRenderData seriesRenderData3 = new SeriesRenderData();
seriesRenderData3.setName("使用率line");
seriesRenderData3.setValues(useRate.toArray(new Double[useRate.size()]));
seriesRenderData3.setComboType(SeriesRenderData.ComboType.LINE);
seriesRenderDatas2.add(seriesRenderData3);
SeriesRenderData seriesRenderData4 = new SeriesRenderData();
seriesRenderData4.setName("使用年限bar");
seriesRenderData4.setValues(useYear.toArray(new Integer[useYear.size()]));
seriesRenderData4.setComboType(SeriesRenderData.ComboType.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 block
e.printStackTrace();
}
out.flush();
out.close();
template.close();
只写了用到的变量,还可以导入图片,可以参考官方文档。参考链接:http://deepoove.com/poi-tl/