如何用SpringBoot+Thymeleaf+Echart生成好看的柱状图,折线图,饼状图

一、前言

上篇文章我们用POI技术读取Excel并生成了相应的图表。但是实际的效果比较一般,因为本身WPS生成图表就比较简单,如果用程序操作远比人工耗时费力,效果远不如一些付费模板。如下图所示:
在这里插入图片描述
然后我就想到前端不是有一个简单易上手的Echart.js是专门做图表。所以就用它去做图表生成,后台数据解析还是用springBoot+Ajax+POI工具类。这样实现的效果就会好看和实用很多。来看一下效果图。
在这里插入图片描述
在这里插入图片描述

二、准备数据

1、首先新建一个xls统计表。
在这里插入图片描述
2、数据填充

手机型号	测评分数	销售数量
OPPO Reno9 Pro+ 5G	1210365	7523423
Xiaomi 12 Pro天现版	1187600	343242
ROG游戏手机6 天现至尊版	1187449	535362
一加 Ace Pro	1183234	83234
小米12S Pro	1176850	2346625
Redmi K50 至尊版	1172517	4324324
Xiaomi 12S	1164309	3424234
联想救者 Y90	1164235	234434
小米MIX FOLD 2	1164109	32423432
iQo0 10 Pro	1151258	9403424

在这里插入图片描述

三、前端代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>ECharts</title>
    <!-- 引入刚刚下载的 ECharts 文件 -->
    <!--  <script src="https://cdn.staticfile.org/jquery/3.6.1/jquery.min.js"></script>-->
    <!-- 引入 echarts.js -->
    <!--  <script src="https://cdn.staticfile.org/echarts/5.3.0/echarts.min.js"></script>-->
    <script src="./js/echarts.min.js"></script>
    <script src="./js/jquery-3.6.1.min.js"></script>

</head>
<body>
<div id="title" style="width:1200px;height:100px"></div>
<!-- 为 ECharts 准备一个定义了宽高的 DOM -->
<div id="line" style="width: 1200px;height:800px;"></div>
<div id="pie" style="width: 1200px;height:800px;"></div>
<div id="bak" style="width:200px;height:100px"></div>
<div id="bar" style="width: 1200px;height:800px;"></div>

<script type="text/javascript">
    var title = echarts.init(document.getElementById('title'));
    // 基于准备好的dom,初始化echarts实例
    var myChart = echarts.init(document.getElementById('bar'));
    var pieChart = echarts.init(document.getElementById('pie'));
    var lineChart = echarts.init(document.getElementById('line'));


    var titleOption = {
        graphic: {
            elements: [
                {
                    type: 'text',
                    left: 'center',
                    top: 'center',
                    style: {
                        text: '手机性能统计图',
                        fontSize: 50,
                        fontWeight: 'bold',
                        lineDash: [0, 200],
                        lineDashOffset: 0,
                        fill: 'transparent',
                        stroke: '#000',
                        lineWidth: 1
                    },
                    keyframeAnimation: {
                        duration: 3000,
                        loop: true,
                        keyframes: [
                            {
                                percent: 0.7,
                                style: {
                                    fill: 'transparent',
                                    lineDashOffset: 200,
                                    lineDash: [200, 0]
                                }
                            },
                            {
                                // Stop for a while.
                                percent: 0.8,
                                style: {
                                    fill: 'transparent'
                                }
                            },
                            {
                                percent: 1,
                                style: {
                                    fill: 'gray'
                                }
                            }
                        ]
                    }
                }
            ]
        }
    };

