最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot實現(xiàn)對接poi 導(dǎo)出excel折線圖

 更新時間:2025年10月21日 08:25:12   作者:IT界Tony哥  
在Spring Boot項目中使用Apache POI庫可以實現(xiàn)將數(shù)據(jù)導(dǎo)出為Excel并嵌入動態(tài)生成的折線圖,具有一定的參考價值,感興趣的可以了解一下

在Spring Boot項目中,使用Apache POI庫可以實現(xiàn)將數(shù)據(jù)導(dǎo)出為Excel并嵌入動態(tài)生成的折線圖。下面為您詳細(xì)介紹具體的實現(xiàn)步驟、核心代碼以及注意事項。

?? 環(huán)境準(zhǔn)備:添加依賴

首先,在您的pom.xml文件中添加必要的依賴。推薦使用較新版本的POI以確保功能穩(wěn)定。

<dependencies>
    <!-- Spring Boot Web 支持 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Apache POI 核心庫 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>5.2.3</version>
    </dependency>
    <!-- 處理 xlsx 格式的OOXML支持 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>5.2.3</version>
    </dependency>
    <!-- 可選的模式支持,某些圖表功能需要 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>4.1.2</version>
    </dependency>
</dependencies>

?? 定義數(shù)據(jù)模型

為了清晰管理圖表數(shù)據(jù)和在Excel中的位置,建議先定義兩個實體類。 ??1. 折線圖數(shù)據(jù)模型 (LineChart):?? 這個類用于封裝折線圖的所有元素,包括標(biāo)題、數(shù)據(jù)系列和X軸標(biāo)簽。

@Data
@Accessors(chain = true)
public class LineChart {
    /**
     * 圖表的名稱(主標(biāo)題)
     */
    private String chartTitle;
    /**
     * 每條折線的名稱(圖例)
     */
    private List<String> titleList;
    /**
     * 每條折線對應(yīng)的數(shù)據(jù)值
     */
    private List<List<Double>> dataList;
    /**
     * X軸的數(shù)據(jù)點標(biāo)簽(如:月份、季度)
     */
    private List<Object> xAxisList;
}

??2. 圖表位置模型 (ChartPosition):?? 這個類用于精確定義圖表在Excel工作表中的位置和大小。

@Data
@Accessors(chain = true)
public class ChartPosition {
    /** 圖表左上角所在的列索引(從0開始) */
    private int col1;
    /** 圖表左上角所在的行索引(從0開始) */
    private int row1;
    /** 圖表右下角所在的列索引 */
    private int col2;
    /** 圖表右下角所在的行索引 */
    private int row2;
    // 以下偏移量通??稍O(shè)為0
    private int dx1 = 0;
    private int dy1 = 0;
    private int dx2 = 0;
    private int dy2 = 0;
}

??? 核心工具類:創(chuàng)建折線圖

這是最關(guān)鍵的步驟,我們將創(chuàng)建一個工具類ChartUtils,其中的createLine方法負(fù)責(zé)在指定的Excel工作表中繪制折線圖。

import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.charts.*;
import org.apache.poi.xddf.usermodel.chart.*;

public class ChartUtils {
    
    public static void createLine(XSSFSheet sheet, ChartPosition chartPosition, LineChart lineChart) {
        // 1. 獲取數(shù)據(jù)
        List<Object> xAxisList = lineChart.getXAxisList();
        List<String> chartTitleList = lineChart.getTitleList();
        List<List<Double>> chartDataList = lineChart.getDataList();
        String chartTitle = lineChart.getChartTitle();

        // 2. 創(chuàng)建繪圖對象和圖表錨點
        XSSFDrawing drawing = sheet.createDrawingPatriarch();
        XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 
                                                     chartPosition.getCol1(), chartPosition.getRow1(), 
                                                     chartPosition.getCol2(), chartPosition.getRow2());
        // 3. 創(chuàng)建圖表并設(shè)置標(biāo)題
        XSSFChart chart = drawing.createChart(anchor);
        chart.setTitleText(chartTitle);
        chart.setTitleOverlay(false);

        // 4. 設(shè)置圖例位置
        XDDFChartLegend legend = chart.getOrAddLegend();
        legend.setPosition(LegendPosition.TOP);

        // 5. 創(chuàng)建坐標(biāo)軸
        XDDFCategoryAxis bottomAxis = chart.createCategoryAxis(AxisPosition.BOTTOM);
        XDDFValueAxis leftAxis = chart.createValueAxis(AxisPosition.LEFT);

