首页 > 编程语言 >Java后端优雅地校验Excel文件

Java后端优雅地校验Excel文件

时间:2024-12-11 11:32:45浏览次数:6  
标签:excelRow Java String Excel 校验 private validatedRow import row

在Java后端如何优雅地校验用户上传的Excel文件呢?
可以采用以下步骤实践

1. 使用Apache POI库读取Excel文件

Apache POI是一个强大的Java库,用于处理Microsoft Office文档,包括Excel文件。首先,确保在项目中引入Apache POI依赖。

Maven依赖
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
    <version>5.1.1</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

2. 创建Excel文件读取工具类

创建一个工具类来读取Excel文件内容,并将其转换为Java对象。

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ExcelReader {

    public static List<ExcelRow> readExcel(InputStream inputStream) throws Exception {
        List<ExcelRow> rows = new ArrayList<>();
        Workbook workbook = new XSSFWorkbook(inputStream);
        Sheet sheet = workbook.getSheetAt(0);
        Iterator<Row> rowIterator = sheet.iterator();

        // Skip header row
        if (rowIterator.hasNext()) {
            rowIterator.next();
        }

        while (rowIterator.hasNext()) {
            Row row = rowIterator.next();
            ExcelRow excelRow = new ExcelRow();
            excelRow.setId((int) row.getCell(0).getNumericCellValue());
            excelRow.setUri(row.getCell(1).getStringCellValue());
            excelRow.setLabel(row.getCell(2).getStringCellValue());
            excelRow.setRate(row.getCell(3).getNumericCellValue());
            excelRow.setScene(row.getCell(4).getStringCellValue());
            excelRow.setSuggestion(row.getCell(5).getStringCellValue());
            excelRow.setFrameShot(row.getCell(6).getStringCellValue());
            excelRow.setUpdateTime(row.getCell(7).getDateCellValue());
            excelRow.setCensorType(row.getCell(8).getStringCellValue());
            excelRow.setCreateTime(row.getCell(9).getDateCellValue());
            excelRow.setStatus(row.getCell(10).getStringCellValue());
            excelRow.setDealType(row.getCell(11).getStringCellValue());
            excelRow.setDealTime(row.getCell(12).getDateCellValue());
            excelRow.setFrames(row.getCell(13).getStringCellValue());
            excelRow.setStreamName(row.getCell(14).getStringCellValue());
            excelRow.setPushAppNick(row.getCell(15).getStringCellValue());
            excelRow.setOrganName(row.getCell(16).getStringCellValue());
            excelRow.setRemark(row.getCell(17).getStringCellValue());
            excelRow.setPersonId((int) row.getCell(18).getNumericCellValue());
            excelRow.setUid((int) row.getCell(19).getNumericCellValue());

            rows.add(excelRow);
        }

        workbook.close();
        return rows;
    }
}

class ExcelRow {
    private int id;
    private String uri;
    private String label;
    private double rate;
    private String scene;
    private String suggestion;
    private String frameShot;
    private java.util.Date updateTime;
    private String censorType;
    private java.util.Date createTime;
    private String status;
    private String dealType;
    private java.util.Date dealTime;
    private String frames;
    private String streamName;
    private String pushAppNick;
    private String organName;
    private String remark;
    private int personId;
    private int uid;

    // Getters and Setters
}

3. 创建校验规则

使用Hibernate Validator或其他校验框架来定义校验规则。

添加Hibernate Validator依赖
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.2.0.Final</version>
</dependency>
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
定义校验注解
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Positive;
import javax.validation.constraints.Size;
import java.util.Date;

public class ValidatedExcelRow {

    @Positive(message = "ID must be positive")
    private int id;

    @NotBlank(message = "URI cannot be blank")
    private String uri;

    @NotBlank(message = "Label cannot be blank")
    private String label;

    @Positive(message = "Rate must be positive")
    private double rate;

    @NotBlank(message = "Scene cannot be blank")
    private String scene;

    @NotBlank(message = "Suggestion cannot be blank")
    private String suggestion;

    @NotBlank(message = "Frame shot cannot be blank")
    private String frameShot;

    @NotNull(message = "Update time cannot be null")
    private Date updateTime;

    @NotBlank(message = "Censor type cannot be blank")
    private String censorType;

    @NotNull(message = "Create time cannot be null")
    private Date createTime;

    @NotBlank(message = "Status cannot be blank")
    private String status;