$.ajax({
    type:"post",
    async:true,
    url:"/getData",
    dataType:"json",
    success:function (data) {
        if (data) {
            // 指定图表的配置项和数据
            var barOption = {
                title: {
                    text: '手机性能柱状统计图'
                },
                tooltip: {},
                legend: {
                    data: ['手机性能柱状统计图']
                },
                xAxis: {
                    data: data[0].key,
                },
                yAxis: {},
                color: '#fac858',
                series: [
                    {
                        name: '评测分数',
                        type: 'bar',
                        data: data[0].value,
                    }
                ]
            };


            // 指定图表的配置项和数据
            var lineOption = {
                title: {
                    text: '折线柱状统计图'
                },
                tooltip: {},
                legend: {
                    data: ['品牌销量', '品牌评测分数']
                },
                xAxis: {
                    data: data[0].key,
                },
                yAxis: {type: "log",},
                series: [
                    {
                        name: '品牌销量',
                        type: 'line',
                        data: data[1].value
                    }, {
                        name: '品牌评测分数',
                        type: 'line',
                        data: data[0].value
                    }
                ]
            };

            var pieOption = {
                title: {
                    text: '品牌销量占比饼状图'
                },
                tooltip: {
                    trigger: 'item'
                },
                legend: {
                    top: '85%',
                    left: 'center'
                },
                series: [
                    {
                        name: '品牌销量占比饼状图',
                        type: 'pie',
                        radius: ['30%', '70%'],
                        avoidLabelOverlap: false,
                        itemStyle: {
                            borderRadius: 10,
                            borderColor: '#fff',
                            borderWidth: 2
                        },
                        label: {
                            show: false,
                            position: 'center'
                        },
                        emphasis: {
                            label: {
                                show: true,
                                fontSize: 40,
                                fontWeight: 'bold'
                            }
                        },
                        labelLine: {
                            show: false
                        },
                        data: data[2]
                    }
                ]
            };
            title.setOption(titleOption);
            // 使用刚指定的配置项和数据显示图表。
            myChart.setOption(barOption);
            lineChart.setOption(lineOption);
            pieChart.setOption(pieOption);
        }
    },
    error:function (errorMsg) {
        alert("图表请求数据失败!");
        myChart.hideLoading();
        totalChart.hideLoading();
        lineChart.hideLoading();
        pieChart.hideLoading();
    }
});
</script>
</body>
</html>

其中需要注意的是js依赖文件可以本地下载好引用本地。–适用于内网
或者将注释打开,直接从互联网依赖。–适用于外网
在这里插入图片描述
使用div布局,绑定各组件变量
在这里插入图片描述
标题组件定义
在这里插入图片描述
ajax异步请求及组件定义
在这里插入图片描述
绑定组件及ajax请求失败的处理方式。
在这里插入图片描述

四、后端代码

还是创建一个springboot功能。

1、配置文件application.yaml

server:
  port: 9999
resources:
  static-locations: classpath:/templates/, classpath:/static/
thymeleaf:
  prefix: classpath:/templates/ #thģ������·��
  suffix: .html
  mode: HTML5
  encoding: UTF-8
  cache: false

