Java关于Excel文件的导入导出

news/2025/2/6 15:04:57/

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

在这里插入图片描述


需求

  • 导出: 能够将库表内的数据导出多个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.ppmy.cn/news/1338200.html

相关文章

JPA + ES 动态条件查询

为什么写这篇文章 网上大量关于 jpa mysql 动态条件查询的博客&#xff0c;但缺少 jpa es 动态条件查询博客&#xff0c;找到的都是质量不高的文章&#xff0c;不能真正跑通如果不用动态条件查询&#xff0c;当有多个条件进行查询时就非常麻烦&#xff0c;例如有 4 个参数&a…

C#: 软件任务栏托盘图标添加关闭软件菜单等

说明&#xff1a;在软件在任务栏右下角的系统托盘的图标添加个右键弹出菜单功能&#xff0c;案例实现右键弹窗菜单关闭软件功能。 1.添加系统托盘图标控件 NotifyIcon 2.右键打开控件属性菜单添加鼠标点击事件函数 3.事件函数添加代码 //右键点击任务栏图标弹出关闭菜单 priv…

C++类和对象——友元详解

目录 1.友元是什么 2.全局函数做友元 3.友元类 类外写成员函数 4.成员函数做友元 1.友元是什么 在生活中&#xff0c;我们的家里有客厅也有卧室 客人都能进出你家的客厅&#xff0c;但不能进入你家的卧室 但只要你允许&#xff0c;你也可以让自己的好朋友进入你的卧…

Go黑帽子(第二章)

2.0 第二章 TCP、扫描器和代理 文章目录 2.0 第二章 TCP、扫描器和代理2.1 TCP握手机制2.2 通过端口转发绕过防火墙2.3 编写一个TCP扫描器2.3.1 测试端口可用性2.3.2 执行非并发扫描2.3.3 执行并发扫描 2.4 构造TCP代理2.4.1 使用io.Reader 和io.Write2.4.2 创建回显服务器2.4.…

【Image captioning】论文阅读八—ClipCap: CLIP Prefix for Image Captioning_2021

中文标题:ClipCap: CLIP前缀用于图像描述(ClipCap: CLIP Prefix for Image Captioning) 文章目录 1. 介绍2. 相关工作3. 方法3.1 综述3.2 语言模型微调3.3 映射网络架构3.4 推理4. 结果5. 结论摘要:图像描述是视觉语言理解中的一项基础任务,模型会对给定的输入图像预测出…

STM32——智能小车

STM32——智能小车 硬件接线 B-1A – PB0 B-1B – PB1 A-1A – PB2 A-1B – PB10 其余接线参考51单片机小车项目。 1.让小车动起来 motor.c #include "motor.h" void goForward(void) {// 左轮HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);HAL_GPIO…

系统分析师-22年-下午题目

系统分析师-22年-下午题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答&#xff0c;二、三、四、五题中任选其中两题作答 试题一 (25分) 说明 某软件公司拟开发一套博客系统&#xff0c;要求能够向用户提供一个便捷发布自已心得&#xff0c;及时有效的…

Linux下如何编译C/C++代码?从.c到.exe经历了什么?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…