当前位置: 首页 > news >正文

EasyExcel动态表头导出

1、封装方法

package com.skybird.iot.base.utils;import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
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.skybird.iot.base.utils.bean.Custemhandler;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;public class EasyExcelUtil {/*** @param response* @param t 导出实体类* @param list 数据集合* @param name 文件名称* @throws IOException* @throws IllegalAccessException* @throws InstantiationException*/public static void download(HttpServletRequest request, HttpServletResponse response, Class t, List list, String name)throws IOException, IllegalAccessException, InstantiationException {/*兼容IE和其他浏览器导出文件名乱码的问题*///    name = downloadCommFileName(name, request);response.setContentType("application/vnd.ms-excel"); // 设置文本内省response.setCharacterEncoding("utf-8"); // 设置字符编码response.setHeader("Content-disposition", "attachment;fileName=name.xlsx"); // 设置响应头try (OutputStream outStream = response.getOutputStream()) {EasyExcel.write(outStream, t).excelType(ExcelTypeEnum.XLSX).registerWriteHandler(new Custemhandler()) // 设置自动列宽设置.registerWriteHandler(getStyleStrategy()) // 设置样式.sheet(name).doWrite(list); // 用io流来写入数据outStream.flush();}}/*** 动态表头导出** @param request* @param response* @param head 表头数据* @param dataList 内容数据* @param name 名称* @throws IOException*/public static void trendsDownload(HttpServletRequest request,HttpServletResponse response,List<List<String>> head,List<List<Object>> dataList,String name)throws IOException {try (OutputStream outStream = response.getOutputStream()) {EasyExcel.write(outStream).head(head).sheet(name).registerWriteHandler(new Custemhandler()) // 设置自动列宽设置.registerWriteHandler(getStyleStrategy()) // 设置样式.doWrite(dataList);outStream.flush();}}/*兼容IE和其他浏览器导出文件名乱码的问题*/public static String downloadCommFileName(String fileOut, HttpServletRequest request)throws IOException {String userAgent = request.getHeader("user-agent").toLowerCase();if (!StrUtil.contains(userAgent, "chrome")&& (userAgent.contains("msie") || userAgent.contains("like gecko"))) {// win10 ie edge 浏览器 和其他系统的iefileOut = URLEncoder.encode(fileOut, "UTF-8");} else {// 其他fileOut = new String(fileOut.getBytes("utf-8"), "iso-8859-1");}return fileOut;}public static HorizontalCellStyleStrategy getStyleStrategy() {// 头的策略WriteCellStyle headWriteCellStyle = new WriteCellStyle();// 背景设置headWriteCellStyle.setFillForegroundColor(IndexedColors.AUTOMATIC.getIndex());WriteFont headWriteFont = new WriteFont();headWriteFont.setFontHeightInPoints((short) 12);// 字体样式headWriteFont.setFontName("宋体");headWriteFont.setBold(false); // 取消加粗// 字体设置成红色//        headWriteFont.setColor(IndexedColors.RED.getIndex());headWriteCellStyle.setWriteFont(headWriteFont);// 自动换行headWriteCellStyle.setWrapped(false);//        headWriteCellStyle.setBorderTop(BorderStyle.SLANTED_DASH_DOT);//右边框//        headWriteCellStyle.setBorderBottom(BorderStyle.SLANTED_DASH_DOT);//左//        headWriteCellStyle.setBorderLeft(BorderStyle.SLANTED_DASH_DOT);//底//        headWriteCellStyle.setBorderRight(BorderStyle.SLANTED_DASH_DOT);// 水平对齐方式headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 垂直对齐方式headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 内容的策略WriteCellStyle contentWriteCellStyle = new WriteCellStyle();// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了// FillPatternType所以可以不指定//        contentWriteCellStyle.setFillPatternType(FillPatternType.SQUARES);// 背景白色contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());WriteFont contentWriteFont = new WriteFont();// 字体大小contentWriteFont.setFontHeightInPoints((short) 12);// 字体样式contentWriteFont.setFontName("Calibri");contentWriteCellStyle.setWriteFont(contentWriteFont);return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);}
}

2、Java请求接口

  @RequestMapping("/excel")public void excel(HttpServletRequest request,HttpServletResponse response,@RequestParam(value = "dateRange", required = false) Integer dateRange)throws Exception {List<Document> list = getList(dateRange);// 表头数据List<List<String>> head = ListUtils.newArrayList();getHead(head);List<Document> dtoList = DocuLib.getList(list.get(0), "causeMalfunctionDetails");for (Document item : dtoList) {List<String> head1 = ListUtils.newArrayList();head1.add(DocuLib.getStr(item, "causeMalfunctionName"));head.add(head1);}// 内容数据List<List<Object>> dataList = ListUtils.newArrayList();for (Document item : list) {List<Object> data = ListUtils.newArrayList();data.add(DocuLib.getStr(item, "yearMonth"));data.add(DocuLib.getStr(item, "totalMonthly"));data.add(DocuLib.getStr(item, "auditMonthly"));data.add(DocuLib.getStr(item, "completedMonthly"));List<Document> rowList = DocuLib.getList(item, "causeMalfunctionDetails");for (Document dto : rowList) {data.add(DocuLib.getStr(dto, "count"));}dataList.add(data);}EasyExcelUtil.trendsDownload(request, response, head, dataList, "销售退货统计");}private void getHead(List<List<String>> head) {List<String> head1 = ListUtils.newArrayList();head1.add("时间");List<String> head2 = ListUtils.newArrayList();head2.add("退货单数");List<String> head3 = ListUtils.newArrayList();head3.add("审核通过");List<String> head4 = ListUtils.newArrayList();head4.add("完成单数");head.add(head1);head.add(head2);head.add(head3);head.add(head4);}

3、html关键代码

<div class='card-body' style='height: 100%;'><div style="display: flex;flex-wrap: wrap; align-items: center;"><cb-date inline="true"style="width:100px;margin-bottom: 10px; display: block;"ng-model="ctrl.filter.dateRange"placeholder="创建时间"picker="year"></cb-date><button class="btn btn-default btn-sm"style="margin-left: 8px; margin-bottom: 10px; display: block;" type="button"ng-click="ctrl.loadData()"><i class="bi bi-search"></i>查询</button><div><button class='btn btn-outline-primary btn-sm' ng-click='ctrl.export()'style="margin-left: 5px;margin-bottom: 10px;"ng-if="''| SecurityFilter: 'saleReturnOrderStatistics':'export'"type='button'><i class='bi'></i>导出</button></div></div><div style="overflow: scroll;overflow-x: auto; width: 100%;height: calc(100% - 80px);"ng-if="check === false"><table class="table table-bordered" style="width: 1640px;table-layout: fixed;"><thead style="position: sticky;top: -1px;z-index: 1;"><tr><th width="100px;">时间</th><th width="150px;">退货单数</th><th width="150px;">审核通过</th><th width="150px;">完成单数</th><th ng-repeat="dailyDetail in entity[0].causeMalfunctionDetails"ng-style="{width: dailyDetail.causeMalfunctionName.length>=5?dailyDetail.causeMalfunctionName.length*17:100}">{{dailyDetail.causeMalfunctionName}}</th></tr></thead><tbody><tr ng-repeat="row in entity"><td>{{row.yearMonth}}</td><td>{{row.totalMonthly}}</td><td>{{row.auditMonthly}}</td><td>{{row.completedMonthly}}</td><td ng-repeat="dailyDetail in row.causeMalfunctionDetails">{{dailyDetail.count}}</td></tr></tbody></table></div><div style="overflow: scroll; width: 100%;height: calc(100% - 80px);" ng-if="check === true"><table class="table table-bordered" style="width: auto;table-layout: fixed;"><thead style="position: sticky;top: -1px;z-index: 1;"><tr><th width="100px;">时间</th><th width="150px;">退货单数</th><th width="150px;">审核通过</th><th width="150px;">完成单数</th><th ng-repeat="dailyDetail in entity[0].causeMalfunctionDetails">{{dailyDetail.causeMalfunctionName}}</th></tr></thead><tbody><tr ng-repeat="row in entity"><td>{{row.yearMonth}}</td><td>{{row.totalMonthly}}</td><td>{{row.auditMonthly}}</td><td>{{row.completedMonthly}}</td><td ng-repeat="dailyDetail in row.causeMalfunctionDetails">{{dailyDetail.count}}</td></tr></tbody></table></div></div>

4、js关键代码

                export: function () {//后端导出http.getFile('saleReturnOrderStatistics/excel', {dateRange: ctrl.filter.dateRange}).then(function (response) {const url = window.URL.createObjectURL(new Blob([response.data]));const link = document.createElement('a');link.href = url;link.setAttribute('download', '销售退货统计.xlsx');document.body.appendChild(link);link.click();});}

5、效果

相关文章:

EasyExcel动态表头导出

1、封装方法 package com.skybird.iot.base.utils;import cn.hutool.core.util.StrUtil; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import com.alibaba.excel.w…...

可视化基础的设计四大原则

一个好的数据可视化设计可以帮助观众迅速理解数据背后的意义。然而&#xff0c;如何确保我们的可视化设计既美观又简单易懂呢&#xff1f;本文将介绍四大设计原则——亲密原则、对比原则、对齐原则和重复原则。 1、 亲密原则&#xff08;Proximity&#xff09; 定义与应用&am…...

MySQL基础练习题27-上升的温度

目录 题目 准备数据 分析数据 总结 题目 找出与之前&#xff08;昨天的&#xff09;日期相比温度更高的所有日期的 id 。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Weather (id int, recordDate date, temperature int);#…...

只出现一次的数字 II

给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [2,2,3,2]…...

第十一章 数据仓库和商务智能 10分

11.1.0语境关系图 11.1 Q 建立数据仓库&#xff0c;有哪些步骤&#xff1f;如何建设&#xff1f;【6 个步骤非常重要&#xff01;必须知道】 1. 理解需求&#xff08;P&#xff09;&#xff08;目的明确&#xff0c;ETL&#xff09; (1) 考虑业务目标和业务战略。 (2) 确定业…...

一篇文章带你解析完整数据结构-----满满干活值得收藏

数据结构是计算机科学中的一个重要分支&#xff0c;它涉及到计算机存储、组织数据的方式。以下是数据结构的主要知识点&#xff1a; 基本概念 数据&#xff08;Data&#xff09;。数据元素&#xff08;Data Element)&#xff1a;数据项&#xff08;Data Item&#xff09;&…...

11.3 用Python处理常见文件

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…...

Linux知识复习第2期

RHCE 远程登录服务-CSDN博客 Linux 用户和组管理_linux用户和组的管理-CSDN博客 Linux 文件权限详解-CSDN博客 目录 1、sshd 免密登录 (1)纯净实验环境 (2)生成密钥 (3)上锁 2、用户管理 (1)添加新用户 (2)删除用户 (3)修改用户信息 (4)为用户账号设…...

驗證HTTP代理的有效性的方法和步驟-okeyproxy

如何驗證HTTP代理的有效性&#xff0c;確保它的性能和安全性&#xff0c;是非常必要的。本文將詳細介紹驗證HTTP代理有效性的方法和步驟。 HTTP代理作為一種仲介伺服器&#xff0c;它可以幫助用戶在訪問目標網站時隱藏真實IP地址&#xff0c;從而提高匿名性和安全性。通過HTTP…...

Java和kotlin 反射机制

Java 反射机制详解 Java 反射机制是一种强大的工具&#xff0c;使得程序可以在运行时动态地获取类的信息&#xff0c;并且可以在运行时操作类的成员变量、方法和构造函数等。以下是 Java 反射的详细讲解&#xff0c;包括其原理、使用场景、优缺点以及如何使用反射。 1. 反射的…...

Linux Shell编程--数组

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除&#xff01; 一、简介 Shell 脚本中的数组允许你存储多个值&#xff0c;并可以通过索引访问它们。Shell 中的数组是一维的。 二、声明数组 在Shell…...

sheng的学习笔记-AI-k近邻学习(kNN)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 什么是k近邻学习 k近邻&#xff08;k-Nearest Neighbor&#xff0c;简称kNN&#xff09;学习是一种常用的监督学习方法&#xff0c;是一种基本的分类与回归方法。 分类问题&#xff1a;对新的样本&#xff0c;根据其 k 个…...

ShardingSphere之ShardingProxy集群部署

文章目录 介绍使用Zookeeper进行集群部署统一ShardingJDBC和ShardingProxy配置通过Zookeeper注册中心同步配置直接使用ShardingProxy提供的JDBC驱动读取配置文件 介绍 开发者手册 在conf/server.yaml配置文件中有下面这一段配置&#xff0c;就是关于集群部署的 mode: # typ…...

同态加密和SEAL库的介绍(六)BGV 方案

前面介绍 BFV 和 CKKS 加密方案&#xff0c;这两者更为常用。并且也解释了 Batch Encoder 和 级别的概念&#xff0c;这对接下来演示 BGV 会很有帮助。 一、BGV简介 BGV (Brakerski-Gentry-Vaikuntanathan) 方案 是一种基于环学习同态加密&#xff08;RLWE&#xff09;问题的加…...

uniapp微信小程序 canvas绘制圆形半透明阴影 createCircularGradient函数不支持透明度部分解决方案

背景 我需要在微信小程序中&#xff0c;用canvas绘制一个圆形钟表&#xff0c;在ui设计图中&#xff0c;有一部分阴影&#xff0c;这里我节选一下&#xff1a; 即深色发黑的部分 canvas通用阴影绘制 由于canvas中并不支持css那样简单的方式为圆形添加阴影或高光&#xff0c…...

W34KN3SS靶机

信息收集&#xff1a; 靶机地址&#xff1a;https://www.vulnhub.com/entry/w34kn3ss-1,270/# &#xff08;1&#xff09;ip扫描 nmap 192.168.254.0/24 -sn | grep -B 2 00:0C:29:E8:66:AB &#xff08;2&#xff09;端口扫描 nmap -p- -A 192.168.254.145 &#xff08;3&…...

8.9套题

A. 猴猴吃苹果 题意&#xff1a;给定根节点k&#xff0c;求访问点的顺序&#xff0c;使得每次从上一个点到当前点的权值最大。访问过的点权值为0。权值一样时&#xff0c;输出最小编号 思路&#xff1a;由于是双向边&#xff0c;先求根节点到每一个节点的距离值。在第一轮中&…...

Python 爬取网页水务数据并实现智慧水务前端可视化

提示&#xff1a;本文爬取深圳市环境水务集团有限公司的公开数据作为数据样例进行数据分析与可视化。 文章目录 一、爬虫二、对爬取的数据进行数据库、excel的存储与数据处理1.代码实现 三、应用Flask框架将后端获取数据后渲染到前端四、前端Echarts的使用1.下载echarts.min.js…...

百度智能云发布3款轻量级+2款场景大模型

文心大模型ERNIE 3.5是目前百度智能云千帆大模型平台上最受欢迎的基础大模型之一。针对用户的常见通用的对话场景&#xff0c;ERNIE 3.5 在指令遵循、上下文学习和逻辑推理能力三方面分别进行了能力增强。 ERNIE Speed作为三款轻量级大模型中的“大个子”&#xff0c;推理场景…...

UE基础 —— 编辑器界面

菜单栏 UE中每个编辑器都有一个菜单栏&#xff0c;部分菜单会出现在所有编辑器窗口中&#xff0c;如File、Window、Help&#xff0c;其他则是其编辑器特有的&#xff1b; 主工具栏 UE中部分最常用的工具和命令的快捷方式&#xff1b; 1&#xff0c;保存按钮&#xff08;ctrls&a…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...