Excel导出带有多个图表(柱状图、折线图、饼状图等)

您所在的位置:网站首页 excel表格生成饼状图方法 Excel导出带有多个图表(柱状图、折线图、饼状图等)

Excel导出带有多个图表(柱状图、折线图、饼状图等)

2024-07-13 07:40:35| 来源: 网络整理| 查看: 265

说明 动态创建带有多个图表的Excel文件

效果图: 在这里插入图片描述

一、分析

第一种:创建图表模板,在Excel模板里设置好图表,然后通过更新模板数值,最终刷新图表;(也包含刷新图标各项数据) 第二种:动态创建带有数值与图表的Excel

说明:第一种,有一定的局限性,就是Excel里的数值与图表的格式需要固定,只是对数值进行替换。实际开发过程中,很少有固定的格式,所以重点讲解第二种;

二、全动态导出Excel带有多个图表–》实现步骤

第一步:根据传入的数据集,生成数据表的表头与数据行,并返回创建画布XSSFDrawing 第二步:在画布里创建空图表XSSFChart 第三步:设置图表XSSFChart,比如:创建柱状图 第四步:生成导出Excel文件

1.根据传入的数据集,生成数据表的表头与数据行

创建数据源,就是创建列头,数据行以及样式等; 一个sheet对应一个画布,所有返回一个画布; 代码如下:

