导入导出(excel格式/压缩包格式导出至response、excel导入)

目录

  • 导出
    • 一、excel格式导出至response
      • 1、List<对象>导出
      • 2、json对象不固定列导出
    • 二、压缩包格式导出至response
      • 使用Hutool工具简化代码
  • 导入
    • 一、对象导入
    • 二、不固定列导入


导出

一、excel格式导出至response

1、List<对象>导出

Map<String, String> headerAlias = new LinkedHashMap<String, String>();
headerAlias.put("数据列一对象英文名称", "显示的中文名称");
... // BigExcelWriter excelWriter = new BigExcelWriter();
excelWriter.setHeaderAlias(headerAlias);
excelWriter.write(list); //  List<对象> list 是数据
if (null != response) {// 下边两行任取一行都可以response.addHeader("Content-Type", "application/vnd.ms-excel;charset=UTF-8");// response.addHeader("Content-Type", "application/octet-stream");response.addHeader("Content-Disposition", excelWriter.getDisposition("excel表名", StandardCharsets.UTF_8));
}
excelWriter.flush(response.getOutputStream(), true);
excelWriter.close();

2、json对象不固定列导出

// swagger无法测试
HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse(); // 获取response对象List<List<String>> resultListList = new ArrayList<>(); // 用于模拟excel
List<String> resultHeadList = new ArrayList<>(); // excel表头
resultHeadList.add("NAME");
... // 这里是固定的确定的列for (int j = 0; j < jsonObj.size(); j++) {JSONArray jsonArray = jsonObj.getJSONArray("num" + j);List<String> resultList = new ArrayList<>(); // 模拟excel一行if (j == 0) { // 第一行resultList.add("固定列的相同取值");... // 固定列处理} else { // 其余行resultList.add("");... // 固定列处理}for (int i = 0; i < jsonArray.size(); i++) {JSONObject obj = jsonArray.getJSONObject(i);String name = StrUtil.trimToEmpty(obj.getStr("name"));String value = StrUtil.trimToEmpty(obj.getStr("value"));if (j == 0) {resultHeadList.add(name); // 表头增加相应名称}resultList.add(value);}resultListList.add(resultList);
}
resultListList.add(0, resultHeadList);
BigExcelWriter excelWriter = new BigExcelWriter();
excelWriter.write(resultListList);
if (null != response) {// 下边两行任取一行都可以response.addHeader("Content-Type", "application/vnd.ms-excel;charset=UTF-8");// response.addHeader("Content-Type", "application/octet-stream");response.addHeader("Content-Disposition", excelWriter.getDisposition("excel表名", StandardCharsets.UTF_8));
}
excelWriter.flush(response.getOutputStream(), true);
excelWriter.close();

二、压缩包格式导出至response

