Java关于Excel文件的导入导出

人生如梦 荣华富贵 如木槿之花 朝荣夕逝

在这里插入图片描述


需求

  • 导出: 能够将库表内的数据导出多个Excel表,并且生成一个压缩包,提供用户下载
  • 导入: 能够将一个压缩包内的多个Excel表解压,并获取表内的所有数据

在这里插入图片描述

FileUtils 工具类

public class UnitFileUtils {/*** @Description: 导入文件(返回文件全部数据)*/public static Map<String, List<List<String>>> importCsv(File file) throws IOException {String tableName = file.getName().replace(".csv", "");Map<String, List<List<String>>> result = new HashMap<>();List<List<String>> dataList = new ArrayList<>();BufferedReader br = null;try {br = new BufferedReader(new FileReader(file));String line;while ((line = br.readLine()) != null) {String[] data = line.split(",");List<String> list = new ArrayList<>();for (int i = 0; i < data.length; i++) {list.add(data[i]);}dataList.add(list);}} catch (Exception e) {throw new RuntimeException(e);} finally {br.close();}result.put(tableName, dataList);return result;}/*** @Description: 导出文件*/public static void exportCsv(List<List<String>> listData, String tableName, String path) {path = path + File.separator + tableName + ".csv";try (FileWriter writer = new FileWriter(path)) {for (List<String> list : listData) {StringBuilder rowData = new StringBuilder();for (int i = 0; i < list.size(); i++) {if (i == list.size()) {rowData.append(list.get(i));} else {rowData.append(list.get(i)).append(",");}}writer.write(rowData.toString());writer.write(System.lineSeparator());}} catch (IOException ex) {throw new RuntimeException(ex);}}
}

