apache-poi导出excel数据

excel导出

自动设置宽度,设置标题框,设置数据边框。

excel导出

  1. 添加依赖
 <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.2</version>
        </dependency>
  1. 编写工具类
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Excel导出
 *
 */
@Slf4j
public class MyExcelExportUtils {

    /**
     * 列的最大宽度
     */
    private static final int COLUMN_MAX_WIDTH = 10240;

    /**
     * 列的最小宽度
     */
    private static final int COLUMN_MIN_WIDTH = (int) (2048);


    /**
     * 导出Excel
     *
     * @param excelExports excel集合
     * @param fileName     文件名
     * @param response     响应对象
     * @throws IOException
     */
    public static void exportExcel(List<ExcelExport> excelExports, String fileName, HttpServletResponse response)
            throws IOException {
//        ServletOutputStream servletOutputStream = null;
        try {
//            servletOutputStream = response.getOutputStream();
            response.setContentType("multipart/form-data");
            response.setCharacterEncoding("utf-8");
            if (null == fileName || fileName.trim().equals("")) { //如果不设置文件名,则默认
                fileName = new String((fileName + new SimpleDateFormat("yyyy-MM-dd").format(new Date())).getBytes(), StandardCharsets.UTF_8);
            }
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
            Workbook workbook = new XSSFWorkbook();

            // 创建一个单元格样式
            CellStyle titleCellStyle = workbook.createCellStyle();
            titleCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//25%灰色
            titleCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

            titleCellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
            titleCellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
            titleCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
            titleCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
            // 设置边框样式为细线
            titleCellStyle.setBorderBottom(BorderStyle.THIN);
            titleCellStyle.setBorderTop(BorderStyle.THIN);
            titleCellStyle.setBorderLeft(BorderStyle.THIN);
            titleCellStyle.setBorderRight(BorderStyle.THIN);
            titleCellStyle.setAlignment(HorizontalAlignment.CENTER);
            titleCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

            // 创建一个单元格样式
            CellStyle dataCellStyle = workbook.createCellStyle();
            dataCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
            dataCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
            // 设置边框样式为细线
            dataCellStyle.setBorderLeft(BorderStyle.THIN);
            dataCellStyle.setBorderRight(BorderStyle.THIN);

            // 创建一个单元格样式
            CellStyle lastCellStyle = workbook.createCellStyle();
            lastCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
            lastCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
            lastCellStyle.setBorderBottom(BorderStyle.THIN);
            // 设置边框样式为细线
            lastCellStyle.setBorderLeft(BorderStyle.THIN);
            lastCellStyle.setBorderRight(BorderStyle.THIN);
            lastCellStyle.setBorderBottom(BorderStyle.THIN);

            for (int i = 0; i < excelExports.size(); i++) {
                ExcelExport excelExport = excelExports.get(i);
                List<String> headList = excelExport.getTitle();
                String sheetName = excelExport.getSheetName();
                List<LinkedHashMap<String, Object>> dataList = excelExport.getDataList();
                Sheet sheet = workbook.createSheet(sheetName);
                // 创建数据行
                Row titleRow = sheet.createRow(0);
                titleRow.setHeightInPoints(500 / 20);
                for (int j = 0; j < headList.size(); j++) {
                    Cell cell1 = titleRow.createCell(j);
                    cell1.setCellStyle(titleCellStyle);
                    cell1.setCellValue(headList.get(j));
                }

                Map<String, Integer> columnWidthMap = new HashMap<>();

                for (int k = 0; k < dataList.size(); k++) {
                    Row dataRow = sheet.createRow(k + 1);
                    for (int j = 0; j < headList.size(); j++) {
                        String title = headList.get(j);
                        LinkedHashMap<String, Object> stringObjectLinkedHashMap = dataList.get(k);
                        Object value = stringObjectLinkedHashMap.get(title);
                        Cell cell = dataRow.createCell(j);
                        if (k == (dataList.size() - 1)) {
                            cell.setCellStyle(lastCellStyle);
                        } else {
                            cell.setCellStyle(dataCellStyle);
                        }
                        cell.setCellValue(value == null ? null : value.toString());

                        if (null != value) {
                            // 计算内容的字符长度
                            int charLength = value.toString().length();

                            // 设置一个最大宽度(以字符为单位)
                            int maxWidthInChars = 0;

                            // 根据内容长度和最大宽度计算列宽
                            // 注意:Excel的列宽单位是字符宽度的1/256,因此需要将字符数乘以256
                            // 但由于内容可能包含非单字节字符(如中文),这里简化处理,只考虑ASCII字符宽度
                            // 如果需要更精确的处理,可以考虑使用FontMetrics来计算实际渲染宽度
                            int columnWidth = (int) (Math.max(charLength, maxWidthInChars) * 256);

                            if (columnWidthMap.containsKey(title)) {
                                Integer width = columnWidthMap.get(title);
                                if (width < columnWidth) {
                                    columnWidthMap.put(title, columnWidth);
                                }
                            } else {
                                columnWidthMap.put(title, columnWidth);
                            }
                        }
                    }
                }

                for (int j = 0; j < headList.size(); j++) {
                    String title = headList.get(j);
                    int width = columnWidthMap.getOrDefault(title,COLUMN_MIN_WIDTH);
                    if (width > COLUMN_MAX_WIDTH) { //防止太长
                        width = COLUMN_MAX_WIDTH;
                    } else if (width < COLUMN_MIN_WIDTH) {
                        width = COLUMN_MIN_WIDTH;
                    }
                    sheet.setColumnWidth(j, width);
                    log.info("列:" + j + ",标题:" + title + ",宽度:" + width);
//                    sheet.autoSizeColumn(j);//自动行宽
                }
            }
            workbook.write(response.getOutputStream());
            workbook.close();
//            servletOutputStream.flush();
        } catch (IOException e) {
            throw new IOException(e.toString());
        } finally {

        }
    }