        // 6. 準(zhǔn)備數(shù)據(jù)源
        // 6.1 X軸數(shù)據(jù)(類別)
        XDDFCategoryDataSource countries = XDDFDataSourcesFactory.fromArray(
                Arrays.copyOf(xAxisList.toArray(), xAxisList.size(), String[].class));
        // 6.2 創(chuàng)建折線圖數(shù)據(jù)對象
        XDDFLineChartData data = (XDDFLineChartData) chart.createData(ChartTypes.LINE, bottomAxis, leftAxis);

        // 7. 為每個數(shù)據(jù)系列創(chuàng)建折線
        for (int i = 0; i < chartDataList.size(); i++) {
            List<Double> values = chartDataList.get(i);
            // 創(chuàng)建Y軸數(shù)據(jù)源
            XDDFNumericalDataSource<Double> dataSource = XDDFDataSourcesFactory.fromArray(
                    values.toArray(new Double[0]));
            
            // 將數(shù)據(jù)系列添加到圖表
            XDDFLineChartData.Series series = (XDDFLineChartData.Series) data.addSeries(countries, dataSource);
            series.setTitle(chartTitleList.get(i), null);
            series.setSmooth(false); // 設(shè)置為折線,非平滑曲線
            series.setMarkerSize((short) 2); // 設(shè)置數(shù)據(jù)點標(biāo)記的大小

            // (可選)特殊樣式處理,例如為"警戒值"設(shè)置虛線
            if ("警戒值".equals(chartTitleList.get(i))) {
                XDDFLineProperties lineProps = new XDDFLineProperties();
                lineProps.setPresetDash(new XDDFPresetLineDash(PresetLineDash.DOT));
                series.setLineProperties(lineProps);
            }
        }

        // 8. 繪制圖表
        chart.plot(data);
    }
}

?? 業(yè)務(wù)層整合與導(dǎo)出接口

最后,在Spring Boot的Controller中,將數(shù)據(jù)導(dǎo)出和圖表生成功能整合起來,提供一個HTTP接口供前端調(diào)用。

@RestController
public class ExcelExportController {

    @GetMapping("/export/excel-with-chart")
    public void exportExcelWithChart(HttpServletResponse response) throws IOException {
        // 1. 設(shè)置響應(yīng)頭,告訴瀏覽器這是一個要下載的Excel文件
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-Disposition", "attachment; filename="data_with_chart.xlsx"");
        
        // 2. 創(chuàng)建工作簿和工作表
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("數(shù)據(jù)報表");
        
        // 3. (可選)向工作表填充數(shù)據(jù)行...
        // 例如:createDataRows(sheet);
        
        // 4. 準(zhǔn)備折線圖數(shù)據(jù)
        LineChart lineChart = new LineChart()
                .setChartTitle("銷售趨勢圖")
                .setXAxisList(Arrays.asList("1月", "2月", "3月", "4月", "5月"))
                .setTitleList(Arrays.asList("產(chǎn)品A", "產(chǎn)品B", "警戒值"))
                .setDataList(Arrays.asList(
                        Arrays.asList(120.0, 150.0, 180.0, 160.0, 200.0),
                        Arrays.asList(90.0, 120.0, 140.0, 130.0, 150.0),
                        Arrays.asList(150.0, 150.0, 150.0, 150.0, 150.0) // 警戒線
                ));
        
        // 5. 定義圖表位置(例如:從第0行第0列開始,到第15行第10列結(jié)束)
        ChartPosition position = new ChartPosition()
                .setCol1(0).setRow1(10).setCol2(10).setRow2(25);
        
        // 6. 調(diào)用工具類創(chuàng)建折線圖
        ChartUtils.createLine(sheet, position, lineChart);
        
        // 7. 將工作簿寫入HTTP響應(yīng)流
        OutputStream out = response.getOutputStream();
        workbook.write(out);
        workbook.close();
        out.flush();
    }
}

?? 關(guān)鍵要點與優(yōu)化建議

在實際使用中,請注意以下幾點以確保最佳效果:

  • ??版本兼容性??:確保所有POI相關(guān)依賴(如poi, poi-ooxml, poi-ooxml-schemas)的版本一致,以避免潛在的沖突。
  • ??圖表位置規(guī)劃??:在插入圖表前,最好先規(guī)劃好數(shù)據(jù)表格的布局。ChartPosition中的行索引應(yīng)考慮表格已占用的行數(shù),防止圖表覆蓋數(shù)據(jù)。
  • ??大數(shù)據(jù)量優(yōu)化??:當(dāng)需要導(dǎo)出的數(shù)據(jù)量非常大時,建議使用SXSSFWorkbook來代替XSSFWorkbook,它以流式處理方式工作,可以顯著降低內(nèi)存消耗。
  • ??前端調(diào)用??:前端Vue或React應(yīng)用可以使用axios等庫調(diào)用此導(dǎo)出接口,并通過處理返回的Blob對象實現(xiàn)文件下載。

