POI 绘制图表

pom引入

		<!--POI-->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>4.1.2</version>
		</dependency>

测试数据


	private List<KeyValueVo> pieChartDateList() {

		List<KeyValueVo> list = Lists.newArrayList();

		for (int i = 1; i <= 50; i++) {
			Random random = new Random();
			KeyValueVo kv = new KeyValueVo();
			kv.setKey("v" + i);
			kv.setValue(String.valueOf(10 + random.nextInt(11)));
			list.add(kv);
		}
		return list;
	}

	private List<NodeData> lineChartDataList() {

		List<NodeData> list = Lists.newArrayList();

		for (int i = 1; i <= 30; i++) {

			Random random = new Random();
			NodeData data = new NodeData();
			data.setTime(String.valueOf(i));
			data.setV1(10 + random.nextInt(11));
			data.setV2(10 + random.nextInt(11));
			data.setV3(10 + random.nextInt(11));
			data.setV4(10 + random.nextInt(11));
			list.add(data);
		}

		return list;
	}

柱状图

@ApiOperation("柱状图")
@GetMapping("/chart/bar")
public Object barChart(HttpServletRequest request) throws Exception {
    // 从数据源获取数据列表
    List<NodeData> list = lineChartDataList();

    // 创建一个新的工作簿
    XSSFWorkbook workbook = new XSSFWorkbook();
    
    // 在工作簿中创建一个名为"Data"的工作表
    XSSFSheet dataSheet = workbook.createSheet("Data");

    // 在工作表的第一行创建标题行
    XSSFRow topRow = dataSheet.createRow(0);
    topRow.createCell(0).setCellValue("时间"); // 第一列标题
    topRow.createCell(1).setCellValue("v1");   // 第二列标题
    topRow.createCell(2).setCellValue("v2");   // 第三列标题
    topRow.createCell(3).setCellValue("v3");   // 第四列标题
    
    // 填充数据到工作表中,从第二行开始
    int rowIdx = 1;
    for (NodeData data : list) {
        XSSFRow row = dataSheet.createRow(rowIdx++);
        row.createCell(0).setCellValue(data.getTime());
        row.createCell(1).setCellValue(data.getV1());
        row.createCell(2).setCellValue(data.getV2());
        row.createCell(3).setCellValue(data.getV3());
    }

    // 创建绘图工具
    XSSFDrawing drawing = dataSheet.createDrawingPatriarch();

    // 设置图表的位置和大小
    XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 3, 5, 20, 25);
    
    // 创建一个柱状图对象
    XSSFChart chart = drawing.createChart(anchor);
    chart.setTitleText("Bar Chart"); // 设置图表标题
    
    // 创建X轴(分类轴)和Y轴(值轴)
    XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
    xAxis.setTitle("时间"); // 设置X轴标题
    XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT);
    yAxis.setTitle("值"); // 设置Y轴标题

    // 创建柱状图数据对象
    XDDFBarChartData data = (XDDFBarChartData) chart.createData(ChartTypes.BAR, xAxis, yAxis);
	// 设置X轴数据源(根据表格填充位置)
    XDDFDataSource<String> xData = XDDFDataSourcesFactory.fromStringCellRange(dataSheet, new CellRangeAddress(1, 30, 0, 0));
	// 设置Y轴数据源(根据表格填充位置)
    XDDFNumericalDataSource<Double> yData1 = XDDFDataSourcesFactory.fromNumericCellRange(dataSheet, new CellRangeAddress(1, 30, 1, 1));
    XDDFNumericalDataSource<Double> yData2 = XDDFDataSourcesFactory.fromNumericCellRange(dataSheet, new CellRangeAddress(1, 30, 2, 2));
    XDDFNumericalDataSource<Double> yData3 = XDDFDataSourcesFactory.fromNumericCellRange(dataSheet, new CellRangeAddress(1, 30, 3, 3));

    // 将数据系列添加到图表中
    data.addSeries(xData, yData1).setTitle("v1", null);
    data.addSeries(xData, yData2).setTitle("v2", null);
    data.addSeries(xData, yData3).setTitle("v3", null);
    
    // 设置柱状图方向为列方向
    data.setBarDirection(BarDirection.COL);

    // 绘制图表
    chart.plot(data);

    // 将工作簿保存为文件
    File excelFile = ExcelUtil.turnExcelToFile(workbook);
    FileInfo fileInfo = new FileInfo();
    fileInfo.setInputStream(new FileInputStream(excelFile)); // 设置文件输入流
    fileInfo.setFilename("柱状图测试" + ExcelConstant.EXCEL_FORMAT); // 设置文件名
    return FileUtil.forwardWeb(fileInfo, request); // 返回文件以供下载
}

