首页 > 其他分享 >Springboot3学习(7、POI实现导入导出)

Springboot3学习(7、POI实现导入导出)

时间:2024-10-22 19:18:27浏览次数:8  
标签:userList createCell 导入 user POI new Springboot3 row

Springboot3学习——POI实现导入导出(七)

1、POI介绍

‌Apache POI 是一种流行的 API,允许程序员使用 Java 程序创建、修改和显示 MS Office 文件。 它是由 Apache Software Foundation 开发和分发的开源库,用于使用 Java 程序设计或修改 Microsoft Office 文件。 它包含将用户输入数据或文件解码为 MS Office 文档的类和方法。

几乎所有的项目,都会涉及对office文件的操作,本文我们在springboot项目中,使用POI实现excel的导入导出功能

2、pom.xml添加依赖poi-ooxml

		<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.3.0</version>
        </dependency>

3、导入

1、controller层修改

@PostMapping(value="/users", consumes = "multipart/form-data")
    public String importUsers(@RequestPart MultipartFile file) {
        try {
            List<User> userList = userService.importUsers(file.getInputStream());
            return "导入成功";
        } catch (Exception e) {
            e.printStackTrace();
            return "导入失败";
        }
    }

2、serviceImpl层修改

@Override
    public List<User> importUsers(InputStream inputStream) throws Exception {
        List<User> userList = new ArrayList<>();

        Workbook workbook = WorkbookFactory.create(inputStream);
        Sheet sheet = workbook.getSheetAt(0); // 假设用户信息在第一个 Sheet 中

        Iterator<Row> rowIterator = sheet.iterator();
        Date now=new Date();
        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();
            if (row.getRowNum() == 0) { // 跳过表头
                continue;
            }

            User user = new User();
            user.setUserid(new DataFormatter().formatCellValue(row.getCell(0)));
            user.setUsername(new DataFormatter().formatCellValue(row.getCell(1)));
            user.setDept(new DataFormatter().formatCellValue(row.getCell(2)));
            user.setPassword(new DataFormatter().formatCellValue(row.getCell(3)));
            user.setGender(new DataFormatter().formatCellValue(row.getCell(4)));
            user.setTransdatetime(now);
            user.setStatus("1");
            user.setCreateuid("sys");
            userList.add(user);
        }
        workbook.close();
        userList.forEach(user -> userMapper.insert(user));
        return userList;
    }

3、测试

运行,访问swagger,调用对应接口,成功,如下图

1729594104427_CABD2F7A-94FC-41c1-A5FB-91C2EF573AC9

3、导出

1、controller层修改