// 多个数据逗号分隔 String ->String[] 正则表达式:[,;,;:\\s]+
String[] fileUrlArray = Arrays.stream(StrUtil.trimToEmpty(request.getParameter("fileUrl")).replaceAll([,;,;:\\s]+, ",").replaceAll("^,|,$", "").split(",")).filter(StrUtil::isNotBlank).distinct().toArray(String[]::new);
// String[] 转换成 List 也仅仅用于 fileUrlSuffixMap 中快捷获得某一元素的下标 fileUrlList.indexOf(m)
List<String> fileUrlList = new ArrayList<>(fileUrlArray.length);
Collections.addAll(fileUrlList, fileUrlArray);List<String> suffixList = Arrays.stream(fileUrlArray).map(m -> m.substring(m.lastIndexOf("."))).collect(Collectors.toList()); // 图片后缀名
Map<String, String> fileUrlSuffixMap = Arrays.stream(fileUrlArray).collect(Collectors.toMap(m -> m, m -> suffixList.get(fileUrlList.indexOf(m)))); // 图片url和后缀名mapString sku = StrUtil.trimToEmpty(request.getParameter("sku")); // 仅仅用于压缩包命名
String rootPath = request.getRealPath("/");
File file = new File(rootPath + "temp_download");
if (!file.exists()) {file.mkdir();
}
Arrays.stream(fileUrlArray).forEach(m -> HttpUtil.downloadFile(m,FileUtil.file(new File(rootPath + "temp_download" + File.separator + m.substring(m.lastIndexOf("/") + 1, m.lastIndexOf(".")) + fileUrlSuffixMap.get(m)))));try {File zipFile = null;zipFile = new File(rootPath + "temp_download" + "/" + sku + ".zip");FileOutputStream zipFos = new FileOutputStream(zipFile);ArchiveOutputStream archOut = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, zipFos);ZipArchiveOutputStream zos = (ZipArchiveOutputStream) archOut;for (int i = 0; i < fileUrlArray.length; i++) {String ele = fileUrlArray[i];File imageFile = new File(rootPath + "temp_download" + "/" + ele.substring(ele.lastIndexOf("/") + 1, ele.lastIndexOf(".")) + suffixList.get(i));ZipArchiveEntry zipEntry = new ZipArchiveEntry(imageFile, imageFile.getName());zos.putArchiveEntry(zipEntry);zos.write(FileUtils.readFileToByteArray(imageFile));if (imageFile.exists()) {imageFile.delete();}}zos.closeArchiveEntry();zos.flush();zos.close();OutputStream out = null;out = response.getOutputStream();response.reset();response.setHeader("Content-Disposition", "attachment;filename=" + new String((sku + ".zip").getBytes("GB2312"), "ISO-8859-1"));response.setContentType("application/octet-stream; charset=utf-8");response.setCharacterEncoding("UTF-8");out.write(FileUtils.readFileToByteArray(zipFile));out.flush();out.close();if (zipFile.exists()) {zipFile.delete();}if (file.exists()) {file.delete();}
} catch (Exception e) {e.printStackTrace();
}

使用Hutool工具简化代码

// 输出到内存里面
String[] fileArray = fileStr.split(",");
try {AtomicInteger atomicAdd = new AtomicInteger(); // 文件大小累加器List<String> fileName = CollUtil.list(false); // 文件名InputStream[] ins = Arrays.stream(fileArray).map(url -> {byte[] bytes = HttpUtil.downloadBytes(url); // 上传到内存中fileName.add(url.substring(url.lastIndexOf("/") + 1)); // 文件名atomicAdd.addAndGet(bytes.length);return new ByteArrayInputStream(bytes);}).toArray(InputStream[]::new);ByteArrayOutputStream byteStream = new ByteArrayOutputStream(atomicAdd.intValue());ZipUtil.zip(byteStream, fileName.toArray(new String[0]), ins); // 参数:目标流、流数据在压缩文件中的路径或文件名、要压缩的response.setHeader("Content-Disposition", "attachment;filename=" + sku + ".zip");response.setContentType("application/octet-stream; charset=utf-8");OutputStream out = response.getOutputStream();out.write(byteStream.toByteArray());out.flush();out.close();
} catch (Exception e) {e.printStackTrace();
}

导入

一、对象导入

excelList = excelReader.readAll(....class);

二、不固定列导入

if (file.isEmpty()) {return failure("文件为空");
}
InputStream inputStream = null;
Boolean result = false; // 修改成功标志
List<Map<String,Object>> excelList = new ArrayList<>();
Obj obj = new Obj(); // excel对应的对象,其中一个字段存json数据
try {inputStream = file.getInputStream();ExcelReader excelReader = ExcelUtil.getReader(inputStream);// 检验固定列是否正确if (!"NAME".equals(excelReader.readRow(0).get(0))) {return ...} // else if ... 其余固定列的检验// 读取为Map列表,默认第一行为标题行,Map中的key为标题,value为标题对应的单元格值。excelList = excelReader.readAll();// 两种方式// excelReader.readRow(0).get(0)、excelList.get(0).get("NAME")obj.setName(excelList.get(0).get("NAME").toString());JSONObject jsonObj = new JSONObject();for (int i = 0; i < excelList.size(); i++) {JSONArray jsonArray = new JSONArray();Map<String, Object> oneObjMap = excelList.get(i);for (Map.Entry<String, Object> entry : oneObjMap.entrySet()) {JSONObject jsonObject = new JSONObject();String key = entry.getKey();Object value = entry.getValue();if ("NAME".equals(key) || ...) { // 遇到固定列则跳过continue;}jsonObject.set("name", key);jsonObject.set("value", value);jsonArray.add(jsonObject);}jsonObj.set("num" + i, jsonArray);}obj.setJsonObj(jsonObj.toString());
} catch (Exception e) {e.printStackTrace();
}

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

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

