Java关于Excel文件的导入导出

news2024/11/23 10:24:49

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

在这里插入图片描述


需求

  • 导出: 能够将库表内的数据导出多个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 文件
     */
    @Override
    public 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);
        //解压zip
        FileUtils.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.coloradmin.cn/o/1422276.html

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

相关文章

GPT-SoVITS 本地搭建踩坑

GPT-SoVITS 本地搭建踩坑 前言搭建下载解压VSCode打开安装依赖包修改内容1.重新安装版本2.修改文件内容 运行总结 前言 传言GPT-SoVITS作为当前与BertVits2.3并列的TTS大模型&#xff0c;于是本地搭了一个&#xff0c;简单说一下坑。 搭建 下载 到GitHub点击此处下载 http…

【三维重建】运动恢复结构(SfM)

运动恢复结构是通过三维场景的多张图像&#xff0c;恢复出该场景的三维结构信息以及每张图片对应的摄像机参数。 欧式结构恢复(内参已知&#xff0c;外参未知) 欧式结构恢复问题&#xff1a; 已知&#xff1a;1、n个三维点在m张图像中的对应点的像素坐标 2、相机内参 求解&…

指针的深入了解6

1.回调函数 回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数 时&#xff0c;被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用&#xff0…

字符串:getline、删除子串.erase()函数、插入子串.insert()函数

getline具体用法&#xff1a; 1、函数形式 getline ( cin,字符串类型&#xff1a;变量名);//默认以换行符结束 getline (cin, 字符串类型&#xff1a;变量名, ‘指定的结束符’); //指定换行结束符 2注意事项&#xff1a; 1&#xff09;如果在使用getline()之前有使用scanf(…

Java基础--异常

异常 将程序执行中发生的不正常情况称为“异常”&#xff08;语法错误和逻辑错误不是异常&#xff09;。 异常时间分为两大类&#xff1a; 1.Error&#xff08;错误&#xff09;&#xff1a;Java虚拟机无法解决的严重问题。Error 是严重错误&#xff0c;程序会崩溃。 2.Except…

【AI视野·今日NLP 自然语言处理论文速览 第七十七期】Mon, 15 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 15 Jan 2024 Totally 57 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Machine Translation Models are Zero-Shot Detectors of Translation Direction Authors Michelle Wastl, Ja…

奥威-金蝶BI方案:企业获利能力该这样看

获利能力、偿债能力、营运能力是企业经营发展中需要密切关注的三大基础能力&#xff0c;通常可通过详细的数据分析可视化来获知。那么&#xff0c;怎么分析企业获利能力&#xff1f;奥威-金蝶BI方案做了个示范。 按年看 按月看 一般来说&#xff0c;我们会做成两张报表&#x…

代码随想录算法刷题训练营day20

代码随想录算法刷题训练营day20&#xff1a;LeetCode(654)最大二叉树、LeetCode(617)合并二叉树、LeetCode(700)二叉搜索树中的搜索、LeetCode(700)二叉搜索树中的搜索、LeetCode(98)验证二叉搜索 LeetCode(654)最大二叉树 题目 代码 import java.util.Arrays;/*** Definit…

Java面试架构篇【一览众山小】

文章目录 &#x1f6a1; 简介☀️ Spring&#x1f425; 体系结构&#x1f420; 生命周期 &#x1f341; SpringMVC&#x1f330; 执行流程 &#x1f31c; SpringBoot&#x1f30d; 核心组件&#x1f38d; 自动装配&#x1f391; 3.0升级 &#x1f505; spring Cloud Alibaba&am…

Consul容器服务自动发现和更新

目录 前瞻 什么是服务注册与发现 什么是consul Docker-consul实现过程 Docker-consul集群部署 实验准备 实验流程 前瞻 什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服…

web应用课——(第一讲:html基础标签)

目录 一、html文件结构 二、文本标签 三、图片 四、音频和视频 五、超链接 六、表单 七、列表 八、表格 九、语义标签 十、特殊符号 一、html文件结构 <html>标签&#xff1a;表示一个 HTML 文档的根&#xff08;顶级元素&#xff09;&#xff0c;所以它也被…

可以举一反三的动态规划问题(最短编辑问题)

给定两个字符串 A 和 B&#xff0c;现在要将 A经过若干操作变为 B&#xff0c;可进行的操作有&#xff1a; 删除–将字符串 A 中的某个字符删除。插入–在字符串 A 的某个位置插入某个字符。替换–将字符串 A 中的某个字符替换为另一个字符。 现在请你求出&#xff0c;将 A 变…

掌握 Android JNI 基础

写在前面 最近在看一些底层源码&#xff0c;发现 JNI 这块还是有必要系统的看一下&#xff0c;索性就写一写博客&#xff0c;加深加深印象&#x1f37b; 本文重点聊一聊一些干货&#xff0c;避免长篇大论 JNI 概述 JNI 是什么&#xff1f; 定义&#xff1a;Java Native In…

类和对象 第六部分 继承 第一部分:继承的语法

一.继承的概念 继承是面向对象的三大特性之一 有些类与类之间存在特殊的关系&#xff0c;例如下图&#xff1a; 我们可以发现&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性&#xff0c;这个时候&#xff0c;我们可以讨论利用继承的技术&#xff0c;…

使用antdesign3.0、echarts制作固定资产后台管理系统原型

学了半个月Axure,周末用半天时间&#xff0c;照着网上的模板做了一个固定资产后台管理系统的原型。重点是内联框架的使用&#xff0c;和对echarts表格js代码的调试。原型链接&#xff1a;https://qoz5rv.axshare.com 资产管理系统

qt 动态添加多个button按钮,并添加单击响应

qt动态添加多个button按钮简单&#xff0c;难题是如何对动态的按钮添加响应函数&#xff0c;本文解决方案有两个 方法一&#xff1a;使用信号-槽函数 QString strTemp;int nCol 6;//一行有6个for(int i 0; i < CZList.size(); i){int ii i / nCol;int jj i % nCol;strT…

Qt+css绘制标题

之前学过html和小程序&#xff0c;帮老师做项目的时候也用过vue&#xff0c;在想qt绘制界面是不是也可以使用css,然后查了一些资料&#xff0c;绘制了一个标题&#xff0c;准备用到智能家居的上位机上面。 成果 源码 重写了paintEvent函数和TimeEvent函数&#xff0c;一个用于绘…

Next.js如何正确处理跨域问题?

以前一直使用Vue来写前端。去年下半年接手了一个基于React Next.js的项目&#xff0c;于是顺带学习了一下Next.js。由于Next.js的特点&#xff0c;这个项目的前后端是放在一起的。一开始没什么问题&#xff0c;看了半天文档就上手了。 上周我们需要在另一个网页项目中&#x…

基于DataX完成数据导入-仅新增方案

仅新增方式: 订单退款表为例, 探讨如何完成仅新增方式导入操作 从业务库将数据导入到ODS层, 分为 首次导入和增量导入两部分, 其中首次导入指的第一次建表, 导入数据, 此时一般都是全量导入, 后续每一天都是采用增量导入的方式, 当前项目, 增量模式: T1(当天处理都是上一天的数…

Vue中嵌入原生HTML页面

Vue中嵌入html页面并相互通信 需求&#xff1a;b2b支付需要从后获取到数据放到form表单提交跳转&#xff0c;如下&#xff1a; 但是vue目前暂时没找到有类似功能相关文档&#xff0c;所以我采用iframe嵌套的方式 1. Vue中嵌入Html <iframe src"/static/gateway.htm…