    public static void exportExcel2(List<String> headList, List<Object[]> dataList, String sheetName, String fileName, HttpServletResponse response)
            throws IOException {
        try {
            response.setContentType("multipart/form-data");
            response.setCharacterEncoding("utf-8");
            if (null == fileName || fileName.trim().equals("")) { //如果不设置文件名,则默认
                fileName = new String((fileName + new SimpleDateFormat("yyyy-MM-dd").format(new Date())).getBytes(), StandardCharsets.UTF_8);
            }
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
            Workbook workbook = new XSSFWorkbook();

            // 创建一个单元格样式
            CellStyle titleCellStyle = workbook.createCellStyle();
            titleCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());//25%灰色
            titleCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

            titleCellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
            titleCellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
            titleCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
            titleCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
            // 设置边框样式为细线
            titleCellStyle.setBorderBottom(BorderStyle.THIN);
            titleCellStyle.setBorderTop(BorderStyle.THIN);
            titleCellStyle.setBorderLeft(BorderStyle.THIN);
            titleCellStyle.setBorderRight(BorderStyle.THIN);
            titleCellStyle.setAlignment(HorizontalAlignment.CENTER);
            titleCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

            // 创建一个单元格样式
            CellStyle dataCellStyle = workbook.createCellStyle();
            dataCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
            dataCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
            // 设置边框样式为细线
            dataCellStyle.setBorderLeft(BorderStyle.THIN);
            dataCellStyle.setBorderRight(BorderStyle.THIN);

            // 创建一个单元格样式
            CellStyle lastCellStyle = workbook.createCellStyle();
            lastCellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
            lastCellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
            lastCellStyle.setBorderBottom(BorderStyle.THIN);
            // 设置边框样式为细线
            lastCellStyle.setBorderLeft(BorderStyle.THIN);
            lastCellStyle.setBorderRight(BorderStyle.THIN);
            lastCellStyle.setBorderBottom(BorderStyle.THIN);


            Sheet sheet = workbook.createSheet(sheetName);
            // 创建数据行
            Row titleRow = sheet.createRow(0);
            titleRow.setHeightInPoints(500 / 20);
//                titleRow.setHeight((short)500);
            for (int j = 0; j < headList.size(); j++) {
                Cell cell1 = titleRow.createCell(j);
                cell1.setCellStyle(titleCellStyle);
                cell1.setCellValue(headList.get(j));
            }

            Map<String, Integer> columnWidthMap = new HashMap<>();

            for (int k = 0; k < dataList.size(); k++) {
                Row dataRow = sheet.createRow(k + 1);
                for (int j = 0; j < headList.size(); j++) {
                    String title = headList.get(j);
//                    LinkedHashMap<String, Object> stringObjectLinkedHashMap = dataList.get(k);
//                    Object value = stringObjectLinkedHashMap.get(title);
                    Object value = dataList.get(k)[j];
                    Cell cell = dataRow.createCell(j);
                    if (k == (dataList.size() - 1)) {
                        cell.setCellStyle(lastCellStyle);
                    } else {
                        cell.setCellStyle(dataCellStyle);
                    }
                    cell.setCellValue(value == null ? null : value.toString());

                    if (null != value) {
                        // 计算内容的字符长度
                        int charLength = value.toString().length();

                        // 设置一个最大宽度(以字符为单位)
                        int maxWidthInChars = 0;

                        // 根据内容长度和最大宽度计算列宽
                        // 注意:Excel的列宽单位是字符宽度的1/256,因此需要将字符数乘以256
                        // 但由于内容可能包含非单字节字符(如中文),这里简化处理,只考虑ASCII字符宽度
                        // 如果需要更精确的处理,可以考虑使用FontMetrics来计算实际渲染宽度
                        int columnWidth = (int) (Math.max(charLength, maxWidthInChars) * 256);

                        if (columnWidthMap.containsKey(title)) {
                            Integer width = columnWidthMap.get(title);
                            if (width < columnWidth) {
                                columnWidthMap.put(title, columnWidth);
                            }
                        } else {
                            columnWidthMap.put(title, columnWidth);
                        }
                    }
                }
            }

            for (int j = 0; j < headList.size(); j++) {
                String title = headList.get(j);
                int width = columnWidthMap.getOrDefault(title,COLUMN_MIN_WIDTH);
                if (width > COLUMN_MAX_WIDTH) { //防止太长
                    width = COLUMN_MAX_WIDTH;
                } else if (width < COLUMN_MIN_WIDTH) {
                    width = COLUMN_MIN_WIDTH;
                }
                sheet.setColumnWidth(j, width);
//                log.info("列:" + j + ",宽度:" + width);
                log.info("列:" + j + ",标题:" + title + ",宽度:" + width);
//                    sheet.autoSizeColumn(j);//自动行宽
            }
            workbook.write(response.getOutputStream());
            workbook.close();
//            servletOutputStream.flush();
        } catch (IOException e) {
            throw new IOException(e.toString());
        } finally {
//            if (servletOutputStream != null) {
//                servletOutputStream.close();
//            }
        }


    }


    /**
     * 导出Excel
     *
     * @param dataList  数据集合
     * @param sheetName Excel工作表名称
     * @param fileName  文件名
     * @param response  响应对象
     * @throws IOException
     */
    public static void exportExcel3(List<ColumnData> dataList, String sheetName, String fileName, HttpServletResponse response)
            throws IOException {
        List<String> headList = new ArrayList<>();
        int maxColumn = 0;
        for (ColumnData columnData : dataList) {
            headList.add(columnData.getTitle());
            maxColumn = Math.max(maxColumn, columnData.getValues().size());
        }

        int titleLength = headList.size();
        List<Object[]> dataList2 = new ArrayList<>();
        for (int i = 0; i < maxColumn; i++) {
            Object[] objects = new Object[titleLength];
            for (int j = 0; j < titleLength; j++) {
                ColumnData columnData = dataList.get(j);
                Object obj = getDataFromColumnData(columnData, i);
                objects[j] = obj;
            }
            dataList2.add(objects);
        }
        exportExcel2(headList, dataList2, sheetName, fileName, response);
    }

    private static Object getDataFromColumnData(ColumnData columnData, int index) {
        List values = columnData.getValues();
        if (index < values.size()) {
            return values.get(index);
        }
        return null;
    }
}