private XSSFDrawing createXSSFDrawingBuildDataSource(ExcelMoreDataSourceInput input) { if (Objects.isNull(wb)) wb = new XSSFWorkbook(); XSSFSheet sheet = wb.createSheet(input.getSheetName()); // 创建数据源 drawTable(sheet, input.getTitleArr(), input.getFldNameArr(), input.getDataList()); // 创建一个画布 return sheet.createDrawingPatriarch(); } 2.在画布里创建空图表XSSFChart

在画布里创建空图表XSSFChart,设置第几行几列为图表(多个图表布局好即可) 代码如下:

/** * 创建图表 * * @param isPutOnRight 比如:当列数大于5时,把画布放在数组右边 * @param chartNum 创建第几个图表 */ private XSSFChart createChart(XSSFDrawing drawing, int cols, int rows, boolean isPutOnRight, int chartNum) { int colNum = 25; ClientAnchor anchor; if (isPutOnRight) { anchor = drawing.createAnchor(0, 0, 0, 0, 1, rows + 2 + colNum * (chartNum - 1), cols + 15, rows + colNum * chartNums); } else { anchor = drawing.createAnchor(0, 0, 0, 0, cols + 1, 4 + colNum * (chartNum - 1), cols + 15, colNum * chartNums); } // 创建一个chart对象 return drawing.createChart(anchor); } 3.设置图表XSSFChart

以制作柱状图为例: 1、确认哪些列作为图例项 2、设置横坐标,这里固定第一列为横坐标 3、设置数据区域范围 具体请看一下代码 代码如下:

/** * 生成柱状图 * * @param chart 图表 * @param group 柱状图类型(堆积,多组) * @param fldNameArrIndex 数据列下标(用于Excel标识数据源区域) * @param rows 数据行数 * @param sheetName sheet的名称 */ private void drawBarChartMap(XSSFChart chart, STBarGrouping.Enum group, int[] fldNameArrIndex, int rows, String sheetName) { CTChart ctChart = chart.getCTChart(); CTPlotArea ctPlotArea = ctChart.getPlotArea(); // 创建柱状图模型 CTBarChart ctBarChart = ctPlotArea.addNewBarChart(); CTBoolean ctBoolean = ctBarChart.addNewVaryColors(); ctBarChart.getVaryColors().setVal(true); // 设置图类型 ctBarChart.addNewGrouping().setVal(group); ctBoolean.setVal(true); ctBarChart.addNewBarDir().setVal(STBarDir.COL); // 是否添加左侧坐标轴 ctChart.addNewDispBlanksAs().setVal(STDispBlanksAs.ZERO); ctChart.addNewShowDLblsOverMax().setVal(true); // 设置这两个参数是为了在STACKED模式下生成堆积模式;(standard)标准模式时需要将这两行去掉 if ("stacked".equals(group.toString()) || "percentStacked".equals(group.toString())) { ctBarChart.addNewGapWidth().setVal(150); ctBarChart.addNewOverlap().setVal((byte) 100); } // 创建序列,并且设置选中区域 for (int i = 0; i 0, 0, 0}); // 设置负轴颜色不是白色 ctBarSer.addNewInvertIfNegative().setVal(false); // 设置标签格式 ctBoolean.setVal(false); CTDLbls newDLbls = ctBarSer.addNewDLbls(); newDLbls.setShowLegendKey(ctBoolean); ctBoolean.setVal(true); newDLbls.setShowVal(ctBoolean); ctBoolean.setVal(false); newDLbls.setShowCatName(ctBoolean); newDLbls.setShowSerName(ctBoolean); newDLbls.setShowPercent(ctBoolean); newDLbls.setShowBubbleSize(ctBoolean); newDLbls.setShowLeaderLines(ctBoolean); } // 告诉BarChart它有坐标轴,并给它们id ctBarChart.addNewAxId().setVal(123456); ctBarChart.addNewAxId().setVal(123457); // 横坐标 CTCatAx ctCatAx = ctPlotArea.addNewCatAx(); ctCatAx.addNewAxId().setVal(123456); // id of the cat axis CTScaling ctScaling = ctCatAx.addNewScaling(); ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX); ctCatAx.addNewAxPos().setVal(STAxPos.B); ctCatAx.addNewCrossAx().setVal(123457); // id of the val axis ctCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO); // 纵坐标 CTValAx ctValAx = ctPlotArea.addNewValAx(); ctValAx.addNewAxId().setVal(123457); // id of the val axis ctScaling = ctValAx.addNewScaling(); ctScaling.addNewOrientation().setVal(STOrientation.MIN_MAX); // 设置位置 ctValAx.addNewAxPos().setVal(STAxPos.L); ctValAx.addNewCrossAx().setVal(123456); // id of the cat axis ctValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO); // 是否删除主左边轴 ctValAx.addNewDelete().setVal(false); // 是否删除横坐标 ctCatAx.addNewDelete().setVal(false); // legend图注 // if(true){ CTLegend ctLegend = ctChart.addNewLegend(); ctLegend.addNewLegendPos().setVal(STLegendPos.B); ctLegend.addNewOverlay().setVal(false); // } } 4.生成导出Excel文件

代码如下:

public void createTpl(String filePath) { try { File f = new File(filePath); //写文件 //不存在则新增 if (!f.getParentFile().exists()) { f.getParentFile().mkdirs(); } if (!f.exists()) { f.createNewFile(); } FileOutputStream out = new FileOutputStream(f); out.flush(); wb.write(out); out.close(); } catch (IOException e) { e.printStackTrace(); } 三、测试用例 /** * 根据数据源,生成多个图表 */ public class ExcelChartUtilTest { @Test public void excelChartTest() { // 字段名 List fldNameArr = new ArrayList(); fldNameArr.add("value1"); fldNameArr.add("value2"); fldNameArr.add("value3"); fldNameArr.add("value4"); // 列头 List titleArr = new ArrayList(); titleArr.add("类型"); titleArr.add("总额"); titleArr.add("数量"); titleArr.add("人均"); // 模拟数据 List dataList = new ArrayList(); for (int i = 0; i final String fileInput = "C:\\file\\chart\\test\\line-chart-template-test.xlsx"; try (FileInputStream argIS = new FileInputStream(fileInput)) { try (XSSFWorkbook xssfWorkbook = new XSSFWorkbook(argIS)) { //获取创建工作簿的第一页 XSSFSheet sheet = xssfWorkbook.getSheetAt(0); //自动计算 sheet.setForceFormulaRecalculation(true); //给指定的sheet命名 xssfWorkbook.setSheetName(0, "sheet0"); //初始化当前的索引,设为当前sheet的最后一行行数 int allRows = sheet.getLastRowNum(); //填充数据 for (int i = 1; i continue; } //遍历列 for (int j = 0; j if (j == 0) cell.setCellValue("岗位" + i); else cell.setCellValue(i * 10 + j); } } // 保存返回 try (OutputStream out = new FileOutputStream("C:\\file\\chart\\test\\line_chart-demo-output.xlsx")) { xssfWorkbook.write(out); } } } } }


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