通過以上步驟,您就可以在Spring Boot應(yīng)用中靈活地導(dǎo)出包含專業(yè)折線圖的Excel報表了。這套方法可以根據(jù)實際業(yè)務(wù)需求,輕松調(diào)整以生成柱狀圖或餅圖等其他圖表類型。

到此這篇關(guān)于springboot實現(xiàn)對接poi 導(dǎo)出excel折線圖的文章就介紹到這了,更多相關(guān)springboot 導(dǎo)出excel折線圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • rabbitmq五種模式詳解(含實現(xiàn)代碼)

    rabbitmq五種模式詳解(含實現(xiàn)代碼)

    這篇文章主要介紹了rabbitmq五種模式詳解(含實現(xiàn)代碼),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 解決FeignClient發(fā)送post請求異常的問題

    解決FeignClient發(fā)送post請求異常的問題

    這篇文章主要介紹了FeignClient發(fā)送post請求異常的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java 的 Condition 接口與等待通知機制詳解

    Java 的 Condition 接口與等待通知機制詳解

    在 Java 并發(fā)編程里,實現(xiàn)線程間的協(xié)作與同步是極為關(guān)鍵的任務(wù),本文將深入探究Condition接口及其背后的等待通知機制,感興趣的朋友一起看看吧
    2025-05-05
  • Java 中 ObjectMapper用法(一個簡單 Demo 講清楚)

    Java 中 ObjectMapper用法(一個簡單 Demo 講清楚)

    ObjectMapper是Jackson庫中的一個主要類,它負(fù)責(zé)將Java對象轉(zhuǎn)換為 JSON格式(序列化),或?qū)SON數(shù)據(jù)轉(zhuǎn)換為Java 對象(反序列化),本文給大家介紹Java 中 ObjectMapper用法,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • java之Thread不捕獲異常默認(rèn)處理邏輯

    java之Thread不捕獲異常默認(rèn)處理邏輯

    這篇文章主要介紹了java之Thread不捕獲異常默認(rèn)處理邏輯,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java實戰(zhàn)項目 健身管理系統(tǒng)

    Java實戰(zhàn)項目 健身管理系統(tǒng)

    本文是一個Java語言編寫的實戰(zhàn)項目,是一個健身管理系統(tǒng),主要用到了ssm+springboot等技術(shù),技術(shù)含量筆記高,感興趣的童鞋跟著小編往下看吧
    2021-09-09
  • Mybatis Plus Join使用方法示例詳解

    Mybatis Plus Join使用方法示例詳解

    這篇文章主要介紹了Mybatis Plus Join使用方法示例詳解,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友一起看看吧
    2025-06-06
  • hibernate-validator如何使用校驗框架

    hibernate-validator如何使用校驗框架

    高效、合理的使用hibernate-validator校驗框架可以提高程序的可讀性,以及減少不必要的代碼邏輯,本文主要介紹了hibernate-validator如何使用校驗框架,感興趣的可以了解一下
    2022-04-04
  • Java遍歷Json的簡單實例

    Java遍歷Json的簡單實例

    這篇文章主要介紹了Java遍歷Json的簡單實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • java?spring?validation?自動、手動校驗

    java?spring?validation?自動、手動校驗

    HibernateValidator簡化了Java開發(fā)中的參數(shù)校驗過程,提供自動和手動兩種校驗方式,通過引入相關(guān)依賴并使用@Validated注解,可以實現(xiàn)自動校驗,手動校驗則需要使用ValidatorUtils類,此方法有效減少代碼重復(fù),提高開發(fā)效率
    2024-09-09

最新評論

阿坝| 杭锦旗| 昭觉县| 泌阳县| 潍坊市| 临桂县| 东至县| 云梦县| 镇康县| 阿合奇县| 南阳市| 博湖县| 健康| 北京市| 文水县| 正蓝旗| 谢通门县| 梅州市| 武清区| 衡阳市| 卢氏县| 霸州市| 军事| 东平县| 盐城市| 吕梁市| 高邑县| 漠河县| 日喀则市| 赤峰市| 大厂| 城步| 秦皇岛市| 河西区| 霍邱县| 和龙市| 凤台县| 绩溪县| 富锦市| 车致| 镇安县|