2、pom依赖

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.icbc</groupId>
	<artifactId>echartdemo</artifactId>
	<version>1.0-SNAPSHOT</version>

	<name>boottest</name>
	<!-- FIXME change it to the project's website -->
	<url>http://www.example.com</url>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.7.RELEASE</version>
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>1.7</maven.compiler.source>
		<maven.compiler.target>1.7</maven.compiler.target>
		<poi-version>3.11</poi-version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.lucee</groupId>
			<artifactId>jsch</artifactId>
			<version>0.1.53</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.25</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.25</version>
			<!-- <scope>test</scope> -->
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.11</version>
		</dependency>
		<dependency>
			<groupId>commons-codec</groupId>
			<artifactId>commons-codec</artifactId>
			<version>1.14</version>
		</dependency>

		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml-schemas</artifactId>
			<version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-scratchpad</artifactId>
			<version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.xmlbeans</groupId>
			<artifactId>xmlbeans</artifactId>
			<version>3.1.0</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>ooxml-schemas</artifactId>
			<version>1.4</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.36</version>
		</dependency>

	</dependencies>

	<build>
		<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
			<plugins>
				<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
				<plugin>
					<artifactId>maven-clean-plugin</artifactId>
					<version>3.1.0</version>
				</plugin>
				<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
				<plugin>
					<artifactId>maven-resources-plugin</artifactId>
					<version>3.0.2</version>
				</plugin>
				<plugin>
					<artifactId>maven-compiler-plugin</artifactId>
					<version>3.8.0</version>
				</plugin>
				<plugin>
					<artifactId>maven-surefire-plugin</artifactId>
					<version>2.22.1</version>
				</plugin>
				<plugin>
					<artifactId>maven-jar-plugin</artifactId>
					<version>3.0.2</version>
				</plugin>
				<plugin>
					<artifactId>maven-install-plugin</artifactId>
					<version>2.5.2</version>
				</plugin>
				<plugin>
					<artifactId>maven-deploy-plugin</artifactId>
					<version>2.8.2</version>
				</plugin>
				<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
				<plugin>
					<artifactId>maven-site-plugin</artifactId>
					<version>3.7.1</version>
				</plugin>
				<plugin>
					<artifactId>maven-project-info-reports-plugin</artifactId>
					<version>3.0.0</version>
				</plugin>
			</plugins>
		</pluginManagement>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

3、在resource下创建templates目录,并将html放入

在这里插入图片描述

4、启动类

package com.icbc.echartdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class EchartdemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(EchartdemoApplication.class, args);
	}

}

5、excel数据处理工具类

package com.icbc.echartdemo;


import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xddf.usermodel.PresetColor;
import org.apache.poi.xddf.usermodel.XDDFColor;
import org.apache.poi.xddf.usermodel.XDDFSolidFillProperties;
import org.apache.poi.xddf.usermodel.chart.*;
import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTDLbls;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.*;

/**
 * ClassName: ExcelChartUtils <br/>
 * Description: 导出excel中绘制图表<br/>
 * date: 2022/11/17 11:39<br/>
 *
 * @author DELL<br />
 * @since JDK 1.8
 */
public class ExcelChartUtils2 {

    public static final String READ_FILE_PATH = "C:\\Users\\Administrator\\Desktop\\统计.xls";

    public static void main(String[] args) throws IOException {
        ExcelChartUtils2 excelChartUtils=new ExcelChartUtils2();
        XSSFWorkbook wb = new XSSFWorkbook();
//        String sheetName = "当月业务量统计";
//        String sheetName2 = "本周高频报错业务统计";
//        String sheetName3 = "本周高频报错占比统计";
//        excelChartUtils.exportLineDiagram(wb,sheetName2);
//        excelChartUtils.exportPieDirgram(wb,sheetName3);
//        excelChartUtils.exportBarDiagram(wb,sheetName);

    }

    public void exportPieDirgram(XSSFWorkbook wb,String sheetName){
        XSSFSheet sheet = wb.createSheet(sheetName);
        // 创建一个画布
        XSSFDrawing drawing = sheet.createDrawingPatriarch();
        // 前四个默认0,[0,4]:从0列4行开始;[7,20]:到7列20行结束
        // 默认宽度(14-8)*12
        XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 0, 30, 40);
        // 创建一个chart对象
        XSSFChart chart = drawing.createChart(anchor);
        // 标题
        chart.setTitleText("高频报错占比统计");
        // 标题是否覆盖图表
        chart.setTitleOverlay(false);