    @NotBlank(message = "Deal type cannot be blank")
    private String dealType;

    @NotNull(message = "Deal time cannot be null")
    private Date dealTime;

    @NotBlank(message = "Frames cannot be blank")
    private String frames;

    @NotBlank(message = "Stream name cannot be blank")
    private String streamName;

    @NotBlank(message = "Push app nick cannot be blank")
    private String pushAppNick;

    @NotBlank(message = "Organ name cannot be blank")
    private String organName;

    @Size(max = 255, message = "Remark must not exceed 255 characters")
    private String remark;

    @Positive(message = "Person ID must be positive")
    private int personId;

    @Positive(message = "UID must be positive")
    private int uid;

    // Getters and Setters
}

4. 实现校验逻辑

在读取Excel文件后,将每一行数据转换为ValidatedExcelRow对象,并进行校验。

import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.ConstraintViolation;
import java.io.InputStream;
import java.util.Set;

public class ExcelValidator {

    private static final ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    private static final Validator validator = factory.getValidator();

    public static void validateExcel(InputStream inputStream) throws Exception {
        List<ExcelRow> rows = ExcelReader.readExcel(inputStream);
        for (ExcelRow row : rows) {
            ValidatedExcelRow validatedRow = convertToValidatedRow(row);
            Set<ConstraintViolation<ValidatedExcelRow>> violations = validator.validate(validatedRow);
            if (!violations.isEmpty()) {
                StringBuilder errorMessages = new StringBuilder();
                for (ConstraintViolation<ValidatedExcelRow> violation : violations) {
                    errorMessages.append(violation.getMessage()).append("\n");
                }
                throw new IllegalArgumentException("Validation failed: " + errorMessages.toString());
            }
        }
    }

    private static ValidatedExcelRow convertToValidatedRow(ExcelRow row) {
        ValidatedExcelRow validatedRow = new ValidatedExcelRow();
        validatedRow.setId(row.getId());
        validatedRow.setUri(row.getUri());
        validatedRow.setLabel(row.getLabel());
        validatedRow.setRate(row.getRate());
        validatedRow.setScene(row.getScene());
        validatedRow.setSuggestion(row.getSuggestion());
        validatedRow.setFrameShot(row.getFrameShot());
        validatedRow.setUpdateTime(row.getUpdateTime());
        validatedRow.setCensorType(row.getCensorType());
        validatedRow.setCreateTime(row.getCreateTime());
        validatedRow.setStatus(row.getStatus());
        validatedRow.setDealType(row.getDealType());
        validatedRow.setDealTime(row.getDealTime());
        validatedRow.setFrames(row.getFrames());
        validatedRow.setStreamName(row.getStreamName());
        validatedRow.setPushAppNick(row.getPushAppNick());
        validatedRow.setOrganName(row.getOrganName());
        validatedRow.setRemark(row.getRemark());
        validatedRow.setPersonId(row.getPersonId());
        validatedRow.setUid(row.getUid());
        return validatedRow;
    }
}

5. 集成到Controller

在Spring Boot Controller中集成文件上传和校验逻辑。

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file) {
        try (InputStream inputStream = file.getInputStream()) {
            ExcelValidator.validateExcel(inputStream);
            return "File uploaded and validated successfully";
        } catch (IOException e) {
            return "Failed to read file: " + e.getMessage();
        } catch (IllegalArgumentException e) {
            return "Validation failed: " + e.getMessage();
        } catch (Exception e) {
            return "An error occurred: " + e.getMessage();
        }
    }
}

6. 处理异常