在这里插入图片描述

折线图

@ApiOperation("折线图")
@GetMapping("/chart/line")
public Object lineChart(HttpServletRequest request) throws Exception {

    // 从数据源获取折线图所需的数据列表
    List<NodeData> list = lineChartDataList();

    // 创建一个新的Excel工作簿
    XSSFWorkbook workbook = new XSSFWorkbook();

    // 在工作簿中创建一个名为"Data"的工作表
    XSSFSheet dataSheet = workbook.createSheet("Data");

    // 在工作表的第一行创建标题行
    XSSFRow topRow = dataSheet.createRow(0);
    topRow.createCell(0).setCellValue("时间"); // 第一列标题
    topRow.createCell(1).setCellValue("v1");   // 第二列标题
    topRow.createCell(2).setCellValue("v2");   // 第三列标题
    topRow.createCell(3).setCellValue("v3");   // 第四列标题
    topRow.createCell(4).setCellValue("v4");   // 第五列标题

    // 将数据填充到工作表中,从第二行开始
    int rowIdx = 1;
    for (NodeData data : list) {
        XSSFRow row = dataSheet.createRow(rowIdx++);
        row.createCell(0).setCellValue(data.getTime()); // 设置时间
        row.createCell(1).setCellValue(data.getV1());   // 设置v1
        row.createCell(2).setCellValue(data.getV2());   // 设置v2
        row.createCell(3).setCellValue(data.getV3());   // 设置v3
        row.createCell(4).setCellValue(data.getV4());   // 设置v4
    }

    // 创建绘图工具
    XSSFDrawing drawing = dataSheet.createDrawingPatriarch();
    
    // 设置图表的位置和大小
    XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 7, 5, 25, 25);
    
    // 创建一个折线图对象
    XSSFChart chart = drawing.createChart(anchor);
    chart.setTitleText("Line Chart"); // 设置图表标题

    // 创建并设置X轴和Y轴
    XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
    xAxis.setTitle("时间");
    XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT);
    yAxis.setTitle("值");
    
    // 创建折线图数据对象
    XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, xAxis, yAxis);
    
	// 设置X轴数据源(根据表格填充位置)
    XDDFDataSource<String> xData = XDDFDataSourcesFactory.fromStringCellRange(dataSheet, new CellRangeAddress(1, 30, 0, 0));
    // 设置Y轴数据源(根据表格填充位置)
    XDDFNumericalDataSource<Double> yData1 = XDDFDataSourcesFactory.fromNumericCellRange(dataSheet, new CellRangeAddress(1, 30, 1, 1));
    XDDFNumericalDataSource<Double> yData2 = XDDFDataSourcesFactory.fromNumericCellRange(dataSheet, new CellRangeAddress(1, 30, 2, 2));
    XDDFNumericalDataSource<Double> yData3 = XDDFDataSourcesFactory.fromNumericCellRange(dataSheet, new CellRangeAddress(1, 30, 3, 3));
    XDDFNumericalDataSource<Double> yData4 = XDDFDataSourcesFactory.fromNumericCellRange(dataSheet, new CellRangeAddress(1, 30, 4, 4));
    
    // 将数据系列添加到折线图中
    data.addSeries(xData, yData1).setTitle("v1", null);
    data.addSeries(xData, yData2).setTitle("v2", null);
    data.addSeries(xData, yData3).setTitle("v3", null);
    data.addSeries(xData, yData4).setTitle("v4", null);
    
    // 绘制折线图
    chart.plot(data);
    
    // 将工作簿保存为文件
    File excelFile = ExcelUtil.turnExcelToFile(workbook);
    FileInfo fileInfo = new FileInfo();
    fileInfo.setInputStream(new FileInputStream(excelFile)); // 设置文件输入流
    fileInfo.setFilename("折线图测试" + ExcelConstant.EXCEL_FORMAT); // 设置文件名
    return FileUtil.forwardWeb(fileInfo, request); // 返回文件以供下载
}

