apache poi excel export

apache poi excel export

水一篇 凑个数(啊 水文章好羞耻啊!请原谅我私密马赛!)


1 ExcelColumn

@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class ExcelColumn implements Serializable {@Serialprivate static final long serialVersionUID = -14668049202148498L;private String column;   // 字段名private String columnName;   // 列名private int width;   // 列宽// 可自定义其它表格属性
}

2 MultipleSheetExcel

@Data
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class MultipleSheetExcel implements Serializable {@Serialprivate static final long serialVersionUID = -1469875755370531986L;private String sheetName;private List<ExcelColumn> columns;private List<Map<String, Object>> data;
}

3 ExcelExport

public class ExcelExport {public static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");public static final int MAX_ROW_2003 = 65536;public static final int MAX_ROW_2007 = 1048576;public static final String DEFAULT_SHEET = "sheet";private static final Integer DEFAULT_COLUMN_WIDTH = 3000;private static final String DEFAULT_CELL_VALUE=  "";/*** export multiple sheet excel* @param response* @param columns* @param data* @throws Exception*/public static void exportExcel(HttpServletResponse response, List<ExcelColumn> columns,List<Map<String, Object>> data) throws Exception {if (CollectionUtils.isEmpty(columns) || CollectionUtils.isEmpty(data)) {return;}exportExcel(response, generateName(), columns, data);}/*** export excel* @param response* @param fileName* @param columns* @param data* @throws Exception*/public static void exportExcel(HttpServletResponse response, String fileName, List<ExcelColumn> columns,List<Map<String, Object>> data) throws Exception {if (CollectionUtils.isEmpty(columns) || CollectionUtils.isEmpty(data)) {return;}if (!StringUtils.hasText(fileName)) {fileName = generateName();}exportMultipleExcel(response, buildMultipleSheetExcel(columns, data, null), fileName);}/*** export excel* @param response* @param columns* @param data* @param excelType* @throws Exception*/public static void exportExcel(HttpServletResponse response, List<ExcelColumn> columns,List<Map<String, Object>> data, String excelType) throws Exception {if (CollectionUtils.isEmpty(columns) || CollectionUtils.isEmpty(data)) {return;}List<MultipleSheetExcel> list = buildMultipleSheetExcel(columns, data, excelType);exportMultipleExcel(response, generateName(), excelType,list, calculateSize(list));}/*** export multiple sheet excel* @param response* @param list* @throws Exception*/public static void exportMultipleExcel(HttpServletResponse response, List<MultipleSheetExcel> list) throws Exception {exportMultipleExcel(response, list, generateName());}/*** export multiple sheet excel* @param response* @param excelType* @param list* @throws Exception*/public static void exportMultipleExcel(HttpServletResponse response, String excelType, List<MultipleSheetExcel> list) throws Exception {exportMultipleExcel(response, generateName(), excelType, list, calculateSize(list));}/*** export multiple sheet excel* @param response* @param list* @param fileName* @throws Exception*/public static void exportMultipleExcel(HttpServletResponse response, List<MultipleSheetExcel> list, String fileName) throws Exception {if (!StringUtils.hasText(fileName)) {fileName = generateName();}exportMultipleExcel(response, fileName, ExcelTypeEnum.XLSX.getValue(), list, calculateSize(list));}/*** export multiple sheet excel* @param response* @param fileName* @param excelType* @param list* @param dataSize* @throws Exception*/public static void exportMultipleExcel(HttpServletResponse response, String fileName, String excelType,List<MultipleSheetExcel> list, int dataSize)throws Exception {Workbook workbook = createWorkbook(excelType, dataSize);CellStyle titleStyle = workbook.createCellStyle();Font titleFont = workbook.createFont();titleFont.setFontHeightInPoints((short) 16);titleStyle.setFont(titleFont);titleStyle.setAlignment(HorizontalAlignment.CENTER);CellStyle dataStyle = workbook.createCellStyle();dataStyle.setAlignment(HorizontalAlignment.CENTER);String sheetName;List<ExcelColumn> columns;List<Map<String, Object>> data;Sheet sheet;Row title;Cell titleCell;Row heads;for (MultipleSheetExcel sheetExcel : list) {if (CollectionUtils.isEmpty(columns = sheetExcel.getColumns()) || CollectionUtils.isEmpty(data = sheetExcel.getData())) {continue;}if (!StringUtils.hasText(sheetName = sheetExcel.getSheetName())) {sheetName = DEFAULT_SHEET;}sheet = workbook.createSheet(sheetName);title = sheet.createRow(0);titleCell = title.createCell(0);sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, columns.size()));titleCell.setCellValue(sheetName);titleCell.setCellStyle(titleStyle);heads = sheet.createRow(1);Cell headCell;CellStyle headStyle = workbook.createCellStyle();Font headFont = workbook.createFont();headFont.setFontHeightInPoints((short) 12);headStyle.setFont(headFont);headStyle.setAlignment(HorizontalAlignment.CENTER);int width;ExcelColumn excelColumn;for (int i = 0; i < columns.size(); i++) {excelColumn = columns.get(i);if ((width = excelColumn.getWidth()) <= 0) {width = DEFAULT_COLUMN_WIDTH;}headCell = heads.createCell(i);headCell.setCellValue(excelColumn.getColumnName());headCell.setCellStyle(headStyle);sheet.setColumnWidth(i, width);}Row row;Map<String, Object> map;for (int i = 0; i < data.size(); i++) {map = data.get(i);row = sheet.createRow(i + 2);Object value;Cell dataCell;ExcelColumn column;for (int j = 0; j < columns.size(); j++) {column = columns.get(j);if (ObjectUtils.isEmpty(value = map.get(column.getColumn()))) {value = DEFAULT_CELL_VALUE;}dataCell = row.createCell(j);dataCell.setCellValue(String.valueOf(value));dataCell.setCellStyle(dataStyle);}}}downloadExcel(response, fileName, excelType, workbook);}/*** download* @param response* @param fileName* @param excelType* @param workbook* @throws IOException*/public static void downloadExcel(HttpServletResponse response, String fileName, String excelType, Workbook workbook) throws IOException {try {response.setCharacterEncoding("UTF-8");response.setHeader("Content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName + "." + excelType, StandardCharsets.UTF_8));workbook.write(response.getOutputStream());} catch (Exception e) {throw new IOException(e.getMessage());}}/*** create workbook* @param excelType* @param size* @return*/private static Workbook createWorkbook(String excelType, int size) {if (ExcelTypeEnum.XLS.getValue().equals(excelType)) {return new HSSFWorkbook();} else if (size < 100000) {return new XSSFWorkbook();} else {return new SXSSFWorkbook();}}/*** build MultipleSheetExcel* @param columns* @param data* @param excelType* @return*/private static List<MultipleSheetExcel> buildMultipleSheetExcel(List<ExcelColumn> columns,List<Map<String, Object>> data, String excelType) {int maxSize;if (StringUtils.hasText(excelType) && ExcelTypeEnum.XLS.getValue().equals(excelType)) {maxSize = MAX_ROW_2003;} else {maxSize = MAX_ROW_2007;}int sheets;if ((data.size() % maxSize) > 0) {sheets = (data.size() / maxSize) + 1;} else {sheets = data.size() / maxSize;}int remainNumber = data.size(), fromIndex, toIndex;List<MultipleSheetExcel> list = new ArrayList<>(sheets);for (int i = 0; i < sheets; i++) {fromIndex = i * maxSize;toIndex = fromIndex + Math.min(remainNumber, maxSize);list.add(MultipleSheetExcel.builder().sheetName(DEFAULT_SHEET + i).columns(columns).data(data.subList(fromIndex, toIndex)).build());remainNumber = remainNumber - (toIndex - fromIndex);}return list;}/*** calculate data size* @param list* @return*/private static int calculateSize(List<MultipleSheetExcel> list) {int size = 0;List<Map<String, Object>> data;for (MultipleSheetExcel sheetExcel : list) {if (CollectionUtils.isEmpty(data = sheetExcel.getData())) {continue;}size += data.size();}return size;}/*** generate name* @return*/private static String generateName() {LocalDateTime now = LocalDateTime.now();return DATE_TIME_FORMATTER.format(now);}/*** excel type enum*/enum ExcelTypeEnum {XLS("xls"),XLSX("xlsx");private String value;ExcelTypeEnum(String value) {this.value = value;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}}
}