        // 图例位置
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.TOP_RIGHT);

        //解析数据
        Map<String, List<String>> dataMap = ExcelChartUtils2.getData(READ_FILE_PATH,3,0,6);;
        List<String> keylist = dataMap.get("key");
        List<String> valueList = dataMap.get("value");
        List<Integer> vList = new ArrayList<>();
        for(int i = 0;i<valueList.size();i++){
            if(valueList.get(i).isEmpty()){
                vList.add(0);
            }else{
                vList.add(Integer.valueOf(valueList.get(i).split("\\.")[0]));
            }
        }
        //XDDFDataSource<String> countries = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 0, 6));//从指定表格中的位置上获取对应数据
        XDDFCategoryDataSource countries = XDDFDataSourcesFactory.fromArray(keylist.toArray(new String[keylist.size()]));
        // 数据1,单元格范围位置[1, 0]到[1, 6]
        // XDDFNumericalDataSource<Double> area = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, 6));
        XDDFNumericalDataSource<Integer> area = XDDFDataSourcesFactory.fromArray(vList.toArray(new Integer[vList.size()]));
        // XDDFChartData data = chart.createData(ChartTypes.PIE3D, null, null);
        XDDFChartData data = chart.createData(ChartTypes.PIE, null, null);
        // 设置为可变颜色
        data.setVaryColors(true);
        // 图表加载数据
        data.addSeries(countries, area);

        // 绘制
        chart.plot(data);
        CTDLbls dLbls = chart.getCTChart().getPlotArea().getPieChartArray(0).getSerArray(0).addNewDLbls();
        dLbls.addNewShowVal().setVal(false);
        dLbls.addNewShowLegendKey().setVal(false);
        dLbls.addNewShowCatName().setVal(true);// 类别名称
        dLbls.addNewShowSerName().setVal(false);
        dLbls.addNewShowPercent().setVal(true);// 百分比
        dLbls.addNewShowLeaderLines().setVal(true);// 引导线
        dLbls.setSeparator("\n");// 分隔符为分行符
        dLbls.addNewDLblPos().setVal(org.openxmlformats.schemas.drawingml.x2006.chart.STDLblPos.Enum.forString("inEnd"));// 数据标签内

        // 打印图表的xml
        // System.out.println(chart.getCTChart());

    }

    public void exportLineDiagram(XSSFWorkbook wb,String sheetName) throws IOException {
        FileOutputStream fileOut = null;
            XSSFSheet sheet = wb.createSheet(sheetName);
            // 创建一个画布
            XSSFDrawing drawing = sheet.createDrawingPatriarch();
            // 前四个默认0,[0,5]:从0列5行开始;[7,26]:到7列26行结束
            // 默认宽度(14-8)*12
            XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 0, 30, 40);
            // 创建一个chart对象
            XSSFChart chart = drawing.createChart(anchor);
            // 标题
            chart.setTitleText("高频报错业务统计");
            // 标题覆盖
            chart.setTitleOverlay(false);

            // 图例位置
            XDDFChartLegend legend = chart.getOrAddLegend();
            legend.setPosition(LegendPosition.TOP);

            // 分类轴标(X轴),标题位置
            XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.LEFT);
            //    bottomAxis.setTitle("国家");
            // 值(Y轴)轴,标题位置
            XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.BOTTOM);
            //  leftAxis.setTitle("面积大小");
            Map<String, List<String>> dataMap = ExcelChartUtils2.getData(READ_FILE_PATH,3,2,6);
            List<String> keylist = dataMap.get("key");
            List<String> valueList = dataMap.get("value");
            List<Integer> vList = new ArrayList<>();
            for(int i = 0;i<valueList.size();i++){
                if(valueList.get(i).isEmpty()){
                    vList.add(0);
                }else{
                    vList.add(Integer.valueOf(valueList.get(i).split("\\.")[0]));
                }
            }
