excel导入,错误数据excel导出

news2024/11/26 14:36:56

要实现功能,非空校验,如果为空 则下载错误excel,说明错误原因
在这里插入图片描述

导入实体
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExcelDto  implements Serializable{

        /**
         * 用户名
         */
        @ExcelProperty("用户名")
        private String userName;
        /**
         * 地址
         */
        @ExcelProperty( "地址")
        private String addRess;
        /**
         * 年龄
         */
        @ExcelProperty("年龄")
        private Integer age;

}
导出excel 错误数据实体
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExcelError {
    /**
     * 行号
     */
    @Excel(name = "行号", orderNum = "0")
    @ExcelProperty("行号")
    private Integer lineNumber;

    /**
     * 数据
     */
    @Excel(name = "数据", orderNum = "1")
    @ExcelProperty("数据")
    private String data;

    /**
     * 原因
     */
    @Excel(name = "原因", orderNum = "2")
    @ExcelProperty("原因")
    private String reason;

}
controller


@RequestMapping ("/inexcel")
    public void importExcel(MultipartFile file, HttpServletResponse response,Long id) throws IOException {
        ImportExcelService iinport = new ImportExcelService(id, response);
        try {
            // 全部数控
            List<ExcelDto> objects = EasyExcel.read(new BufferedInputStream(file.getInputStream()), ExcelDto.class, iinport)
                    .sheet()
                    .doReadSync();
            // 异常数据
            List<ExcelError> errorList = iinport.ret();
            if(!CollectionUtils.isEmpty(errorList)){
                // 错误数据---发送给前端界面
                write(response,errorList);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }catch (ExcelAnalysisException e){
            e.printStackTrace();
            // 此处是查询出哪一行 , 哪一列 数据格式不对导致出问题!!!!!!!!!!!!!!!
            if (e.getCause() instanceof ExcelDataConvertException) {
                ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) e.getCause();
                String cellMsg = "";
                CellData cellData = excelDataConvertException.getCellData();
                //这里有一个celldatatype的枚举值,用来判断CellData的数据类型
                CellDataTypeEnum type = cellData.getType();
                if (type.equals(CellDataTypeEnum.NUMBER)) {
                    cellMsg = cellData.getNumberValue().toString();
                } else if (type.equals(CellDataTypeEnum.STRING)) {
                    cellMsg = cellData.getStringValue();
                } else if (type.equals(CellDataTypeEnum.BOOLEAN)) {
                    cellMsg = cellData.getBooleanValue().toString();
                }
                // excel表格:第2行,第3列,数据值为:xa,该数据值不符合要求,请检验后重新导入! 请检查其他的记录是否有同类型的错误!
                Integer rowNumber = excelDataConvertException.getRowIndex() + 1;
                Integer cellNumber = excelDataConvertException.getColumnIndex()+1;
                String errorMsg = String.format("excel表格:第%s行,第%s列,数据值为:%s,该数据值不符合要求,请检验后重新导入! 请检查其他的记录是否有同类型的错误!",rowNumber , cellNumber, cellMsg);
                System.out.println(errorMsg);
                // 写出字段类型错误文件!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                List<ExcelError> excelErrorList = new ArrayList<>();
                excelErrorList.add(new ExcelError(rowNumber,cellMsg ,errorMsg));
                write(response,excelErrorList);


            }
        }
    }

    public void write(HttpServletResponse response, List<ExcelError> excelErrorList) throws IOException {
        WriteToExcel<ExcelError> writeToExcel = new WriteToExcel<>();
        writeToExcel.createExcelToWeb(response,
                excelErrorList,
                Arrays.asList("行号","数据","原因"),
                Arrays.asList("lineNumber","data","reason"),
                "sheet1",
                "异常数据.xlsx");
    }
导入数据监听类


public class ImportExcelService extends AnalysisEventListener<ExcelDto> {

    private Long Id;
    private HttpServletResponse response ;
    List<ExcelDto> list =  new ArrayList<>();
    List<ExcelError> excelErrorList =  new ArrayList<>();

    // 行号
    int number = 0;
    public ImportExcelService(Long Id, HttpServletResponse response) {
        number = 0;
        Id = Id;
        response = response;

    }