为了更好地处理异常,可以创建一个全局异常处理器。

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<String> handleIllegalArgumentException(IllegalArgumentException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception ex) {
        return new ResponseEntity<>("An error occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

总结

通过以上步骤,你可以优雅地校验前端上传的Excel文件内容字段。主要步骤包括:

  1. 使用Apache POI读取Excel文件
  2. 创建校验规则,使用Hibernate Validator定义校验注解。
  3. 实现校验逻辑,将每一行数据转换为校验对象并进行校验。
  4. 集成到Controller,处理文件上传请求。
  5. 处理异常,创建全局异常处理器以捕获和处理异常。

这种方法不仅提高了代码的可维护性和可读性,还确保了数据的完整性和有效性。

标签:excelRow,Java,String,Excel,校验,private,validatedRow,import,row
From: https://blog.csdn.net/xiongjikai/article/details/144381382

相关文章

  • java从入门到起飞 day03
    day03运算符和表达式运算符:对字面量或者变量进行操作的符号表达式:用运算符把字面量或者变量连接起来,符合java语法的式子就可以称为表达式。不同运算符连接的表达式体现的是不同类型的表达式。常见运算符小细节只有整数参与计算,结果只能得到整数,有小数部分则......
  • java从入门到起飞 day04
    day04条件判断语句ifif(表达式){语句体;}if的注意事项1.大括号建议跟在第一行末尾if(表达式){语句体;}//而不建议if(表达式){//第二行语句体;}2.语句体只有一句时,大括号省略不写(还是建议写)if(表达式)语句体;3.对布尔类型变量判......
  • Java日志追踪深度解析:构建高效问题诊断系统
    在Java应用程序的开发和运维过程中,日志追踪是一项至关重要的技术。通过有效的日志追踪,开发者可以快速定位并解决问题,提高系统的稳定性和可靠性。本文将深入探讨Java日志追踪的各个方面,包括日志框架的选择、日志级别的设定、日志格式的设计、日志存储与检索,以及日志在分布式系统......
  • (免费送源码)计算机毕业设计原创定制:Java+ssm+MySQL 心理治愈平台
    摘 要随着社会的飞速发展和信息时代的到来,我们所处的社会也在发生着前所未有的变化。这主要体现在人们的生活节奏不断加快,活动范围在不断拓展,人与人的交往越来越多,处理微妙复杂的人际关系为每个人所不可避免,各种各样的竞争强度也越来越巨大,人与人之间的收入、社会地位等差......
  • 基于Java和Vue的家庭理财管理系统设计源码-Z5yUlJ5w
    基于Java和Vue的家庭理财管理系统设计源码地址该项目是一个基于Java和Vue的家庭理财管理系统设计源码,总共包含110个文件。其中,Java源文件73个,XML配置文件10个,Vue组件8个,JavaScript文件4个,Git忽略文件2个,YAML配置文件2个,JSON配置文件2个,JAR包文件1个,属性文件1个,日志文件1个。该系统......
  • 基于Java的车险承保清单设计源码-Z5yUlJ9t
    基于Java的车险承保清单设计源码地址该项目是基于Java的车险承保清单设计源码,共包含124个文件,其中包括48个XML配置文件、40个Java源文件、21个PNG图片文件、3个Git忽略文件、3个Gradle构建文件、3个JAR包文件、2个Properties属性文件、1个Markdown文档、1个PRO文件和1个Gradlew文......
  • 基于Java和JavaScript的交通违章信息批量查询系统设计源码-Z5yUlJhy
    基于Java和JavaScript的交通违章信息批量查询系统设计源码地址该项目是一个基于Java和JavaScript的交通违章信息批量查询系统设计源码,包含62个文件,涵盖24个Java源文件、12个JavaScript脚本、8个FreeMarker模板文件、4个CSS样式表、3个XML配置文件、3个GIF图片文件、2个属性文件、2......
  • 基于Vue.js和JavaScript的泉州学校易班离校App安卓版设计源码-Z5yUlJ1v
    基于Vue.js和JavaScript的泉州学校易班离校App安卓版设计源码地址该项目是泉州某学校易班离校App安卓版的Vue.js和JavaScript设计源码,包含22个文件,主要文件类型包括6个JavaScript文件、3个Vue组件、3个配置文件、1个Git忽略文件、1个许可证文件、1个Markdown文档、1个字体文件(EOT......
  • 基于Java中的SSM框架实现智能卤菜销售平台项目【项目源码+论文说明】
    摘要随着互联网技术的高速发展,人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门就可以通过网络进行系统管理,交易等,而且过程简单、快捷。同样的,在人们的工作生活中,也就需要互联网技术来方便人们的日常工作生活,实现工作办公的自动化处理,实......
  • 基于Java中的SSM框架实现消防物资存储系统项目【项目源码+论文说明】
    摘要网络的广泛应用给生活带来了十分的便利。所以把消防物资存储管理与现在网络相结合,利用java技术建设消防物资存储系统,实现消防物资存储的信息化。则对于进一步提高消防物资存储管理发展,丰富消防物资存储管理经验能起到不少的促进作用。消防物资存储系统能够通过互联网得到......