毁灭吧!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我在高职教STM32——LCD液晶显示(2)

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…

[GESP202306 三级] 春游

题目:原题点我 题目大意&#xff1a; 找 0 0 0到 N − 1 N-1 N−1哪个少了输出哪个&#xff0c;没少输出 N N N 解题思路&#xff1a; 建立一个bool类型变量flag&#xff0c;输入时直接将对应的数放到对应的位置上去&#xff0c;就免了排序&#xff1b; 接着判断&#xff1…

Linux源码学习笔记01-Linux内核源码结构

Linux内核特性 是一个类Unix操作系统&#xff0c;但不是简化的Unix&#xff1b;不仅继承了Unix的特征&#xff0c;还有其他特性。 Linux内核的组织形式&#xff1a;整体式的结构&#xff0c;方便每个领域的开发人员参与开发&#xff1b;Linux进程调度方式简单高效&#xff1a…

用智能插件(Fitten Code: Faster and Better AI Assistant)再次修改vue3 <script setup>留言板

<template><div><button class"openForm" click"openForm" v-if"!formVisible">编辑</button><button click"closeForm" v-if"formVisible">取消编辑</button><hr /><formv-i…

【权威发布】2024年环境科学、旅游与产业经济国际会议(ICESTIE 2024)

2024年环境科学、旅游与产业经济国际会议 2024 International Conference on Environmental Science, Tourism and Industrial Economics 会议简介 2024年环境科学、旅游与产业经济国际会议旨在汇聚全球该领域的专家学者&#xff0c;共同探讨环境科学与旅游产业的融合发展&…