//            keylist.remove(0);
//            valueList.remove(0);
            // CellRangeAddress(起始行号,终止行号, 起始列号,终止列号)
            // 分类轴标(X轴)数据,单元格范围位置[0, 0]到[0, 6]
            //XDDFDataSource<String> countries = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 0, 6));//从指定表格中的位置上获取对应数据
            XDDFCategoryDataSource countries = XDDFDataSourcesFactory.fromArray(keylist.toArray(new String[keylist.size()]));
            // 数据1,单元格范围位置[1, 0]到[1, 6]
            // XDDFNumericalDataSource<Double> area = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, 6));
            XDDFNumericalDataSource<Integer> area = XDDFDataSourcesFactory.fromArray(vList.toArray(new Integer[vList.size()]));

            // bar:条形图,
            XDDFLineChartData bar = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);

            leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);
            // 设置为可变颜色
            bar.setVaryColors(false);// 如果需要设置成自己想要的颜色,这里可变颜色要设置成false

            // 图表加载数据,条形图
            XDDFLineChartData.Series series1 = (XDDFLineChartData.Series) bar.addSeries(countries, area);
            // 条形图例标题
            series1.setTitle("业务量统计", null);
            XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.BLUE));
            // 条形图,填充颜色
            series1.setFillProperties(fill);

            // 绘制
            chart.plot(bar);
            // CTBarSer ser = chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(0);
            // CTLegend legend2 = chart.getCTChartSpace().getChart().getLegend();//更详细的图例设置

            // 打印图表的xml
            System.out.println(chart.getCTChart());


    }

    public String exportBarDiagram(XSSFWorkbook wb,String sheetName) throws IOException {

        FileOutputStream fileOut = null;
        try {
            XSSFSheet sheet = wb.createSheet(sheetName);
            // 创建一个画布
            XSSFDrawing drawing = sheet.createDrawingPatriarch();
            // 前四个默认0,[0,5]:从0列5行开始;[7,26]:到7列26行结束
            // 默认宽度(14-8)*12
            XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 0, 30, 40);
            // 创建一个chart对象
            XSSFChart chart = drawing.createChart(anchor);
            // 标题
            chart.setTitleText("业务量统计");
            // 标题覆盖
            chart.setTitleOverlay(false);

            // 图例位置
            XDDFChartLegend legend = chart.getOrAddLegend();
            legend.setPosition(LegendPosition.TOP);

            // 分类轴标(X轴),标题位置
            XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
        //    bottomAxis.setTitle("国家");
            // 值(Y轴)轴,标题位置
            XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);
          //  leftAxis.setTitle("面积大小");
            Map<String, List<String>> dataMap = ExcelChartUtils2.getData(READ_FILE_PATH,4,2,6);
            List<String> keylist = dataMap.get("key");
            List<String> valueList = dataMap.get("value");
            List<Integer> vList = new ArrayList<>();
            for(int i = 0;i<valueList.size();i++){
                if(valueList.get(i).isEmpty()){
                    vList.add(0);
                }else{
                    vList.add(Integer.valueOf(valueList.get(i).split("\\.")[0]));
                }
            }