Impl 实现类

    /*** @Description: 文件导入* multipartFile 文件*/@Overridepublic void importCsv(MultipartFile multipartFile) throws IOException, SQLException {// 获取导入文件数据List<Map<String, List<List<String>>>> fileDataList = transformImportCsv(multipartFile);.../*** @Description: 文件数据解析*/public List<Map<String, List<List<String>>>> transformImportCsv(MultipartFile multipartFile) throws IOException, SQLException {// 获取临时文件夹对象File tempDir = new File(tempPath);// 如果文件夹不存在,则抛出异常if (!tempDir.exists()) {tempDir.mkdirs();}//生成临时文件名称String fileName = UUID.randomUUID().toString().replace("-", "");//通过multipartFile将压缩文件保存到临时路径String temp = FileUtils.saveZipFile(multipartFile, tempPath);//解压zipFileUtils.unzip(temp, tempPath + fileName);//读取解压文件File folder = new File(tempPath + fileName);File[] files = folder.listFiles();List<Map<String, List<List<String>>>> fileList = new ArrayList<>();Map<String, List<List<String>>> fileData = null;for (File file : files) {//遍历zip中的csv文件fileData = UnitFileUtils.importCsv(file);fileList.add(fileData);}//删除临时文件夹以及压缩文件FileUtils.deleteFileOrDir(temp);FileUtils.deleteFileOrDir(tempPath + fileName);return fileList;}/*** @Description: 导出文件*/public void exportCsv(HttpServletResponse response, List<String> tableNames) {String dirName = tempPath + File.separator + UUID.randomUUID().toString().replace("-", "");// 获取临时文件夹对象File tempDir = new File(dirName);// 如果文件夹不存在,则创建if (!tempDir.exists()) {tempDir.mkdirs();}//导出csv文件到指定文件夹for (String tableName : tableNames) {try {List<List<String>> listData = new ArrayList<>();...UnitFileUtils.exportCsv(listData, "unit_sharding_version", path);} catch (Exception e) {throw new RuntimeException("导出表【" + tableName + "】失败!",e);}}//将文件夹压缩为压缩包FileUtils.zip(dirName, dirName + ".zip");//通过流返回FileUtils.doGet(dirName + ".zip", response);//删除临时文件夹以及压缩文件FileUtils.deleteFileOrDir(dirName);FileUtils.deleteFileOrDir(dirName + ".zip");}

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

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

相关文章

【开发】长期项目与代码质量,对抗软件工程复杂度(设计、重构、规范)

【开发】长期项目与代码质量&#xff0c;对抗软件工程复杂度&#xff08;设计、重构、规范&#xff09; 文章目录 一、设计模式与设计原则二、历史债务与代码重构1、技术债务的来源2、重构—无奈之举3、工程一致性&#xff1a;有效控制技术债务积累的主要手段 一、设计模式与设…

基于ssm和微信小程序的健身房私教预约管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

Postman-接口测试教程

接口是软件开发中常用的概念&#xff0c;是软件生产过程中比较核心的任务。对于接口开发者&#xff0c;调试接口是一件较为繁琐的事情&#xff0c;很多时候需要线上线下来回切换。在这里&#xff0c;我就跟大家介绍一个只需要在本地就可以调试接口的方法&#xff0c;即使用post…

java大文件分片上传

1.效果图 2.前端html <!DOCTYPE html> <html> <head></head> <body> <form><input type"file" id"fileInput" multiple><button type"button" onclick"upload()" >大文件分片上传&l…

计算机网络_1.3电路交换、分组交换和报文交换

1.3电路交换、分组交换和报文交换 一、电路交换1、“电路交换”例子引入2、电路交换的三个阶段3、计算机之间的数据传送不适合采用电路交换 二、分组交换1、发送方&#xff08;1&#xff09;报文&#xff08;2&#xff09;分组&#xff08;3&#xff09;首部 2、交换节点3、接收…

LeetCode 使循环数组所有元素相等的最少秒数

地址&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 难度&#xff1a;中等 题目描述&#xff1a;给你一个下标从 0 开始长度为 n 的数组 nums 。 每一秒&#xff0c;你可以对数组执行以下操作&#xff1a; 对于范围在 [0, n - 1] 内的每…

代码随想录算法训练营第二十二天 |235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450.删除二叉搜索树中的节点(待补充)

235.二叉搜索树的最近公共祖先 1、题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公…

深入理解二叉树:遍历、构建与性质探索的代码实现

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C语言进阶之路 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 前言一、二叉树的存储结构二、二叉树链式结构的实现三、二叉树的前、中、后续遍历&…

【数据结构 07】AVL树

目录 一、二叉搜索树 二、AVL树 2.1 左单旋 2.2 右单旋 2.3 左右双旋 2.4 右左双旋 三、AVL.h 四、test.cpp 一、二叉搜索树 二叉搜索树&#xff0c;又称二叉排序树&#xff08;Binary Search Tree&#xff09;&#xff0c;相比于普通二叉树&#xff0c;BST的特性有&a…

UE5 C++ 读取本地图片并赋值到UI上

目录 结果图 节点样式 主要代码 调试代码 结果图 节点样式 主要代码 &#xff08;注释纯属个人理解&#xff0c;可能存在错误&#xff09; // Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h&q…

Java面向对象详解

面向对象和面向过程的区别&#xff1a; 面向对象和面向过程都是对软件分析、设计和开发的一种思想&#xff0c;它指导着人们以不同的方式去分析、设计和开发软件。C语言是一种典型的面向过程语言&#xff0c;Java是一种典型的面向对象语言。 面向过程适合简单、不需要协作的事务…

Optimism的挑战期

1. 引言 前序博客&#xff1a; Optimism的Fault proof 用户将资产从OP主网转移到以太坊主网时需要等待一周的时间。这段时间称为挑战期&#xff0c;有助于保护 OP 主网上存储的资产。 而OP测试网的挑战期仅为60秒&#xff0c;以简化开发过程。 2. OP与L1数据交互 L1&#xf…

探索智能巡检机器人深度学习的奥秘

机器人深度学习&#xff08;Robot Deep Learning&#xff09;是指利用深度学习技术&#xff0c;使机器人能够从大量数据中学习和提取特征&#xff0c;进而实现自主感知、决策和行动的能力。通过深度学习算法&#xff0c;机器人可以从传感器获取的数据中自动学习模式和规律&…

微信开放平台第三方开发,实现代小程序认证申请

大家好&#xff0c;我是小悟 微信小程序认证整体流程总共分为五个环节&#xff1a;认证信息填写、平台初审、管理员验证、供应商审核和认证成功。 服务商可以代小程序发起认证申请。平台将对认证基础信息进行初步校验。通过后&#xff0c;平台将向管理员微信下发模板消息&…

Redis(十)SpringBoot集成Redis

文章目录 连接单机mvnYMLController.javaRedisConfig.java 连接集群YML问题复现 RedisTemplate方式 连接单机 mvn <!--Redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</art…

SRC实战 | 信息泄露挖掘

本文由掌控安全学院 - 叴龙 投稿 1. 信息搜集 首先老语法先搜集一波&#xff0c;毕竟没有钓鱼和sg的能力&#xff0c;只能找注册站去挖挖了。 web.title”XX大学”&&web.body”忘记密码”&&web.body”注册” 2. 漏洞挖掘 这里找到一个可以注册网站接口&…

蓝桥杯 第 1 场 小白入门赛

目录 1.蘑菇炸弹 2.构造数字 3.小蓝的金牌梦 4.合并石子加强版 5.简单的LIS问题 6.期望次数 1.蘑菇炸弹 我们直接依照题目 在中间位置的数进行模拟即可 void solve(){cin>>n;vector<int> a(n1);for(int i1;i<n;i) cin>>a[i];int ans0;for(int i2;i…

XSS haozi靶场通关笔记

XSS靶场地址&#xff1a;alert(1) 靶场的要求是输出一个内容为1的弹窗&#xff1b;这个靶场限制了输入位置只能是input code&#xff1b;而且浏览器发送内容时会自动进行url编码&#xff1b;所以重点考察的是代码的分析和基础payload构造&#xff1b;一切完成在当前页面&#…

【数据结构】链表(单链表实现+测试+原码)

1.链表 1.1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 现实中&#xff1a;链表就像是一列动车&#xff0c;一节连着一节 数据结构中的链表 注意: 1.从上图可看出…

React16源码: React中LegacyContext的源码实现

LegacyContext 老的 contextAPI 也就是我们使用 childContextTypes 这种声明方式来从父节点为它的子树提供 context 内容的这么一种方式遗留的contextAPI 在 react 17 被彻底移除了&#xff0c;就无法使用了那么为什么要彻底移除这个contextAPI的使用方式呢&#xff1f;因为它…