相关文章

零基础学Python网络爬虫案例实战全流程详解(入门与提高篇)

零基础学Python网络爬虫案例实战 全流程详解 入门与提高篇 零基础学Python网络爬虫案例实战 全流程详解 高级进阶篇 内容简介 在大数据时代的今天&#xff0c;无论是产品开始还是精准化营销越来越离不开大数据的支持&#xff0c;如何从浩瀚的网络中获取自己想要的大数据&…

用 Socket.D 替代原生 WebSocket 做前端开发

socket.d.js 是基于 websocket 包装的 socket.d 协议的实现。就是用 ws 传输数据&#xff0c;但功能更强大。 功能原生 websocketsocket.d说明listen有有监听消息send有有发消息sendAndRequest无有发消息并接收一个响应&#xff08;类似于 http&#xff09;sendAndSubscribe无…

PyTorch 简单易懂的实现 CosineSimilarity 和 PairwiseDistance - 距离度量的操作

目录 torch.nn子模块Distance Functions解析 nn.CosineSimilarity 功能 主要参数 输入和输出的形状 使用示例 nn.PairwiseDistance 功能 主要参数 输入和输出的形状 使用示例 总结 torch.nn子模块​​​​​​​Distance Functions解析 nn.CosineSimilarity torc…

【图神经网络导论】之第9章模型变体(刘知远)

第9章不同图类型的模型变体 文章目录 第9章不同图类型的模型变体9.1 有向图9.2 异构图9.3 带有边信息的图9.4 动态图9.5 多维图 第4章介绍的基础GNN模型"被用于处理无向图&#xff0c;这些图包含具有标签的节点&#xff0c;是最简单的图。然而&#xff0c;在现实世界中还有…

Linux基础知识点(八-POSXI互斥锁)

目录 一、互斥锁基本概念 1.1 互斥相关背景概念 1.2 互斥锁(mutex) 1.3 死锁 二、初始化互斥锁 2.1 静态初始化 2.2 动态初始化 三、获取与释放互斥锁 四、销毁互斥锁 一、互斥锁基本概念 1.1 互斥相关背景概念 临界资源&#xff1a;多线程执行流共享的资源就叫做…

【事务】事务传播级别

Spring事务定义了7种传播机制&#xff1a; PROPAGATION_REQUIRED&#xff1a;默认的Spring事物传播级别&#xff0c;若当前存在事务&#xff0c;则加入该事务&#xff0c;若不存在事务&#xff0c;则新建一个事务。 PAOPAGATION_REQUIRE_NEW&#xff1a;若当前没有事务&#x…

PyTorch 简单易懂的 Embedding 和 EmbeddingBag - 解析与实践

目录 torch.nn子模块Sparse Layers详解 nn.Embedding 用途 主要参数 注意事项 使用示例 从预训练权重创建嵌入 nn.EmbeddingBag 功能和用途 主要参数 使用示例 从预训练权重创建 总结 torch.nn子模块Sparse Layers详解 nn.Embedding torch.nn.Embedding 是 PyTo…

06.函数和模块的使用

函数和模块的使用 在讲解本章节的内容之前&#xff0c;我们先来研究一道数学题&#xff0c;请说出下面的方程有多少组正整数解。 事实上&#xff0c;上面的问题等同于将8个苹果分成四组每组至少一个苹果有多少种方案。想到这一点问题的答案就呼之欲出了。 可以用Python的程序来…

基于ssm的大湾区旅游推荐系统的设计与实现+vue论文

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统大湾区旅游景点信息管理难度大&#xff0c;容错率低&…