//            keylist.remove(0);
//            valueList.remove(0);
            // CellRangeAddress(起始行号,终止行号, 起始列号,终止列号)
            // 分类轴标(X轴)数据,单元格范围位置[0, 0]到[0, 6]
            //XDDFDataSource<String> countries = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(0, 0, 0, 6));//从指定表格中的位置上获取对应数据
             XDDFCategoryDataSource countries = XDDFDataSourcesFactory.fromArray(keylist.toArray(new String[keylist.size()]));
            // 数据1,单元格范围位置[1, 0]到[1, 6]
           // XDDFNumericalDataSource<Double> area = XDDFDataSourcesFactory.fromNumericCellRange(sheet, new CellRangeAddress(1, 1, 0, 6));
            XDDFNumericalDataSource<Integer> area = XDDFDataSourcesFactory.fromArray(vList.toArray(new Integer[vList.size()]));

            // bar:条形图,
            XDDFBarChartData bar = (XDDFBarChartData) chart.createData(ChartTypes.BAR, bottomAxis, leftAxis);

            leftAxis.setCrossBetween(AxisCrossBetween.BETWEEN);
            // 设置为可变颜色
            bar.setVaryColors(false);// 如果需要设置成自己想要的颜色,这里可变颜色要设置成false
            // 条形图方向,纵向/横向:纵向
            bar.setBarDirection(BarDirection.COL);

            // 图表加载数据,条形图1
            XDDFBarChartData.Series series1 = (XDDFBarChartData.Series) bar.addSeries(countries, area);
            // 条形图例标题
            series1.setTitle("业务量统计", null);
            XDDFSolidFillProperties fill = new XDDFSolidFillProperties(XDDFColor.from(PresetColor.BLUE));
            // 条形图,填充颜色
            series1.setFillProperties(fill);
            // 绘制
            chart.plot(bar);
            // CTBarSer ser = chart.getCTChart().getPlotArea().getBarChartArray(0).getSerArray(0);
            // CTLegend legend2 = chart.getCTChartSpace().getChart().getLegend();//更详细的图例设置

            // 打印图表的xml
            System.out.println(chart.getCTChart());

            // 将输出写入excel文件
           // String filename = "排行榜前七的国家.xlsx";
            //  out = new FileOutputStream(getAbsoluteFile(filename));
            String filename = encodingFilename();
            fileOut = new FileOutputStream("E:\\"+File.separator+filename);
            wb.write(fileOut);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            wb.close();
            if (fileOut != null) {
                fileOut.close();
            }
        }

      return "success";
    }

    public static Map<String,List<String>> getData(String filePath, int sheetIndex,int keyNum,int valueNum){
        Map<String, List<String>> resMap = new HashMap<>();
        FileInputStream fis = null;
        HSSFWorkbook workbook = null;
        List<String> keylist = new ArrayList();
        List<String> valueList = new ArrayList<>();
        try {
            fis = new FileInputStream(filePath);
            workbook = new HSSFWorkbook(fis);
            Sheet sheet = workbook.getSheetAt(sheetIndex);
            Row row;
            Cell cell;
            for (int i = 1; i < sheet.getLastRowNum(); i++) {
                row = sheet.getRow(i);
                cell = row.getCell(keyNum); // 0 is the column index
                System.out.println(cell.getStringCellValue());
                keylist.add(cell.getStringCellValue());
                cell = row.getCell(valueNum); // 0 is the column index
                double numericCellValue;
                if(cell.getCellType().equals(CellType.NUMERIC)){
                    numericCellValue = cell.getNumericCellValue();
                }else {
                     numericCellValue = Double.valueOf(cell.getStringCellValue());
                }
                valueList.add( String.valueOf(numericCellValue) );
            }
            System.out.println("name:"+keylist);
            System.out.println("value:"+valueList);
            workbook.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
//        resMap.put("key",keylist.toArray(new String[keylist.size()]));
//        resMap.put("value",valueList.toArray(new String[valueList.size()]));
        resMap.put("key",keylist);
        resMap.put("value",valueList);
        return resMap;
    }




    /**
     * 编码文件名
     */
    public String encodingFilename()
    {
        String filename = UUID.randomUUID().toString() + ".xlsx";
        //String filename = "20230222.xlsx";
        return filename;
    }

    /**
     * 获取下载路径
     *
     * @param filename 文件名称
     */
    public  String getAbsoluteFile(String filename)
    {
        String downloadPath = "d://";
        File desc = new File(downloadPath);
        if (!desc.getParentFile().exists())
        {
            desc.getParentFile().mkdirs();
        }
        return downloadPath;
    }
}



6、controller处理类

package com.icbc.echartdemo;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import static com.icbc.echartdemo.ExcelChartUtils2.READ_FILE_PATH;

/**
 * @Author stalin
 * @Desc Echarts入门案例
 */
@RestController
public class EchartController {
    @RequestMapping(value = "/echarts", method = RequestMethod.GET)
    @ResponseBody
    public ModelAndView echarts() {
        //test为在为你的html文件名字,SpringBoot会自动找到这个html文件
        return new ModelAndView("echart");
    }


