阿裡EasyExcel快速導出demo

来源:https://www.cnblogs.com/ruosu0909/archive/2023/08/17/17638076.html
-Advertisement-
Play Games

### 1. json.load(json_data)與json.dump(python_data) json.load()用來將讀取json文件,json.dump()用來將數據寫入json文件 ### 2. json.loads()與json.dumps() - json.dumps 將 Pyt ...


引入阿裡easyExcel依賴

       <!-- easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.ehcache</groupId>
                    <artifactId>ehcache</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

自定義的阿裡easyexcel攔截器方法


import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import com.jerry.util.ExcelUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URL;


public class SheetWriteHandlerUtil implements SheetWriteHandler {

    private String title;
    private String[] header;
    private String imageurl;
    private String sheetName;
    private final Log log = LogFactory.getLog(getClass());

    public SheetWriteHandlerUtil(String title, String[] header, String imageurl, String sheetName) {
        this.title = title;
        this.header = header;
        this.imageurl = imageurl;
        this.sheetName = sheetName;
    }
    public SheetWriteHandlerUtil(String sheetName) {
        this.sheetName = sheetName;
    }


    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        Workbook workbook = writeWorkbookHolder.getWorkbook();
        Sheet sheet = workbook.getSheetAt(0);
        if (StringUtils.isNotEmpty(sheetName)){
            writeWorkbookHolder.getCachedWorkbook().setSheetName(0, sheetName);
        }
        if (StringUtils.isNotEmpty(title)){
            //設置標題
            Row row1 = sheet.createRow(0);
            row1.setHeight((short) 800);
            Cell cell = row1.createCell(0);
            //設置單元格內容
            cell.setCellValue(title);
            CellStyle cellStyle = workbook.createCellStyle();
            cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
            cellStyle.setAlignment(HorizontalAlignment.LEFT);
            Font font = workbook.createFont();
            font.setBold(true);
            font.setFontHeight((short) 400);
            cellStyle.setFont(font);
            cell.setCellStyle(cellStyle);
        }
        if (header != null){
            // 第一行大標題占位設置
            sheet.addMergedRegionUnsafe(new CellRangeAddress(0, 0, 0, header.length-1));
        }
        if(StringUtils.isNotEmpty(imageurl)){
            try {
                imagewrite(writeWorkbookHolder,writeSheetHolder,imageurl);
            } catch (IOException e) {
                e.printStackTrace();
                log.error("easyexcel攔截器圖片流處理出錯"+ e.getMessage());
            }
        }

    }
    public void imagewrite(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder,String imageurl) throws IOException {
        Workbook workbook = writeWorkbookHolder.getWorkbook();
        Sheet sheet = workbook.getSheetAt(0);
        try (ByteArrayOutputStream picOut = new ByteArrayOutputStream()) {
            //讀圖片並寫入流
            BufferedImage bufferedImage = ImageIO.read(new URL(imageurl));
            ImageIO.write(bufferedImage, "png", picOut);
            ExcelUtils.addPictureToSheet(sheet, 3, 3, 0,0,workbook.addPicture(picOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG),1.3,6.25);
        } catch (Exception e) {
            log.debug("", e);
        }

    }
}

自定義的EasyExcelUtils方法類


import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.ss.usermodel.*;

import java.io.ByteArrayOutputStream;
import java.util.*;

/**
 * @author wangchaofan-n
 */
public class EasyExcelUtils {

    private final Log log = LogFactory.getLog(getClass());

    /**
     *
     * @param list  數據
     * @param title 標題
     * @param header 動態列
     */
    public static void exportDetailLeave(List<Map<String,Object>> list, String title, String[] header,ByteArrayOutputStream out,String imageurl) {
        // 標題樣式
        WriteCellStyle headWriteCellStyle = getHeadStyle();
        // 這個策略是 頭是頭的樣式 內容是內容的樣式 其他的策略可以自己實現
        HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                new HorizontalCellStyleStrategy(headWriteCellStyle, new WriteCellStyle());
        EasyExcel.write(out)
                // 第一行大標題樣式設置
                .registerWriteHandler(new SheetWriteHandlerUtil(title,header, imageurl, null))
                //設置預設樣式及寫入頭信息開始的行數
                .useDefaultStyle(true).relativeHeadRowIndex(1)
                // 表頭、內容樣式設置
                .registerWriteHandler(horizontalCellStyleStrategy)
                // 統一列寬,如需設置自動列寬則new LongestMatchColumnWidthStyleStrategy()
                //.registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .sheet(title)
                // 這裡放入動態頭
                .head(head(header))
                // 當然這裡數據也可以用 List<List<String>> 去傳入
                .doWrite(detail(list));

    }

    private static List<List<Object>> detail(List<Map<String, Object>> mapList) {
        List<List<Object>> list = new ArrayList<>();
        for (Map<String, Object> map : mapList) {
            List<Object> objectList = new ArrayList<>();
            Set<Map.Entry<String,Object>> entrySet = map.entrySet();
            for (Map.Entry<String,Object> entry :entrySet){
                objectList.add(entry.getValue());
            }
            list.add(objectList);
        }
        return list;
    }