public class ColumnData {

    /**
     * 标题
     */
    private String title;

    /**
     * 竖直的数据
     */
    private List values;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public List getValues() {
        return values;
    }

    public void setValues(List values) {
        this.values = values;
    }
}

@Setter
@Getter
public class ExcelExport {

    /**
     * 页面名称
     */
    private String sheetName;

    /**
     * 标题
     */
    private List<String> title;

    /**
     * 数据内容
     */
    List<LinkedHashMap<String, Object>> dataList;
}

  1. 导出示例
@GetMapping("/exportExcel2")
    public void exportExcel2(HttpServletRequest request, HttpServletResponse response) throws IOException {
        ExcelExport excelExport = new ExcelExport();
        excelExport.setSheetName("测试");
        excelExport.setTitle(Arrays.asList("用户名", "地址"));
        List<LinkedHashMap<String, Object>> dataList = new ArrayList();
        {
            LinkedHashMap<String, Object> map = new LinkedHashMap();
            map.put("用户名","test1");
            map.put("地址","长安");
            dataList.add(map);
        }
        {
            LinkedHashMap<String, Object> map = new LinkedHashMap();
            map.put("用户名","test2");
            map.put("地址","静海");
            dataList.add(map);
        }
        excelExport.setDataList(dataList);
        MyExcelExportUtils.exportExcel(Arrays.asList(excelExport), "test", response);
    }