在这里插入图片描述

饼图

@ApiOperation("饼图")
@GetMapping("/chart/pie")
public Object pieChart(HttpServletRequest request) throws Exception {
    // 从数据源获取饼图所需的数据列表
    List<KeyValueVo> list = pieChartDateList();

    // 创建一个新的Excel工作簿
    XSSFWorkbook workbook = new XSSFWorkbook();
    
    // 在工作簿中创建一个名为"Data"的工作表
    XSSFSheet dataSheet = workbook.createSheet("Data");
    
    // 在工作表的第一行创建标题行
    XSSFRow topRow = dataSheet.createRow(0);
    topRow.createCell(0).setCellValue("类别"); // 第一列标题
    topRow.createCell(1).setCellValue("值");   // 第二列标题
    
    // 将数据填充到工作表中,从第二行开始
    int rowIdx = 1;
    for (KeyValueVo kv : list) {
        XSSFRow row = dataSheet.createRow(rowIdx++);
        row.createCell(0).setCellValue(kv.getKey()); // 设置类别
        row.createCell(1).setCellValue(Double.parseDouble(kv.getValue())); // 设置值
    }
    
    // 创建绘图工具
    XSSFDrawing drawing = dataSheet.createDrawingPatriarch();
    
    // 设置图表的位置和大小
    XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 7, 5, 25, 25);
    
    // 创建一个饼图对象
    XSSFChart chart = drawing.createChart(anchor);
    chart.setTitleText("Pie Chart"); // 设置图表标题

    // 创建饼图数据对象
    XDDFPieChartData data = (XDDFPieChartData) chart.createData(ChartTypes.PIE, null, null);
    
    // 设置类别数据源(根据表格填充位置)
    XDDFDataSource<String> categoryData = XDDFDataSourcesFactory.fromStringCellRange(dataSheet, new CellRangeAddress(1, list.size(), 0, 0));
    // 设置值数据源(根据表格填充位置)
    XDDFNumericalDataSource<Double> valueData = XDDFDataSourcesFactory.fromNumericCellRange(dataSheet, new CellRangeAddress(1, list.size(), 1, 1));
    
    // 将数据系列添加到饼图中
    data.addSeries(categoryData, valueData).setTitle("Values", null);
    
    // 绘制饼图
    chart.plot(data);
    
    // 将工作簿保存为文件
    File excelFile = ExcelUtil.turnExcelToFile(workbook);
    FileInfo fileInfo = new FileInfo();
    fileInfo.setInputStream(new FileInputStream(excelFile)); // 设置文件输入流
    fileInfo.setFilename("饼图测试" + ExcelConstant.EXCEL_FORMAT); // 设置文件名
    return FileUtil.forwardWeb(fileInfo, request); // 返回文件以供下载
}

在这里插入图片描述

复合图(折线图和柱状图)

