700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 使用poi-tl导出动态word模板 包含折线图 柱状图 饼状图

使用poi-tl导出动态word模板 包含折线图 柱状图 饼状图

时间:2022-01-04 02:18:05

相关推荐

使用poi-tl导出动态word模板 包含折线图 柱状图 饼状图

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/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。