java使用esayExcel

文章目录

  • 导出
    • 依赖
    • 后端代码
      • controller
      • service
      • 单元格宽度配置类
      • util
    • 前端代码

导出

依赖

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.4</version>
</dependency>

后端代码

controller

@RequestMapping("/exportDemo")
public void exportDemo(@RequestBody Map<String, String> params,HttpServletResponse response) {testService.exportDemo(params, response);
}

service

public void exportDemo(Map<String, String> params,HttpServletResponse response) {List<Map<String, Object>> dataList = getDataList(params);try {response.reset();response.setHeader("Content-type", "application/octet-stream");response.setHeader("Content-Disposition", "attachment;filename=" +URLEncoder.encode("表名称-" +DateUtils.format(new Date(),"yyyyMMddHHmmss") + ".xls", "utf-8"));// 表内容样式WriteCellStyle writeCellStyleContent = new WriteCellStyle();//垂直居中,水平居中writeCellStyleContent .setVerticalAlignment(VerticalAlignment.CENTER);writeCellStyleContent .setHorizontalAlignment(HorizontalAlignment.CENTER);writeCellStyleContent .setBorderLeft(BorderStyle.THIN);writeCellStyleContent .setBorderTop(BorderStyle.THIN);writeCellStyleContent .setBorderRight(BorderStyle.THIN);writeCellStyleContent .setBorderBottom(BorderStyle.THIN);//设置 自动换行writeCellStyleContent .setWrapped(true);WriteFont writeFont = new WriteFont();writeFont.setFontHeightInPoints((short) 12);writeFont.setFontName("宋体");writeCellStyleContent.setWriteFont(writeFont);//表头样式WriteCellStyle writeCellStyleHead = new WriteCellStyle();writeFont = new WriteFont();writeFont.setFontHeightInPoints((short) 12);writeFont.setBold(true);writeFont.setFontName("宋体");writeCellStyleHead.setWriteFont(writeFont);ExcelWriter writer = EasyExcel.write(response.getOutputStream()).build();List<List<String>> head = new ArrayList<List<String>>() {{add(new ArrayList<String>() {{add("单位单位单位");}});add(new ArrayList<String>() {{add("语文");add("已");}});add(new ArrayList<String>() {{add("数学");add("未");}});add(new ArrayList<String>() {{add("时间");}});}};WriteSheet ajSheet1 = EasyExcel.writerSheet(0, "sheetName").head(head).registerWriteHandler(new ExcelWidthStyleStrategy()).registerWriteHandler(new HorizontalCellStyleStrategy(writeCellStyleHead,writeCellStyleContent)).build();writer.write(getData(dataList), ajSheet1);writer.finish();} catch (IOException e) {e.printStackTrace();}
}

单元格宽度配置类

package com.utils;import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.springframework.util.CollectionUtils;import java.util.HashMap;
import java.util.List;
import java.util.Map;public class ExcelWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {private Map<Integer, Map<Integer,Integer>> CACHE = new HashMap<>();@Overrideprotected void setColumnWidth(WriteSheetHolder writeSheetHolder,List<CellData> list, Cell cell, Head head,Integer integer, Boolean aBoolean) {boolean needSetWidth = aBoolean || !CollectionUtils.isEmpty(list);int columnIndex = cell.getColumnIndex();if (needSetWidth) {Map<Integer, Integer> maxColumnWidthMap= CACHE.get(writeSheetHolder.getSheetNo());if (maxColumnWidthMap == null) {maxColumnWidthMap = new HashMap<>();CACHE.put(writeSheetHolder.getSheetNo(),maxColumnWidthMap);}Integer columnWidth = dataLength(list, cell, aBoolean);if (columnWidth >=0) {if (columnWidth > 150) {columnWidth = 150;}Integer maxColumnWidth = maxColumnWidthMap.get(columnIndex);if (maxColumnWidth == null || columnWidth > maxColumnWidth) {maxColumnWidthMap.put(columnIndex,columnWidth);writeSheetHolder.getSheet().setColumnWidth(columnIndex,columnWidth * 500);}}}}private Integer dataLength (List<CellData> cellDataList,Cell cell,Boolean isHead) {if (isHead) {int bytesLength = cell.getStringCellValue().getBytes().length;if (bytesLength < 10) {return bytesLength;} else {int stringLength = cell.getStringCellValue().length();Double v = (bytesLength + stringLength) * 0.5;return v.intValue();}} else {CellData cellData = cellDataList.get(0);CellDataTypeEnum type = cellData.getType();if (type == null) {return -1;} else {switch (type) {case STRING:int bytesLength = cellData.getStringValue().getBytes().length;if (bytesLength < 10) {return bytesLength;} else {int stringLength = cellData.getStringValue().length();Double v = (bytesLength + stringLength) * 0.3;return v.intValue();}case BOOLEAN:return cellData.getBooleanValue().toString().getBytes().length;case NUMBER:return cellData.getNumberValue().toString().getBytes().length;default:return -1;}}}}
}

util

private List<Map<String, Object>>getDataList(Map<String, String> params) {List<Map<String, Object>> reuslt = new ArrayList<>();Map<String, Object> map = new HashMap<>();map.put("dw","测试单位");map.put("y","10");map.put("w","800");map.put("sj","2023-07-01 12:12:00");reuslt.add(map);return reuslt;
}private List<List<String>>getData(List<Map<String, Object>> dataList) {List<List<String>> result = new ArrayList<>();for (Map<String, Object> map : dataList) {List<String> list = new ArrayList<>();list.add(map.get("dw").toString());list.add(map.get("y").toString());list.add(map.get("w").toString());list.add(map.get("sj").toString());result.add(list);}return result;
}

前端代码

exportXlsx () {this.$axios({method: 'post',url: '/test/exportDemo',responseType: 'blob',data: {...this.params}}).then(response => {let filename = response.headers['content-disposition']const blob = new Blob([response.data])var downloadElement = document.createElement('a')var href = window.URL.createObjectURL(blob)downloadElement.href = hrefdownloadElement.download = decodeURIComponent(filename.split('filename=')[1])document.body.appendChild(downloadElement)downloadElement.click()document.body.removeChild(downloadElement)window.URL.revokeObjectURL(href)}).catch(reject => {})
}

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

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

相关文章

Go 源码之读写锁 sync.RWMutex

Go 源码之读写锁 sync.RWMutex 文章目录 Go 源码之读写锁 sync.RWMutex一、简介二、源码(一)RWMutex数据结构(二)Lock(三)Unlock(四)TryRLock(五)Rlock(六)RUnlock三、常见问题1. 什么是CAS,什么是原子操作2. 写操作是如何阻止写操作的3. 写操作是如何阻止读操作的…

对tensor数据进行可视化--可自主确定类别

def visualize_class_indices(class_indices_tensor, num_classes, cmaptab20): “”class_indices_tensor的shape是2维的&#xff0c;如[256,256],num_classes为多少根据自己的类别数确定“”colors plt.get_cmap(cmap)(np.linspace(0, 1, num_classes))[:, :3]class_colors …

Shopee虾皮100%有效提高广告效果的案例分享

Shopee 店铺运营中存在三种广告类型&#xff0c;分别是:关键词广告、关联广告和店铺广告。其中使用最为普遍&#xff0c;主控权最为直接的就是关键词广告&#xff0c;TA的适用范围最广&#xff0c;起效最快&#xff0c;并且可根据自身运营的能力去调控投入产出比&#xff0c;深…

SVM向量支持机

1.通俗理解 svm&#xff1a;support vector machine目标&#xff1a;利用超平面将两类数据分割开来&#xff0c;这个超平面就是我们要设计的对象 如何设计&#xff1f;我们设计之后会有间隔&#xff0c;间隔越大分类效果就越好&#xff1b;距离决策边界最近的点我们成为支持向…

个人求职简历(精选8篇)

HR浏览一份简历也就25秒左右&#xff0c;如果你连「好简历」都没有&#xff0c;怎么能找到好工作呢&#xff1f; 如果你不懂得如何在简历上展示自己&#xff0c;或者觉得怎么改简历都不出彩&#xff0c;那请你一定仔细读完。 互联网运营个人简历范文> 男 22 本科 AI简历…

物业满意度电话调查的高效方法与技巧

在物业管理行业&#xff0c;客户满意度是衡量服务质量的重要标尺。物业公司要想在竞争激烈的市场中脱颖而出&#xff0c;就必须及时了解客户的需求和反馈&#xff0c;从而针对性地提升服务质量。电话调查作为一种高效、直接的调查方式&#xff0c;能够在有限的时间内获取大量客…

【已完成】把Win10右键改回Win7的模样

win11右键设置成原来模样的方法如下&#xff1a; 1、winr打开运行窗口&#xff0c;输入regedit&#xff0c;按下回车键确认即可打开注册表。 2、在路径中输入&#xff1a;HKEY_CURRENT_USER\SOFTWARE\CLASSES\CLSID&#xff0c;或者是依次定位点开到CLSID。 3、右键点击CLSID&…

python--面向对象的三大特征---封装、继承、多态

1.封装&#xff1a; 1&#xff0c;在面向对象中&#xff0c;封装指的是一种安全机制&#xff0c;不让外界修改或者直接操作&#xff0c;将属性私有化&#xff1b; 如果要访问属性&#xff0c;提供公开的方法&#xff08;getter&#xff0c;setter&#xff09; 2. python的类如…

面试算法-166-排序链表

题目 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 解 class Solution {public ListNode sortList(ListNode head) {if (head null || head.next null…

【项目】牛马点评 问题汇总

如果一个人换很多个不同电话号发验证码会怎样 项目里没实现&#xff0c;如果让我做的话&#xff0c;我会获得用户的ip地址&#xff0c;然后存到redis里&#xff0c;设置个ttl比如1分钟&#xff0c;每次请求过来后就先看看redis里有没有这个ip&#xff0c;有的话就不发验证码。…

【双指针】反转字符串中的单词

给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随…

【stm32】I2C通信协议

【stm32】I2C通信协议 概念及原理 如果我们想要读写寄存器来控制硬件电路&#xff0c;就至少需要定义两个字节数据 一个字节是我们要读写哪个寄存器&#xff0c;也就是指定寄存器的地址 另一个字节就是这个地址下存储寄存器的内容 写入内容就是控制电路&#xff0c;读出内容就…

R-Tree的简单介绍

一、R-Tree简介 R-Tree&#xff0c;全称是“Real Tree”&#xff0c;是一种专门为处理多维空间数据&#xff08;尤其是二维空间数据&#xff0c;如地理坐标&#xff09;设计的树形数据结构。 简单来说&#xff0c;它就像是一个特殊的目录&#xff0c;将空间数据按照它们的位置…

NIKKE胜利女神PC怎么设置中文 手把手教你设置中文教程

这个游戏中的妮姬分四个企业&#xff0c;其中朝圣者这个派别的妮姬很少而且不在愿望单理&#xff0c;朝圣者的所有姐姐都很哇塞&#xff0c;红莲更是其中的大姐大。一般想抽朝圣者只能靠歪或者出限定卡池&#xff0c;举个栗子&#xff0c;我入坑的时候 朝圣者 神罚 是限定卡池&…

restic测试2

1. 创建对象存储key CiRdfsejAYlcCghuFLhc z6n0y2wEOFxMDOy8whFB1VXWxDkqQ4uc6qPlPawQ 2. restic安装部署 yum install yum-plugin-copr -y yum copr enable copart/restic -y yum install restic jq lrzsz -y yum install -y nethogs yum install -y agedu 3. 安装rclone 下…

计算系数(acwing,数论)

题目描述&#xff1a; 给定一个多项式 (axby)^k&#xff0c;请求出多项式展开后 x^n*y^m 项的系数。 输入格式&#xff1a; 共一行&#xff0c;包含 5 个整数&#xff0c;分别为 a&#xff0c;b&#xff0c;k&#xff0c;n&#xff0c;m&#xff0c;每两个整数之间用一个空格…

【STL】stack与queue的底层原理及其实现

文章目录 stack的介绍库中stack的使用栈的模拟实现queue的介绍库中queue的使用queue的模拟实现 stack的介绍 &#xff08;图片来自知乎&#xff09; 1.stack是一种容器适配器&#xff0c;模拟了栈的数据结构。数据只能从一端进去&#xff0c;另一端出来&#xff08;先进后出&am…

基于单片机水质检测仪系统仿真设计

**单片机设计介绍&#xff0c; 基于单片机水质检测仪系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机水质检测仪系统仿真设计的主要目标是&#xff0c;通过仿真手段验证基于单片机的水质检测仪系统的设计方…

硬盘容量骤降为0?原因解析与数据恢复秘籍

当我们打开计算机&#xff0c;准备进入日常的工作或娱乐时&#xff0c;突然发现硬盘容量显示为0&#xff0c;这无疑是一个令人头痛的问题。硬盘&#xff0c;作为我们存储重要数据和文件的关键设备&#xff0c;一旦容量显示为0&#xff0c;就意味着我们可能面临数据丢失的风险。…

AbstractQueuedSynchronizer的独占锁和共享锁

AbstractQueuedSynchronizer&#xff08;AQS&#xff09;提供了两种类型的锁&#xff1a;独占锁和共享锁。 独占锁&#xff08;Exclusive Lock&#xff09;&#xff1a; 独占锁模式只允许一个线程同时获取锁。当一个线程获取了独占锁时&#xff0c;其他线程必须等待该线程释放锁…