运行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/967502.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

10 FastAPI 的自动文档

FastAPI 是一个功能强大且易于使用的 Web 框架&#xff0c;它的最大亮点之一就是内置的 自动文档生成 功能。通过集成 Swagger UI 和 ReDoc&#xff0c;FastAPI 可以自动为我们的 API 生成交互式文档。这不仅使得开发者能够更快速地了解和测试 API&#xff0c;还能够为前端开发…

微软AI研究团队推出LLaVA-Rad:轻量级开源基础模型,助力先进临床放射学报告生成

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

mysql8.0使用MHA实现高可用

一、MHA 介绍 MHA&#xff08;Master HA&#xff09;是一款开源的 MySQL 的高可用程序&#xff0c;它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控到 master 节点故障时&#xff0c;会提升其中拥有最新数据的 slave 节点成为新的master 节点&…

D3实现站点路线图demo分享

分享通过D3实现的站点路线分布图demo&#xff0c;后续会继续更新其他功能。 功能点 点位弹窗 效果图如下&#xff1a; 轨迹高亮 效果图如下&#xff1a; 添加路线箭头 箭头展示逻辑&#xff1a;根据高速路线最后两个点位&#xff0c;计算得出箭头的点位 效果图如下&#x…

【系统架构设计师】操作系统 ③ ( 存储管理 | 页式存储弊端 - 段式存储引入 | 段式存储 | 段表 | 段表结构 | 逻辑地址 的 合法段地址判断 )

文章目录 一、页式存储弊端 - 段式存储引入1、页式存储弊端 - 内存碎片2、页式存储弊端 - 逻辑结构不匹配3、段式存储引入 二、段式存储 简介1、段式存储2、段表3、段表 结构4、段内地址 / 段内偏移5、段式存储 优缺点6、段式存储 与 页式存储 对比 三、逻辑地址 的 合法段地址…

物联网软件开发与应用方向应该怎样学习,学习哪些内容,就业方向是怎样?(文末领取整套学习视频,课件)物联网硬件开发与嵌入式系统

随着物联网技术的飞速发展&#xff0c;物联网软件开发与应用方向成为了众多开发者关注的焦点。那么&#xff0c;如何在这个领域中脱颖而出呢&#xff1f;本文将为你提供一份详细的学习指南&#xff0c;帮助你从零开始&#xff0c;逐步掌握物联网软件开发与应用的核心技能。 一…

Linux——基础命令1

$&#xff1a;普通用户 #&#xff1a;超级用户 cd 切换目录 cd 目录 &#xff08;进入目录&#xff09; cd ../ &#xff08;返回上一级目录&#xff09; cd ~ &#xff08;切换到当前用户的家目录&#xff09; cd - &#xff08;返回上次目录&#xff09; pwd 输出当前目录…

OpenFeign远程调用返回的是List<T>类型的数据

在使用 OpenFeign 进行远程调用时&#xff0c;如果接口返回的是 List 类型的数据&#xff0c;可以通过以下方式处理&#xff1a; 直接定义返回类型为List Feign 默认支持 JSON 序列化/反序列化&#xff0c;如果服务端返回的是 List的JSON格式数据&#xff0c;可以直接在 Feig…

向量数据库简单对比

文章目录 一、Chroma二、Pinecone/腾讯云VectorDB/VikingDB三、redis四、Elasticsearch五、Milvus六、Qdrant七、Weaviate八、Faiss 一、Chroma 官方地址&#xff1a; https://www.trychroma.com/优点 ①简单&#xff0c;非常简单构建服务。 ②此外&#xff0c;Chroma还具有自…