美创科技葛宏彬:夯实安全基础,对医疗数据风险“逐个击破”

导读 解决医疗机构“临床业务数据合规流动”与“重要数据安全防护”两大难题。 2023年11月11日&#xff0c;在2023年南湖HIT论坛上&#xff0c;HIT专家网联合杭州美创科技股份有限公司&#xff08;以下简称美创科技&#xff09;发布《医疗数据安全风险分析及防范实践》白皮书…

完成python+neo4j+django踩坑记录

使用Django进行后端控制&#xff0c;Echarts进行前端显示 例子django安装1、django启动2、django初体验3、django踩坑【已解决】You have 18 unapplied migration(s). Your project may not work properly until you apply the migra【已解决】运行neo4j出现报错 Failed to sta…

回车事件怎样绑定?

首先要记住一点&#xff0c;回车事件只能在js代码中绑定&#xff0c;在HTML中绑定是获取不到的&#xff0c;下面是我自己写的一个示例&#xff0c;大家可以参考一下。 importt.onkeydown function(event) {let val document.getElementById(importt).value;let e event || …

目标检测COCO数据集与评价体系mAP

1.mAP 2.IoU IoU也就是交并比&#xff0c;也称为 Jaccard 指数&#xff0c;用于计算真实边界框与预测边界框之间的重叠程度。它是真值框与预测边界框的交集和并集之间的比值。Ground Truth边界框是测试集中手工标记的边界框&#xff0c;用于指定目标图像的位置以及预测的边界框…

浅讲人工智能,初识人工智能几个重要领域。

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

设置5台SSH互免的虚拟机服务器配置

搭建一套集群虚拟机&#xff0c;往往都需要互免设置&#xff0c;过程很简单&#xff0c;避免以后再搭建还得网上搜索&#xff0c;我直接将这一个步骤写成笔记&#xff0c;记录下来&#xff0c;方便后续查阅。 步骤如下—— 1、准备五台机器 服务器名字服务器IPhadoop1192.16…

昇腾多卡通信教程【配置网络检测对象IP】

无法通信会出现的错误如下 一、网络健康状态报错 命令原型 hccn_tool [-i %d] -netdetect -s [address %s]命令功能 本功能支持用户执行命令获取网络健康状态&#xff08;本端与所配置的检测IP之间的连通状态&#xff09;&#xff0c;用户可指定上报的状态信息名称。 状态信…

Javaweb之Mybatis的XML配置文件的详细解析

2. Mybatis的XML配置文件 Mybatis的开发有两种方式&#xff1a; 注解 XML 2.1 XML配置文件规范 使用Mybatis的注解方式&#xff0c;主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能&#xff0c;建议使用XML来配置映射语句&#xff0c;也就是将SQL语句写在…

kotlin的抽象类和抽象方法

在 Kotlin 中&#xff0c;抽象类和抽象方法是面向对象编程中的概念&#xff0c;用于实现抽象和多态性。以下是有关 Kotlin 抽象类和抽象方法的详细信息&#xff1a; 抽象类&#xff1a; 定义&#xff1a; 抽象类是用 abstract 关键字声明的类&#xff0c;不能直接实例化。它可…

从零开始构建区块链:我的区块链开发之旅

1.引言 1.区块链技术的兴起和重要性 区块链技术&#xff0c;作为数字化时代的一项颠覆性创新&#xff0c;已经成为当今世界最令人瞩目的技术之一。自比特币的问世以来&#xff0c;区块链技术已经从仅仅支持加密货币发展成为一种具有广泛应用前景的分布式账本技术。其核心优势…

顺序表的实现(C语言)

本文章主要对顺序表的介绍以及数据结构的定义,以及几道相关例题,帮助大家更好理解顺序表. 文章目录 前言 一、顺序表的静态实现 二、顺序表的动态实现 三.定义打印顺序表函数 四.定义动态增加顺序表长度函数 五.创建顺序表并初始化 六.顺序表的按位查找 七.顺序表的按值…