    @RequestMapping("/getData")
    @ResponseBody
    public JSONArray getData() {
        List<ReportData> dataList = new ArrayList<>();
        Map<java.lang.String, List<java.lang.String>> dataMap = ExcelChartUtils2.getData(READ_FILE_PATH, 0, 0, 1);
        JSONArray arr = new JSONArray();
        JSONObject obj = new JSONObject();
        obj.put("key", dataMap.get("key"));
        obj.put("value", dataMap.get("value"));
        Map<java.lang.String, List<java.lang.String>> dataMap2 = ExcelChartUtils2.getData(READ_FILE_PATH, 0, 0, 2);
        arr.clear();
        arr.add(obj);
        JSONObject obj2 = new JSONObject();
        obj2.put("key", dataMap2.get("key"));
        obj2.put("value", dataMap2.get("value"));
        arr.add(obj2);
        JSONArray array = new JSONArray();
        List<String> key = dataMap.get("key");
        List<String> value = dataMap.get("value");
        for (int i = 0; i < key.size(); i++) {
            JSONObject o = new JSONObject();
            o.put("name", key.get(i));
            o.put("value", value.get(i));
            array.add(o);
        }
        arr.add(array);
        return arr;
    }

//    @RequestMapping(value = "/index", method = RequestMethod.GET)
//    @ResponseBody
//    public ModelAndView index() {
//        //test为在为你的html文件名字,SpringBoot会自动找到这个html文件
//        return new ModelAndView("index");
//    }
}