字符指针、数组指针和函数指针

1. 字符指针变量 1.1 简单例子 字符指针 char* 在C语言中主要由两种用法&#xff1a; 1.用于存放一个字符变量的地址。 2.用字符指针接收一个字符串。 这里并不是将整个字符串的地址存入 pstr 指针&#xff0c;指针变量 pstr 中存放的是常量字符串的首字符 h 的地址。 以一个…

【Linux网络编程】之守护进程

【Linux网络编程】之守护进程 进程组进程组的概念组长进程 会话会话的概念会话ID 控制终端控制终端的概念控制终端的作用会话、终端、bash三者的关系 前台进程与后台进程概念特点查看当前终端的后台进程前台进程与后台进程的切换 作业控制相关概念作业状态&#xff08;一般指后…

JS宏进阶:XMLHttpRequest对象

一、概述 XMLHttpRequest简称XHR&#xff0c;它是一个可以在JavaScript中使用的对象&#xff0c;用于在后台与服务器交换数据&#xff0c;实现页面的局部更新&#xff0c;而无需重新加载整个页面&#xff0c;也是Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;…

怎么查看电脑显存大小(查看电脑配置)

这里提供一个简单的方法查看 winr打开cmd 终端输入dxdiag进入DirectX 点击显示查看设备的显示内存&#xff08;VRAM&#xff09; 用这个方法查看电脑配置和显存是比较方便的 dxdiag功能 Dxdiag是Windows的DirectX诊断工具&#xff0c;其主要作用包括但不限于以下几点&#…

优惠券平台(一):基于责任链模式创建优惠券模板

前景概要 系统的主要实现是优惠券的相关业务&#xff0c;所以对于用户管理的实现我们简单用拦截器在触发接口前创建一个单一用户。 // 用户属于非核心功能&#xff0c;这里先通过模拟的形式代替。后续如果需要后管展示&#xff0c;会重构该代码 UserInfoDTO userInfoDTO new…

【机器学习】数据预处理之scikit-learn的Scaler与自定义Scaler类进行数据归一化

scikit-learn的Scaler数据归一化 一、摘要二、训练数据集和测试数据集的归一化处理原则三、scikit-learn中的Scalar类及示例四、自定义StandardScaler类进行数据归一化处理五、小结 一、摘要 本文主要介绍了scikit-learn中Scaler的使用方法&#xff0c;特别强调了数据归一化在…

机器学习中过拟合和欠拟合问题处理方法总结

目录 一、背景二、过拟合(Overfitting)2.1 基本概念2.2 过拟合4个最主要的特征2.3 防止过拟合的11个有效方法 三、欠拟合&#xff08;Underfitting&#xff09;3.1 基本概念3.2 欠拟合的4个特征3.3 防止欠拟合的11个有效方法 四、总结五、参考资料 一、背景 在机器学习模型训练…

ABP框架9——自定义拦截器的实现与使用

一、AOP编程 AOP定义:面向切片编程&#xff0c;着重强调功能&#xff0c;将功能从业务逻辑分离出来。AOP使用场景&#xff1a;处理通用的、与业务逻辑无关的功能&#xff08;如日志记录、性能监控、事务管理等&#xff09;拦截器:拦截方法调用并添加额外的行为&#xff0c;比如…

基于YoloV11和驱动级鼠标模拟实现Ai自瞄

本文将围绕基于 YoloV11 和驱动级鼠标实现 FPS 游戏 AI 自瞄展开阐述。 需要着重强调的是&#xff0c;本文内容仅用于学术研究和技术学习目的。严禁任何个人或组织将文中所提及的技术、方法及思路应用于违法行为&#xff0c;包括但不限于在各类游戏中实施作弊等违规操作。若因违…

示例代码:C# MQTTS双向认证(客户端)(服务器EMQX)

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

记录IMX6ULL开发板上移植SQLite3并运行Qt程序

文章目录 概要移植SQLite3Qt程序部署实验现象 概要 基于上一章对使用Qt运行对应的实验实例来完成对用户使用ui界面完成对SQLite数据库的增删改查等操作。本文旨在对上一句节的Qt程序部署到IMX6ULL开发板&#xff0c;并且完成对SQLite数据库在IMX6ULL开发板上的移植。 移植SQ…