使用hutool库,对excel进行一些导出、导入操作

2023-10-27

所用到的各种类,依赖的话百度一下吧,最后再给上全部代码

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.domain.MagBackAmountInfo;
import com.domain.ReturnResult;
import com.example.service.impl.MagBackAmountInfoServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

导出数据为excel的接口代码

    @GetMapping("/testExport")
 public void test(HttpServletRequest request, HttpServletResponse response){
     int pageStart = Integer.parseInt(request.getParameter("Pagenumber"));
     int pageSize = Integer.parseInt(request.getParameter("number"));
     /** 这里写你自己获取数据的方法*/
        List<MagBackAmountInfo> magBackAmountInfos = backAmountInfoService.selectByPrimarybyid(null);

        ExcelWriter writer = ExcelUtil.getWriter(true);
        /** 这里的作用是将你的字段与excel展示名称做匹配 */
     Map<String,String> map = new HashMap<>();
     map.put("backAmountId","VIN");
     map.put("makeInvocId","ICCID");
     map.put("customerName","客户名称");
     map.put("vehiclesName","车系名称");
     map.put("vehicleModel","车型名称");
     map.put("vehicleConf","配置名称");
     map.put("customerType","客户类型");
     map.put("activedTime","实销通过日期");
     map.put("realStatus","实名状态");
     writer.setHeaderAlias(map);
     /** 这里的作用时,写出之后不展示你的字段名,只展示你设置的别名,客户类型,实销通过日期。这些 */
     writer.setOnlyAlias(true);
     writer.write(magBackAmountInfos,true);
     response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
     response.setHeader("Content-Disposition","attachment;filename=RealnameRechargeBlack.xlsx");
     ServletOutputStream out= null;
     try {
         out = response.getOutputStream();
         writer.flush(out, true);
         // 关闭writer,释放内存
         writer.close();
         //此处记得关闭输出Servlet流
         IoUtil.close(out);
     } catch (IOException e) {
         e.printStackTrace();
     }
 }

导入时提供模板的接口代码

  @ResponseBody
    @RequestMapping(value = "/moban", method = RequestMethod.GET)
    public void moban(HttpServletRequest request, HttpServletResponse response){

        ExcelWriter writer = ExcelUtil.getWriter(true);
        List<String> row = CollUtil.newArrayList("backAmountId", "makeInvocId", "customerName", "vehiclesName","vehicleModel","vehicleConf","customerType","activedTime","realStatus");
        List<String> secRow = CollUtil.newArrayList("VIN", "ICCID", "客户名称", "车系名称","车型名称","配置名称","客户类型","实销通过日期-(yyyy-MM-dd HH:mm:ss)","实名状态");
        writer.writeHeadRow(row);
        writer.writeRow(secRow);
        /** 这里说是隐藏,但是其实就是将高度置为0,有点鸡肋 */
        writer.getSheet().getRow(0).setZeroHeight(true);
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        response.setHeader("Content-Disposition","attachment;filename=RealnameRechargeBlack.xlsx");
        ServletOutputStream out= null;
        try {
            out = response.getOutputStream();
            writer.flush(out, true);
            // 关闭writer,释放内存
            writer.close();
            //此处记得关闭输出Servlet流
            IoUtil.close(out);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

导入接口代码

    //导入excel
    @PostMapping("/import")
    public ReturnResult importExcel(@RequestParam("file") MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        if (file==null|| file.isEmpty()){
            return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "上传文件为空,请重新上传");
        }
        else if (!suffix.equals("xls")&&!suffix.equals("xlsx")){
            return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "文件格式错误,请上传excel文件");
        }
        ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
        /** 因为模板中有两行为提示信息,所以这儿设置从0,2之后读取 */
        List<MagBackAmountInfo> blackDtos = reader.read(0, 2, MagBackAmountInfo.class);
        if (blackDtos.size() == 0) {
            return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "文件数据为空,请重新上传");
        } else {
            /** 可以直接批量插入,也可以在service层做一些关键值的判断 */
             backAmountInfoService.batchInsert(blackDtos);
          return   ReturnResult.ok();
        }
    }

完整class代码

package com.example.demo;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.domain.MagBackAmountInfo;
import com.domain.ReturnResult;
import com.example.service.impl.MagBackAmountInfoServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
//允许跨域访问
@CrossOrigin
@RequestMapping("/member")
public class ExcelController {

    @Autowired
    MagBackAmountInfoServiceImpl backAmountInfoService;