注意:html名字与要返回的ModelAndView名字要一致。否则后端程序会找不到对应的页面。
在这里插入图片描述
然后启动项目即可。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Spring Boot可以使用Apache POI库来实现Excel导出功能。具体步骤如下: 1. 添加依赖 在pom.xml文件中添加以下依赖: ``` <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> ``` 2. 编写Controller 编写一个Controller类,其中包含一个导出Excel的方法。方法中使用Apache POI库创建Excel文件,并将其写入输出流中。 ``` @GetMapping("/export") public void export(HttpServletResponse response) throws IOException { // 创建Excel文件 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); Row row = sheet.createRow(); Cell cell = row.createCell(); cell.setCellValue("Hello, world!"); // 写入输出流 response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment; filename=test.xlsx"); workbook.write(response.getOutputStream()); workbook.close(); } ``` 3. 测试 启动应用程序,并访问导出Excel的接口。Excel文件将自动下载到本地计算机。 以上就是使用Spring Boot实现Excel导出的基本步骤。 ### 回答2: SpringBoot 是一个非常方便的开源 Java 开发框架,可以用来快速、简便地创建 Web 应用程序。而在实际开发中,经常会用到 Excel 导入导出的功能,那么如何在 SpringBoot 中进行 Excel 导出呢?下面将详细介绍。 一、依赖导入 首先需要在 pom.xml 文件中添加以下依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> 二、创建 Excel 工具类 在项目中创建一个 Excel 工具类,用于创建 Excel 文件。这里我们可以使用 Apache POI 提供的 API,进行 Excel 文件的创建和写入。以下是一个 Excel 工具类的示例代码。 ```java public class ExcelUtils { /** * 导出Excel文件 * @param headers * @param values * @param fileName * @return */ public static Workbook createWorkbook(String[] headers, List<Map<String, Object>> values, String fileName) { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet(); // 创建表头 Row rowHeader = sheet.createRow(0); for (int i = 0; i < headers.length; i++) { Cell cell = rowHeader.createCell(i); cell.setCellValue(headers[i]); } // 填充数据 if (values != null) { int rowIndex = 1; for (Map<String, Object> map : values) { Row row = sheet.createRow(rowIndex++); int cellIndex = 0; for (String key : map.keySet()) { Cell cell = row.createCell(cellIndex++); cell.setCellValue(String.valueOf(map.get(key))); } } } return workbook; } /** * 通过HttpServletResponse对象将Excel文件输出到浏览器 * @param workbook * @param response * @param fileName * @throws IOException */ public static void writeWorkbookToResponse(Workbook workbook, HttpServletResponse response, String fileName) throws IOException { response.setContentType("application/vnd.ms-excel;charset=utf-8"); response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); ServletOutputStream out = response.getOutputStream(); workbook.write(out); out.flush(); workbook.close(); out.close(); } } ``` 三、Controller 中进行调用 在 Controller 中进行调用 Excel 工具类,将从数据库中查询到的数据存储到 List<Map<String, Object>> 中,然后调用 ExcelUtils 类的 createWorkbook 方法,实现 Excel 导出功能。 ```java @RestController public class ExportController { @Autowired private UserService userService; @RequestMapping(value = "/export", method = RequestMethod.GET) public void export(HttpServletResponse response) throws IOException { List<User> userList = userService.findAll(); List<Map<String, Object>> values = new ArrayList<>(); Map<String, Object> map = null; for (User user : userList) { map = new HashMap<>(); map.put("id", user.getId()); map.put("name", user.getName()); map.put("age", user.getAge()); map.put("address", user.getAddress()); map.put("phone", user.getPhone()); values.add(map); } String[] headers = {"ID", "姓名", "年龄", "地址", "电话"}; String fileName = "用户信息.xlsx"; Workbook workbook = ExcelUtils.createWorkbook(headers, values, fileName); ExcelUtils.writeWorkbookToResponse(workbook, response, fileName); } } ``` 以上就是使用 SpringBoot 实现 Excel 导出的简单介绍,希望能对大家有所帮助。 ### 回答3: Spring Boot 是一个非常流行且强大的 Java Web 框架,它提供了许多方便的功能,其中之一是 Excel 导出。对于数据处理和报告生成方面,Excel 是一种非常流行的数据分析工具,因此在 Web 应用程序中使用 Excel 导出功能非常常见。 在 Spring Boot 中,实现 Excel 导出可以使用多种方式,最常见的是使用 Apache POI 库。Apache POI 是开源的 Java API,它允许开发人员创建、读取和写入 Microsoft Office 格式的文件,包括 Excel、Word 和 PowerPoint。 要实现 Excel 导出,首先需要在 Maven 中添加依赖项,其中包括 Apache POI 相关库的依赖项。例如: ```xml <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> ``` 一旦添加了依赖项,就可以开始编写导出功能的代码。通常可以编写一个 Controller,该 Controller 接受请求并生成 Excel 文件,然后将文件发送给客户端浏览器以下载。 在代码中,可以使用 POI 库创建 Workbook 对象,这是 Excel 文件的顶级容器。然后,可以创建一个 Sheet 对象,它代表一个 Excel 工作表。接下来,可以使用 POI 库的各种方法创建行、单元格和其他元素,并向工作表添加它们。 最后,需要将 Workbook 写入输出流并将其发送给客户端浏览器,以使用文件下载。这可以通过将 Workbook 保存到 ByteArrayOutputStream 中来完成,然后使用 HttpServletResponse 输出流将其发送回客户端浏览器。例如: ```java @GetMapping("/export") public void exportExcel(HttpServletResponse response) throws IOException { // 创建 Workbook 和 Sheet 对象 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); // 创建行和单元格,并将它们添加到工作表中 // 将 Workbook 写入 ByteArrayOutputStream ByteArrayOutputStream stream = new ByteArrayOutputStream(); workbook.write(stream); // 发送文件给客户端浏览器进行下载 response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment; filename=myfile.xlsx"); response.getOutputStream().write(stream.toByteArray()); response.flushBuffer(); } ``` 上面是一个简单的例子,用于说明如何使用 Spring Boot 和 Apache POI 实现 Excel 导出。实际应用中,可能需要更复杂的逻辑和更详细的操作来生成更复杂的表格和报告。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stalin_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值