SDK编译IO Domain电压选择

开源鸿蒙硬件方案领跑者 触觉智能 本文适用于在Purple Pi OH开发板进行分区镜像烧录。触觉智能的Purple Pi OH鸿蒙开源主板&#xff0c;是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党&#xff0c;极客&#xff0c;工程师&#xff0c;极大降低了开源鸿蒙…

SpringBoot 多种优雅的线程池配置与使用(异步执行函数,反射机制,动态识别参数,有返回值)

想要明白生活你需要先经历它,而不是总在分析它。 —萨莉鲁尼 文章目录 前言一、@Async注解1. 概念2. 使用2.1 使用@EnableAsync启动函数异步支持2.2 不会异步执行的坑2.2.1 为什么内部调用不会异步执行?2.2.2 如何确保@Async方法异步执行?3. 配置线程池3.1 通过代码配置3.1.…

【iOS】#include、#import、@class、@import

文章目录 #include#importclassimport总结 #include #include是c\c中的预处理器指令&#xff0c;用于包含头文件的内容 但是使用#include可能会出现重复包含文件的问题&#xff0c;因此需要使用&#xff08;#ifndef/#define/#endif&#xff09;。 #import //导入系统头文件…

Python Tkinter GUI图形化开发

Python Tkinter GUI图形化开发 今天我想和大家分享一下Python中使用Tkinter进行GUI图形化开发的经验和心得。Tkinter作为Python内置的标准GUI库&#xff0c;简单易用&#xff0c;是快速开发桌面应用程序的不错选择。今天的分享适合初学者和有一定基础的开发者&#xff0c;希望…

关于下载 IDEA、WebStorm 的一些心得感想

背景 实习第一天的时候&#xff0c;睿哥便吩咐我下载一些软件&#xff0c;这些软件以后在写项目的时候会用到&#xff0c;他叫我先装IDEA,WebStorm&#xff0c;微信开发者工具&#xff0c;git&#xff0c;还有Navicat。 这些软件能够被我们正常使用&#xff0c;无非就通过三步…

浅谈配置元件之TCP取样器配置/TCP取样器