    @GetMapping("/testExport")
 public void test(HttpServletRequest request, HttpServletResponse response){
     int pageStart = Integer.parseInt(request.getParameter("Pagenumber"));
     int pageSize = Integer.parseInt(request.getParameter("number"));
     /** 这里写你自己获取数据的方法*/
        List<MagBackAmountInfo> magBackAmountInfos = backAmountInfoService.selectByPrimarybyid(null);

        ExcelWriter writer = ExcelUtil.getWriter(true);
        /** 这里的作用是将你的字段与excel展示名称做匹配 */
     Map<String,String> map = new HashMap<>();
     map.put("backAmountId","VIN");
     map.put("makeInvocId","ICCID");
     map.put("customerName","客户名称");
     map.put("vehiclesName","车系名称");
     map.put("vehicleModel","车型名称");
     map.put("vehicleConf","配置名称");
     map.put("customerType","客户类型");
     map.put("activedTime","实销通过日期");
     map.put("realStatus","实名状态");
     writer.setHeaderAlias(map);
     /** 这里的作用时,写出之后不展示你的字段名,只展示你设置的别名,客户类型,实销通过日期。这些 */
     writer.setOnlyAlias(true);
     writer.write(magBackAmountInfos,true);
     response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
     response.setHeader("Content-Disposition","attachment;filename=RealnameRechargeBlack.xlsx");
     ServletOutputStream out= null;
     try {
         out = response.getOutputStream();
         writer.flush(out, true);
         // 关闭writer,释放内存
         writer.close();
         //此处记得关闭输出Servlet流
         IoUtil.close(out);
     } catch (IOException e) {
         e.printStackTrace();
     }
 }


    @ResponseBody
    @RequestMapping(value = "/moban", method = RequestMethod.GET)
    public void moban(HttpServletRequest request, HttpServletResponse response){

        ExcelWriter writer = ExcelUtil.getWriter(true);
        List<String> row = CollUtil.newArrayList("backAmountId", "makeInvocId", "customerName", "vehiclesName","vehicleModel","vehicleConf","customerType","activedTime","realStatus");
        List<String> secRow = CollUtil.newArrayList("VIN", "ICCID", "客户名称", "车系名称","车型名称","配置名称","客户类型","实销通过日期-(yyyy-MM-dd HH:mm:ss)","实名状态");
        writer.writeHeadRow(row);
        writer.writeRow(secRow);
        /** 这里说是隐藏,但是其实就是将高度置为0,有点鸡肋 */
        writer.getSheet().getRow(0).setZeroHeight(true);
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        response.setHeader("Content-Disposition","attachment;filename=RealnameRechargeBlack.xlsx");
        ServletOutputStream out= null;
        try {
            out = response.getOutputStream();
            writer.flush(out, true);
            // 关闭writer,释放内存
            writer.close();
            //此处记得关闭输出Servlet流
            IoUtil.close(out);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    //导入excel
    @PostMapping("/import")
    public ReturnResult importExcel(@RequestParam("file") MultipartFile file) throws IOException {
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        if (file==null|| file.isEmpty()){
            return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "上传文件为空,请重新上传");
        }
        else if (!suffix.equals("xls")&&!suffix.equals("xlsx")){
            return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "文件格式错误,请上传excel文件");
        }
        ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
        /** 因为模板中有两行为提示信息,所以这儿设置从0,2之后读取 */
        List<MagBackAmountInfo> blackDtos = reader.read(0, 2, MagBackAmountInfo.class);
        if (blackDtos.size() == 0) {
            return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "文件数据为空,请重新上传");
        } else {
            /** 可以直接批量插入,也可以在service层做一些关键值的判断 */
             backAmountInfoService.batchInsert(blackDtos);
          return   ReturnResult.ok();
        }
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用hutool库,对excel进行一些导出、导入操作 的相关文章

  • 如果测试用例失败,Selenium Web 驱动程序无法关闭 Firefox 实例

    我各位 我正在使用 junit 和 selenium web 驱动程序 2 28 问题是 如果我运行成功的测试用例 Web 驱动器能够关闭 Firefox 实例 但是当测试用例失败时 Selenium Web 驱动器无法关闭 Firefox
  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • 当单元格内的 JComboBox 中有 ItemEvent 时,如何获取 CellRow

    我有一个 JTable 其中有一列包含 JComboBox 我有一个附加到 JComboBox 的 ItemListener 它会根据任何更改进行操作 但是 ItemListener 没有获取更改的 ComboBox 所在行的方法 当组合框
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List

随机推荐

  • ECU-TEST 快速入门

    ECU TEST 是由位于德国德累斯顿的TraceTronic公司开发的一款用于嵌入式系统测试验证软件工具 自从2003年首次发布ECU TEST 该软件成为了汽车ECU开发的标准工具 同时也逐步成为了重型机械和工业自动化开发的标准工具 该
  • 数学建模竞赛培训:华为杯、高教社杯和数学建模国赛全面指南

    文章目录 赛事介绍 参赛好处 辅导比赛 赛事介绍 华为杯全国研究生数学建模竞赛是由华为公司主办的一项面向全国研究生的数学建模竞赛 该竞赛旨在通过实际问题的建模和解决 培养研究生的创新能力和团队合作精神 推动科技创新和应用 华为杯竞赛分为初赛
  • git commit报did not match any file known to git

    使用到以下命令时 git commit m project initialized 回车之后报错了 报了以下的错误 error pathspec initialized did not match any file s known to g
  • hive截取字符串substr和substring的用法