    /**動態頭傳入*/
    public static List<List<String>> head(String[] header) {
        List<String> head0 = null;
        List<List<String>> list = new LinkedList<>();
        for (String h : header) {
            head0 = new LinkedList<>();
            head0.add(h);
            list.add(head0);
        }
        return list;
    }


    public static WriteCellStyle getHeadStyle(){
        // 頭的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景顏色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        // 字體
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontName("黑體");//設置字體名字
        headWriteFont.setFontHeightInPoints((short)15);//設置字體大小
        headWriteFont.setBold(true);//字體加粗
        headWriteCellStyle.setWriteFont(headWriteFont); //在樣式用應用設置的字體;
        // 樣式
        headWriteCellStyle.setBorderBottom(BorderStyle.THIN);//設置底邊框;
        headWriteCellStyle.setBottomBorderColor((short) 0);//設置底邊框顏色;
        headWriteCellStyle.setBorderLeft(BorderStyle.THIN);  //設置左邊框;
        headWriteCellStyle.setLeftBorderColor((short) 0);//設置左邊框顏色;
        headWriteCellStyle.setBorderRight(BorderStyle.THIN);//設置右邊框;
        headWriteCellStyle.setRightBorderColor((short) 0);//設置右邊框顏色;
        headWriteCellStyle.setBorderTop(BorderStyle.THIN);//設置頂邊框;
        headWriteCellStyle.setTopBorderColor((short) 0); //設置頂邊框顏色;
        headWriteCellStyle.setWrapped(true);  //設置自動換行;
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//設置水平對齊的樣式為居中對齊;
        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);  //設置垂直對齊的樣式為居中對齊;
        //headWriteCellStyle.setShrinkToFit(true);//設置文本收縮至合適

        return headWriteCellStyle;
    }




}

調用示例

            ByteArrayOutputStream out = new ByteArrayOutputStream()
            // 此處填寫表的列名
            String[] heads = new String[]{"列名1","學習","題乾","選項","答案","解析"};
            // 此處為查詢資料庫語句
            List<Map<String,Object>> list = nmgtkmanagemapper.querytkinfobystbhs(stbhs);
            // 最後一位傳參為電子章地址 若需要可傳
            EasyExcelUtils.exportDetailLeave(list,"表格的大標題",heads,out,null);


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • # C++ 函數參數匹配 ## 1 單個參數匹配 ```C++ void f(); //f1 void f(int); //f2 void f(int, int); //f3 void f(double, double=3.14);//f4 int main() { f(5.6); //調用f4 r ...
  • > 本篇文章結合筆者的經歷,介紹一種通過**重寫QTreeView繪製事件**,使用**QPainter**來實現好看的列表的方式。 ## 導語 Hi🐇,各位讀者朋友,大家好。相信大家在日常的工作中,經常會接觸到**QTreeView**這個控制項吧! **QTreeView**,顧名思義,就是一種 ...
  • 預設你已經看了我的Mybatis-Plus+Mysql的教程,現在有了一個簡單的項目如下(之前的教程: https://www.cnblogs.com/leafstar/p/17638741.html) 1.下載nacao,我這裡下的是2.1.0版本 提供一下我用的版本( 鏈接:https://pa ...
  • 本文通過簡單的示例代碼和說明,讓讀者能夠瞭解Mybatis-Plus+Mysql的簡單使用 必須說明的是,本文有部分內容是為了後續的微服務寫的,所以如果只想用Mybatis-Plus的話,直接使用bank1項目即可 1.新建父項目,選用spring initializr即可,可以刪除其他文件,僅僅留 ...
  • ![](https://cdn.nlark.com/yuque/0/2023/jpeg/28753938/1691067189459-f51a48da-0da6-4e6e-aeee-75b39662cd20.jpeg) ## 一、Lambda表達式 > Lambda 是一個匿名函數,我們可以把 La ...
  • 關於票據系統設計在之前的博客中也聊過,今天做一個補充 1、架構 票據系統主要就是和票交所進行交互,圍繞這一核心,我們把系統劃分為三大部分,分別是:票據網關服務、票據業務服務、票據庫存服務。 網關服務:對接票交所,負責和票交所的交互,主要是收發報文。 業務服務:負責票據業務的處理,比如出票、背書、貼現 ...
  • # 【狂神說Java】Java零基礎學習筆記-JavaSE總結 ## JavaSE總結: ![image](https://img2023.cnblogs.com/blog/3231511/202308/3231511-20230817171925456-1307925972.jpg) ## 🎉� ...
  • # 【狂神說Java】Java零基礎學習筆記-異常 ## 異常01:Error和Exception ### 什麼是異常 - 實際工作中,遇到的情況不可能是非常完美的。比如:你寫的某個模塊,用戶輸入不一定符合你的要求、你的程式要打開某個文件,這個文件可能不存在或者文件格式不對,你要讀取資料庫的數據,數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...