@GetMapping("/users")
    public void exportUsers(HttpServletResponse response) {
        try {
            List<User> userList = userService.selectAll(); // 假设获取所有用户信息的方法
            userService.exportUsers(userList, response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2、serviceImpl层修改

@Override
    public void exportUsers(List<User> userList, HttpServletResponse response) throws Exception {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("用户信息");

        // 创建表头
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("USERID");
        headerRow.createCell(1).setCellValue("USERNAME");
        headerRow.createCell(2).setCellValue("DEPT");
        headerRow.createCell(3).setCellValue("GENDER");
        // 添加更多字段...

        // 写入数据
        int rowNum = 1;
        for (User user : userList) {
            Row row = sheet.createRow(rowNum++);
            row.createCell(0).setCellValue(user.getUserid());
            row.createCell(1).setCellValue(user.getUsername());
            row.createCell(2).setCellValue(user.getDept());
            row.createCell(3).setCellValue(user.getGender());
        }

        // 设置响应头
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        //response.setHeader("Content-Disposition","attachment;filename=用户表.xlsx");
        response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("用户表.xlsx","UTF-8"));
        // 输出到响应流
        workbook.write(response.getOutputStream());
        workbook.close();
    }

3、测试

运行,访问swagger,调用对应接口,准备导入excel,如下图

image-20241022190256750

上传文件,导入成功

1729594179816_1C7AC612-A863-429c-98D4-223B36A19D27

查看数据库,数据插入成功

1729594189915_7617EEE2-F856-4857-9C69-0AEBE6B022AE

遇到的问题

ps:实际测试过程中,也是出现了一些问题,分享记录下

1、在导出时,因为设置的导出名称为中文,导致报如下错:The Unicode character [用] at code point [29,992] cannot be encoded as it is outside the permitted range of 0 to 255

img

解决方法,中文编码为utf-8转码即可

response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode("用户表.xlsx","UTF-8"));

2、导入时,报了如下错,Cannot get a STRING value from a NUMERIC cell

img

原因是,我导入的模板,密码写的是123,识别为了int类型,做如下修改即可

user.setPassword(new DataFormatter().formatCellValue(row.getCell(3)));

user.setPassword(row.getCell(3).getStringCellValue());

标签:userList,createCell,导入,user,POI,new,Springboot3,row
From: https://blog.csdn.net/weixin_38696566/article/details/143166287

相关文章

  • oracle重启及impdb导入
    oracle重启停止Oracle服务sqlplus/assysdbashutdownimmediate;停止Oracle监听器sqlplus/assysdbalsnrctlstop;从Oracle安装用户开启sqlplus/assysdbastartupexit启动监听器$ORACLE_HOME/bin/lsnrctlstartimpdb导入创建逻辑目录sqlplus/assysdba......
  • HDFS 重要机制之 checkpoint
    核心概念hdfscheckpoint机制对于namenode元数据的保护至关重要,是否正常完成检查点是评估hdfs集群健康度和风险的重要指标editslog:对hdfs操作的事务记录,类似于wal,editlog文件以edits_开头,后面跟一个txid范围段,并且多个editlog之间首尾相连,正在使用的editl......
  • SciTech-Mathematics-Probability+Statistics-Distribution: distributionFitter(分布
    说明distributionFitter(分布拟合器)以交互方式对导入MATLAB®工作区的数据进行概率分布拟合。您可以从22个内置概率分布集合进行选择,也可以创建您自己的自定义分布。该App在数据直方图上叠加显示拟合分布图。可用的绘图包括:PDF(概率密度函数)、CDF(累积分布......
  • [POI2012] Cloakroom - Solution
    POI2012Cloakroom题目描述(搬自洛谷)有\(n\)件物品,每件物品有三个属性\(a_i,b_i,c_i\(a_i<b_i)\)。再给出\(q\)个询问,每个询问由非负整数\(m,k,s\)组成,问是否能够选出某些物品使得:对于每个选的物品\(i\),满足\(a_i\lem\)且\(b_i>m+s\)。所有选出物品的\(c_i......
  • 四,Java泛型、静态导入和可变参数
    Java泛型、静态导入和可变参数的详细指南在Java编程中,泛型、静态导入和可变参数是提高代码的重用性、类型安全和灵活性的重要特性。这些特性使得Java程序更加强大和易于维护。本文将详细介绍这些特性的使用方法和注意事项,并提供丰富的代码示例。泛型泛型是Java5引入的一项特性......
  • MongoDB数据备份&导入导出&同步
    mongodump&mongorestore单库备份##-o输出目录mongodump--host127.0.0.1--port27032-uxxx-pxxx--dbtest2--oplog-o./test2全库备份--oplog只能在副本集中使用,因为副本集初始化的时候生成oplog,单实例使用--oplog会报错。mongodump--host127.0.0.1--port......
  • Dell服务器导入idrac 授权文件 (适用iDRAC7、iDRAC8、iDRAC9)
    iDRACEnterprise、iDRACDatacenter和CMCEnterprise的30天试用许可证,供熟悉高级功能集,例如使用虚拟控制台等OpenManageEnterpriseAdvanced或Advanced+许可证支持高级功能,例如自动部署、服务器配置合规性和激活可用插件,如OpenManageEnterprisePowerManager......
  • PointWeb: Enhancing Local Neighborhood Features for Point Cloud Processing——点
    此内容是论文总结,重点看思路!!文章概要本文研究如何有效聚合局部特征,提高点云数据的识别性能,提出了一种新的处理点云的方法PointWeb,旨在从局部邻域中提取上下文特征。与之前的方法不同,PointWeb通过密集连接局部邻域中的每个点,从而基于该区域的特性来调整每个点的特征。主要创......
  • springboot3.0自动配置
    目标本文主要介绍springboot3.0是如何创建一个可以进行自动配置的jar包的自动配置的定义是,一个jar包里面定义了一些spring的bean,当导入这个jar包的时候会自动将这些bean导入进去方法创建AutoConfiguration.imports文件创建目录META-INF/spring/org.springframework.boot.a......
  • 论文翻译:arxiv-2024.Dillon Bowen.Scaling Laws for Data Poisoning in LLMs
    ScalingLawsforDataPoisoninginLLMshttps://arxiv.org/pdf/2408.02946论文主要研究了大型语言模型在数据中毒威胁下的脆弱性,发现模型规模越大,对有害行为的学习速度越快,强调了在更大模型中建立健全数据保护措施的必要性。在大型语言模型(LLMs)中数据投毒的规模法则......