    第一种用法 substr string A int start 和 substring string A int start 用法一样 功效 返回字符串A从下标start位置到结尾的字符串 第二种用法 substr string A int
  • “最强”博士论文答辩阵容:6位院士,副院长任答辩秘书!

    点击 凹凸域 马上关注 更多内容 请置顶或星标 十二月份前后 是不少研究生毕业答辩的时间段 在社交媒体上 关于论文答辩的热度也逐渐上升 与此同时 也有网友注意到一些答辩委员会的阵容非常强大 比如 就有微博用户表示 其导师请了足以给博士生论文
  • layui table的实现以及详细解释

    老规矩先看效果 这里用的主要是layui 的弹框和table数据表格 第一 引入的文件 百度网盘地址 https pan baidu com s 1neZbcX8IieMgiBdcVPhO1g 提取码 rqdc 改成本地路径 这里也可以用l
  • 从 Vision 到 Language 再到 Action,万字漫谈三年跨域信息融合研究

    本文作者为阿德莱德大学助理教授吴琦 他在为雷锋网 AI 科技评论投递的独家稿件中回顾了他从跨领域图像识别到 Vision to Language 相关的研究思路 如今正将研究领域延伸到与 Action 相关的工作 雷锋网 AI 科技评论对文
  • 6.63 猜数字之生成随机数

    1 生成 m n 的随机数 m n 的元素个数为 n m 1 若利用模进行 n m 1 运算 其结果为 0 n m 此时左右两边同加 m 其结果为 m n void TestRand 生成 m n 的随机数 rand n m 1 m sra
  • Django图书商城系统实战开发 - 实现个人中心管理

    Django图书商城系统实战开发 实现个人中心管理 介绍 在本项目中 我们已经实现了登录注册 商品详情查看 购物车购买 个人订单管理 评价功能 接下来 我们将完成个人中心管理的模块 包括个人密码修改 个人地址管理和注销功能 本文将详细介绍如
  • I2C总结(单主机和多主机)

    I2C在使用过程中单个主机是不论是硬件I2C还是硬件I2C都不太难 理解好时序很容易实现 还有就是很多人认为硬件I2C有很多缺点 其实这是谬论吧 硬件I2C在稳定性上胜过软件I2C 而且不占用MCU时间 可以实现I2C中断 如果系统有硬件I
  • Java开发快速上手!3分钟就能完成的Redis主从复制搭建,完整PDF

    前言 高并发 几乎是每个程序员都想拥有的经验 原因很简单 随着流量变大 会遇到各种各样的技术问题 比如接口响应超时 CPU load升高 GC频繁 死锁 大数据量存储等等 这些问题能推动我们在技术深度上不断精进 我们知道 高并发代表着大流量
  • 【Flutter 3-1】Flutter手把手教程UI布局和Widget——底部导航栏BottomNavigationBar使用

    作者 弗拉德 来源 弗拉德 公众号 fulade me BottomNavigationBar BottomNavigationBar 和 BottomNavigationBarItem 配合来共同展示Flutter里面的底部状态栏 底部状
  • 敏捷开发之Scrum扫盲篇

    转载至 http www cnblogs com taven archive 2010 10 17 1853386 html 现在敏捷开发是越来越火了 人人都在谈敏捷 人人都在学习Scrum和XP 为了不落后他人 于是我也开始学习Scrum
  • kerberos 术语和认证流程介绍

    重要术语 1 KDC 全称 key distributed center 作用 整个安全认证过程的票据生成管理服务 其中包含两个服务 AS和TGS 2 AS 全称 authentication service 作用 为client生成TGT
  • 操作系统的文件结构

    文件的 逻辑结构 主要有 1 连续结构 2 多重结构 3 转置结构 4 顺序结构 文件的 物理存储 主要有 1 顺序结构 2 链接结构 3 索引结构 文件的 目录结构 主要有 1 一级目录结构 2 二级目录结构 3 树形结构 4 无环图
  • Springboot定时任务

    下文为 Scheduled的使用方法 1 简介 Scheduled支持三种部署方式 fixedRate fixedRateString 上一次执行开始后 n秒后再次执 fixedDelay fixedDelayString 上一次执行完毕后
  • 舵机的三条线分别代表什么

    橙色信号线 红色正极 棕褐色负极
  • @RequestParam和@PathVariable的用法与区别

    SpringBoot PathVariable URL变量 Web应用中的URL通常不是一成不变的 例如微博两个不同用户的个人主页对应两个不同的URL http weibo com user1和http weibo com user2 我们
  • 工厂(factory)模式

    转自 http www cnblogs com hegezhou hot archive 2010 11 30 1892227 html 一 开篇 一个多月没有写文章了 一方面是由于家庭的原因 还有一方面是因为工作上的原因 所以在这里给大家
  • 使用hutool库,对excel进行一些导出、导入操作

    所用到的各种类 依赖的话百度一下吧 最后再给上全部代码 import cn hutool core collection CollUtil import cn hutool core io IoUtil import cn hutool p