@ApiOperation("折线柱状复合图")
@GetMapping("/chart/line-and-bar")
public Object lineAndBarChart(HttpServletRequest request) throws Exception {

    // 获取折线和柱状图的数据列表
    List<NodeData> list = lineChartDataList();
    
    // 创建一个新的Excel工作簿
    XSSFWorkbook workbook = new XSSFWorkbook();
    
    // 创建一个名为"Data"的工作表
    XSSFSheet dataSheet = workbook.createSheet("Data");
    
    // 创建表头行
    XSSFRow topRow = dataSheet.createRow(0);
    topRow.createCell(0).setCellValue("时间"); // 列标题:时间
    topRow.createCell(1).setCellValue("v1");   // 列标题:v1
    topRow.createCell(2).setCellValue("v2");   // 列标题:v2
    topRow.createCell(3).setCellValue("v3");   // 列标题:v3
    topRow.createCell(4).setCellValue("v4");   // 列标题:v4

    // 遍历数据列表,填充工作表数据
    int rowIdx = 1; // 从第一行开始(0行是表头)
    for (NodeData data : list) {
        XSSFRow row = dataSheet.createRow(rowIdx++);
        row.createCell(0).setCellValue(data.getTime()); // 填充时间数据
        row.createCell(1).setCellValue(data.getV1());   // 填充v1数据
        row.createCell(2).setCellValue(data.getV2());   // 填充v2数据
        row.createCell(3).setCellValue(data.getV3());   // 填充v3数据
        row.createCell(4).setCellValue(data.getV4());   // 填充v4数据
    }

    // 创建绘图工具
    XSSFDrawing drawing = dataSheet.createDrawingPatriarch();
    
    // 设置图表的位置和大小
    XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 7, 5, 25, 25);
	
	// 创建一个图表对象
    XSSFChart chart = drawing.createChart(anchor);
    chart.setTitleText("Line and Bar Chart"); // 设置图表标题
    
    // 创建并设置X轴和Y轴
    XDDFCategoryAxis xAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
    xAxis.setTitle("时间"); // X轴标题:时间
    XDDFValueAxis yAxis = chart.createValueAxis(AxisPosition.LEFT);
    yAxis.setTitle("值"); // Y轴标题:值

    // 创建柱状图数据
    XDDFBarChartData barData = (XDDFBarChartData) chart.createData(ChartTypes.BAR, xAxis, yAxis);
    // 创建折线图数据
    XDDFLineChartData lineData = (XDDFLineChartData) chart.createData(ChartTypes.LINE, xAxis, yAxis);

    // 设置X轴数据源(根据表格填充位置)
    XDDFDataSource<String> xData = XDDFDataSourcesFactory.fromStringCellRange(dataSheet, new CellRangeAddress(1, list.size(), 0, 0));
    // 设置Y轴数据源(根据表格填充位置)
    XDDFNumericalDataSource<Double> yData1 = XDDFDataSourcesFactory.fromNumericCellRange(dataSheet, new CellRangeAddress(1, list.size(), 1, 1));
    XDDFNumericalDataSource<Double> yData2 = XDDFDataSourcesFactory.fromNumericCellRange(dataSheet, new CellRangeAddress(1, list.size(), 2, 2));
    XDDFNumericalDataSource<Double> yData3 = XDDFDataSourcesFactory.fromNumericCellRange(dataSheet, new CellRangeAddress(1, list.size(), 3, 3));
    XDDFNumericalDataSource<Double> yData4 = XDDFDataSourcesFactory.fromNumericCellRange(dataSheet, new CellRangeAddress(1, list.size(), 4, 4));

    // 为柱状图添加数据系列
    barData.addSeries(xData, yData1).setTitle("v1", null);
    barData.addSeries(xData, yData2).setTitle("v2", null);
    barData.setBarDirection(BarDirection.COL); // 设置柱状图的方向

    // 为折线图添加数据系列
    lineData.addSeries(xData, yData3).setTitle("v3", null);
    lineData.addSeries(xData, yData4).setTitle("v4", null);

    // 绘制柱状图数据
    chart.plot(barData);
    // 绘制折线图数据
    chart.plot(lineData);

    // 将工作簿保存为文件
    File excelFile = ExcelUtil.turnExcelToFile(workbook);
    FileInfo fileInfo = new FileInfo();
    fileInfo.setInputStream(new FileInputStream(excelFile)); // 设置文件输入流
    fileInfo.setFilename("饼图测试" + ExcelConstant.EXCEL_FORMAT); // 设置文件名
    return FileUtil.forwardWeb(fileInfo, request); // 返回文件以供下载
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值