    // 每读取一行就调用该方法
    @Override
    public void invoke(ExcelDto excelDto, AnalysisContext analysisContext) {

        if(StringUtils.isEmpty(excelDto.getAddRess()))
        {
            excelErrorList.add(new ExcelError(number,excelDto.getUserName()
                    +" - "+excelDto.getAddRess()+" - "+excelDto.getAge(),"address 为空"));
        }else if(StringUtils.isEmpty(excelDto.getUserName())){
            excelErrorList.add(new ExcelError(number,excelDto.getUserName()
                    +" - "+excelDto.getAddRess()+" - "+excelDto.getAge(),"username 为空"));
        }
        list.add(excelDto);
        number ++;
    }

    // 全部读取完成就调用该方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        if(!CollectionUtils.isEmpty(excelErrorList)){

        }
    }

    public List<ExcelError> ret(){
        return excelErrorList;
    }
}
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-spring-boot-starter</artifactId>
            <version>4.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>easyexcel</artifactId>
              <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.5</version>
        </dependency>

数据返给前端工具类,直接使用
public class WriteToExcel<T> {
    private static XSSFWorkbook workbook;
    private static XSSFSheet sheet;
    private static XSSFRow row;
    private static XSSFCell cell;
    private static File file;

    /**
     *
     * @param listData 数据
     * @param headList 表头list 例 Arrays.asList("昵称","年龄","地址");
     * @param fields   属性list 例 Arrays.asList("name","age");
     * @param sheet    sheet 名称
     * @param url      存储位置 例 C:\Users\Desktop\员工信息-1月.xlsx
     */
    public void createExcel( List<T> listData,
                             List<String> headList,
                             List<String> fields,
                             String sheet,
                             String url)  {
        //空数据
        if(CollectionUtils.isEmpty(listData)){
            return;
        }
        //保存位置null
        if(StringUtils.isEmpty(url)){
            System.err.println("保存位置null");
            return;
        }
        if(StringUtils.isEmpty(sheet)){
            sheet = "sheet1";
        }
        WriteToExcel<T> writeToExcel = new WriteToExcel<>();
        //sheet 页名称
        WriteToExcel.setSheet(sheet);
        //设置表头
        WriteToExcel.createHead(headList);
        //设置内容
        boolean flag = writeToExcel.createContent(listData,fields);
        if(flag){
            //写入文件
            WriteToExcel.writeToFile(url);
        }
    }
    public void createExcelToWeb(
            HttpServletResponse response,
            List<T> listData,
            List<String> headList,
            List<String> fields,
            String sheet,
            String name) throws IOException {
        //空数据
        if(CollectionUtils.isEmpty(listData)){
            return;
        }
        //name null
        if(StringUtils.isEmpty(name)){
            System.err.println(" name null");
            return;
        }
        if(StringUtils.isEmpty(sheet)){
            sheet = "sheet1";
        }
        WriteToExcel<T> writeToExcel = new WriteToExcel<>();
        //sheet 页名称
        WriteToExcel.setSheet(sheet);
        //设置表头
        WriteToExcel.createHead(headList);
        //设置内容
        boolean flag = writeToExcel.createContent(listData,fields);
        if(flag){
            //写入文件
            WriteToExcel.writeToFiletoWeb(response,name);
        }
    }
    //创建sheet页
    public static void setSheet(String sheetName) {
        workbook = new XSSFWorkbook();
        sheet = workbook.createSheet(sheetName);
    }
    //创建表头
    public static void createHead(List<String> headList) {
        //创建表头,也就是第一行
        row = sheet.createRow(0);
        for (int i = 0; i < headList.size(); i++) {
            cell = row.createCell(i);
            cell.setCellValue(headList.get(i));
            // 宽度
            cell.getSheet().setColumnWidth(i,20*256);
            //一般格式
            XSSFFont font = workbook.createFont();
            // 加粗
            font.setBold(true);
            font.setFontHeightInPoints((short)20);
            // 样式对象
            XSSFCellStyle style = workbook.createCellStyle();
            //背景色
            style.setFillForegroundColor(new XSSFColor(new java.awt.Color(80, 142, 198)));
            // 填充方式  全部填充
            style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            style.setFont(font);
            cell.setCellStyle(style);
        }
    }
    public  boolean createContent(List<T> contentList, List<String> fields) {
        boolean flag = true;
        //创建表内容,从第二行开始
        try {
            for (int i = 0; i < contentList.size(); i++) {
                row = sheet.createRow(i + 1);
                //遍历每一个字段
                for (int j = 0; j < fields.size(); j++) {
                    Field f = contentList.get(i).getClass().getDeclaredField(fields.get(j));
                    f.setAccessible(true);
                    // 获取属性值
                    Object field = f.get(contentList.get(i));
                    // 字段非空
                    if(ObjectUtil.isNotEmpty(field)){
                        System.out.println(field);
                        //object 强转 string
                        row.createCell(j).setCellValue(field.toString());
                    }
                }
            }
        }catch (Exception e){
            System.err.println("属性获取异常="+e.getMessage() );
            flag = false;
        }
        return flag;
    }
    //写入文件
    public static void writeToFile(String filePath){
        file = new File(filePath);
        //将文件保存到指定的位置
        try {
            workbook.write(new FileOutputStream(file));
            System.out.println("写入成功");
            workbook.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //写入文件
    public static void writeToFiletoWeb(HttpServletResponse response,String name) throws IOException {
        // 5、导出excel
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(name, "UTF-8"));
        ServletOutputStream out = response.getOutputStream();
        workbook.write(out);
        out.close();
        workbook.close();
    }


}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="te/inexcel" method="post" enctype="multipart/form-data">
    <p><input type="file" name="file"></p>
    <p><input type="submit">提交</p>
</form>
</body>
</html>

字段类型错误测试,应为数字类型!!!

(上传文件)
在这里插入图片描述
(下载的错误文件!!!)
在这里插入图片描述


用户名为空测试!!!

(上传文件)
在这里插入图片描述

(下载的错误文件!!!)
在这里插入图片描述

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

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

相关文章

JVM系统优化实践(22):GC生产环境案例(五)

您好&#xff0c;这里是「码农镖局」CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e; 除了Tomcat、Jetty&#xff0c;另一个常见的可能出现OOM的地方就是微服务架构下的一次RPC调用过程中。笔者曾经经历过的一次OOM就是基于Thrift框架封装出来的一个RPC框架导…

SAP中文界面乱码问题的分析处理实例

近期遇到用户反映主题问题&#xff0c;如下图这样的中文乱码在SAP的菜单和功能界面中随处可见。 经过一系分析检查发现导致问题的原因在于操作系统中的区域格式语言设置&#xff0c;这里用户设置是中文&#xff0c;简体汉字&#xff0c;香港特别行政区。将其变更为中文&#xf…

了解Unity编辑器之组件篇Video(二)

Video Player组件&#xff1a;用于在游戏中播放视频的组件。它提供了一系列属性来控制视频的播放、显示和交互。 1.Source&#xff08;视频源&#xff09;&#xff1a;用于指定视频的来源。可以选择两种不同的视频源类型&#xff1a; &#xff08;1&#xff09;Vieo Clip&#…

如何看待现在的 IT 行业,秋招来临,新人们又该怎么应对?

如何看待现在的 IT 行业&#xff0c;秋招来临&#xff0c;新人们又该怎么应对&#xff1f; 前言24届校招将开启easy模式&#xff1f;IT行业相比其他专业还有优势吗&#xff1f;IT行业真的不看学历吗&#xff1f;面试老不过&#xff0c;我是不是太菜了&#xff1f;怎么看待35岁裁…

【docker】docker部署mysql

目录 一、步骤二、说明三、步骤 一、步骤 1.搜索mysql镜像 2.拉取mysql镜像 3.创建容器 4.操作容器中的mysql 二、说明 1.容器内的网络服务和外部机器不能直接通信 2.容器中部署的mysql端口3306不能被外部机器和宿主机直接通信 3.外部机器和宿主机之间可以直接通信 4.宿主机和…

【Nodejs】Node.js简介

1.前言 Node 的重要性已经不言而喻&#xff0c;很多互联网公司都已经有大量的高性能系统运行在 Node 之上。Node 凭借其单线程、异步等举措实现了极高的性能基准。此外&#xff0c;目前最为流行的 Web 开发模式是前后端分离的形式&#xff0c;即前端开发者与后端开发者在自己喜…

Chatgpt Web API 创建对话,免费,不计token数量,模仿网页提交对话

Chatgpt API 是收费的&#xff0c;按token使用量计费 Chatgpt Web API 免费的&#xff0c;只要有账号就可以使用。 curl https://chat.openai.com/backend-api/conversation \-H authority: chat.openai.com \-H accept: text/event-stream \-H accept-language: zh-CN,zh;q…

项目:点餐系统1

项目简介&#xff1a;实现一个http点餐系统服务器&#xff0c;能够支持用户在浏览器访问服务器获取餐馆首页&#xff0c;进行菜品以及订单管理。 具体模型如下&#xff1a; 用户分类&#xff1a; 管理员&#xff1a;进行订单以及菜品管理&#xff08;菜品&订单的增删改查&a…

【NLP】BERT,BART和T5等LLM模型的比较

一、介绍 在这篇博文中&#xff0c;我将讨论像BERT&#xff0c;BART和T5这样的大型语言模型。到2020年&#xff0c;LLM领域取得的主要进展包括这些模型的开发。BERT和T5由Google开发&#xff0c;BART由Meta开发。我将根据这些模型的发布日期依次介绍这些模型的详细信息。在之前…

thinkphp实现无限分类(使用递归)

thinkphp实现无限分类&#xff08;使用递归&#xff09; 本文实例为大家分享了thinkphp实现无限分类的详细代码&#xff0c;希望对大家学习无限分类有所启发。 数据库&#xff1a;test 数据表&#xff1a;&#xff08;tp_category&#xff09;&#xff1a; Common/conf/conf…

Python如何读写配置文件?

目录 什么是配置文件 常见的配置文件格式 为什么要使用配置文件 Python如何读写配置文件&#xff1f; 什么是配置文件 配置文件是用于存储程序或系统的设置和配置选项的文本文件。它通常以特定的格式编写&#xff0c;以便程序或系统可以读取和解析其中的配置信息。配置文件…

汽车资讯新闻网站nodejs+vue

本汽车资讯网站有管理员和用户。管理员功能有个人中心&#xff0c;用户管理&#xff0c;汽车品牌管理&#xff0c;价格分类管理&#xff0c;经销商管理&#xff0c;汽车信息管理&#xff0c;留言板管理&#xff0c;系统管理等。用户可以查看各种汽车信息&#xff0c;还可以进行…

Spring 中一个少见的引介增强 IntroductionAdvisor

我们平时做 AOP 开发的时候&#xff0c;基本上都是增强某一个方法&#xff0c;在某一个方法执行之前或者执行之后做一些事情&#xff0c;这种叫做 PointcutAdvisor&#xff0c;实际上&#xff0c;Spring 中的 Advisor 大致可以分为两种类型&#xff0c;除了 PointcutAdvisor 之…

极简并优雅的在IDEA使用Git远程拉取项目和本地推送项目

连接Git 搜索Git然后将你下载好的Git的文件目录位置给他弄进去就行 本地分支管理 分支管理通常是在IDEA的右下角找到 连接远程仓库 方法1本地项目推送到远程仓库 如果当前项目还没交给Git管理的则按照以下图所示先将项目交给Git管理 然后此时文件都会是红色的&#xff0c;这表…

3.矩阵常用操作

文章目录 线性代数的常用操作1.向量的内积2.向量的外积3.正交向量4.正交向量组5.向量空间的基与维数6.正交矩阵7.反对称矩阵8.齐次坐标与齐次变换矩阵9.相似矩阵10.相似对角化11.矩阵的特征分解12.奇异值分解SVD12.1 SVD求齐次矩阵方程的最小二乘解 13.满秩分解14.Pseudo-Inver…

Python入门【 控制语句和逻辑思维、选择结构(条件判断结构)双分支选择结构、多分支选择结构、循环结构、while循环 】(七)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

LeetCode·每日一题·2208. 将数组和减半的最少操作次数·优先队列

作者&#xff1a;小迅 链接&#xff1a;https://leetcode.cn/problems/minimum-operations-to-halve-array-sum/solutions/2357852/you-xian-dui-lie-zhu-shi-chao-ji-xiang-x-805n/ 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 著作权归作者所有。商业转载请联系作…

如何打开工业相机(海康)与halcon方式打开

使用海康相机&#xff0c;下载对应的客户端软件 地址&#xff1a;https://www.hikrobotics.com/cn/machinevision/service/download 界面如下&#xff1a; 使用 halcon 读取相机&#xff0c;需要将对应的动态链接库dll文件放入halcon的安装目录中&#xff0c;如下&#xff0c;…

Linux中的chmod命令使用方法总结

chmod命令用于更改文件或目录的权限chmod命令的基本语法如下&#xff1a;范例研究&#xff1a;rwx权限对于文件和目录的作用 chmod命令用于更改文件或目录的权限 它允许用户控制谁可以读取、写入和执行文件。 权限由三个组成部分组成&#xff0c;分别是所有者权限、所属组权限…

企业邮箱选购:选择最适合您的方案

作为一名公司员工&#xff0c;你需要一个专业且令人难忘的公司电子邮件地址。毕竟无论何时你和你的联系人交流&#xff0c;你都代表着你公司的品牌。但是你应该选择什么样的公司电子邮件地址呢? 首先&#xff0c;考虑使用你公司的域名作为你的公司电子邮件地址。这是最专业的方…