浅谈配置元件之TCP取样器配置/TCP取样器 1.引言 在进行网络性能测试时&#xff0c;TCP取样器配置和TCP 取样器&#xff08;TCP Sampler&#xff09;是两个重要的组件&#xff0c;他们允许用户直接发送和接收TCP 数据包&#xff0c;这对于测试服务器的TCP 连接处理能力、模拟特…

Arduino-ESP32的CAN波特率设置为1M代码,不用改底层。

前面调CAN的时候&#xff0c;发现CAN的实际的波特率是设置的波特率的一半。然后还去看手册&#xff0c;推公式&#xff0c;改底层库的代码。后面发现不用这么麻烦&#xff0c;换一下使用的库和配置函数就行。使用CAN.h头文件的配置函数就会出现CAN的实际的波特率是设置的波特率…

使用opencv合并两个图像

本节的目的 linear blending&#xff08;线性混合&#xff09;使用**addWeighted()**来添加两个图像 原理 (其实我也没太懂&#xff0c;留个坑&#xff0c;感觉本科的时候线代没学好。不对&#xff0c;我本科就没学线代。) 源码分析 源码链接 #include "opencv2/imgc…

函数柯里化:简化 JavaScript 函数调用的神奇技巧

函数柯里化 在 JavaScript 中&#xff0c;函数柯里化&#xff08;Currying&#xff09;是一种强大的技术&#xff0c;可以帮助我们简化函数的调用方式&#xff0c;增强代码的灵活性和可复用性。本文介绍函数柯里化的基本概念、实现方法以及几个实用的应用场景&#xff0c;适合…

西米支付:【风控升级】同一商户集中交易,将会限制正常用卡

支付公司风控策略再升级&#xff01;近日&#xff0c;有某支付公司代理透漏&#xff0c;客户反馈机器突然不能刷卡了&#xff0c;换卡也无法交易&#xff0c;交易均提示06-超出商户限额&#xff0c;然而该款机器刷卡限额为单日30万&#xff0c;单月300万&#xff0c;客户并未触…

Win11 设置本地管理员账户的几种方法总结

从设置界面创建 Win11 设置本地管理员账户我们可以在设置界面来进行设置&#xff0c;下面是具体的操作步骤&#xff1a; 首先我们需要打开设置界面&#xff0c;然后点击“账户”选项&#xff0c;进入之后点击“其他用户”。 然后在用户界面中我们找到“其他用户”模块下的添加…

AMD vs NVIDIA:渲染领域的显卡之争

在数字创意与设计的世界里&#xff0c;显卡作为图形处理的核心&#xff0c;其性能与兼容性直接关系到创作者的工作效率与作品质量。AMD与NVIDIA&#xff0c;作为两大显卡巨头&#xff0c;各自在渲染领域拥有独特的技术与优势。那么&#xff0c;针对渲染而言&#xff0c;哪种显卡…

四川古力未来科技有限公司抖音小店解锁电商新机遇

在数字化浪潮席卷全球的今天&#xff0c;电商行业正以前所未有的速度蓬勃发展。四川古力未来科技有限公司紧跟时代步伐&#xff0c;积极拥抱变革&#xff0c;在抖音平台上开设小店&#xff0c;为品牌发展注入了新的活力。那么&#xff0c;四川古力未来科技有限公司抖音小店究竟…

C#和python端通信之使用共享内存

一、前言 本篇主要实验通过使用共享内存实现C#端代码和python端代码之间的通信&#xff0c;主要目的是相较于直接传输较大的数据&#xff08;例如图像数据&#xff09;&#xff0c;该方式更节省时间。 二、代码 C#端&#xff1a; 创建了一个大小为1的共享内存&#xff0c;名为…

Js-w3school(2024(1)

10.访问 HTML 元素 使用“不整洁的” HTML 样式的后果&#xff0c;也许是导致 JavaScript 错误。请在 HTML 中使用相同的命名约定&#xff08;就像 JavaScript 那样&#xff09; 11. 请使用正确的文档类型 请始终在文档的首行声明文档类型&#xff1a; 如果您一贯坚持小写标…