检查Excel内容是否符合规范

这篇具有很好参考价值的文章主要介绍了检查Excel内容是否符合规范。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码一:

package com.ly.cloud.config;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author 
 * @Date Created in  2023/12/12 17:46
 * @DESCRIPTION:
 * @Version V1.0
 */
@Getter
@Slf4j
@Component
public class ExcelListenerConfig<T> extends AnalysisEventListener<T> {
    /**
     *  定义一个全局的读取header的map,方便其他地方使用改数据,当然要是你存进数据库那就更方便取了
     */
    private final Map<Integer, String> userHeaderMap = new HashMap<>();
    /**
     * excel主数据
     */
    @Setter
    private List<T> userExcelList = new ArrayList<>();

    /**
     * excel的主数据是在这个生命周期读取的
     */
    @Override
    public void invoke(T t, AnalysisContext analysisContext) {
        userExcelList.add(t);
    }

    /**
     * 解析完excel需要干的事情
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("已解析完所有数据!");
    }

    /**
     * excel头部数据
     */
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        // 存到全局的map中
        userHeaderMap.putAll(headMap);
    }

}

代码二:

package com.ly.cloud.util;

import com.alibaba.excel.EasyExcel;
import com.ly.cloud.config.ExcelListenerConfig;
import com.ly.cloud.dto.PzrtExportDto;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.xml.bind.ValidationException;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Author 
 * @Date Created in  2023/12/12 17:11
 * @DESCRIPTION: 检查传入的文件格式【文件格式,预期的参数列, 文件头内容, 文件头顺序】是否符合要求
 * @Version V1.0
 */

public class ExcelValidator {
    private static final Logger logger = LoggerFactory.getLogger(ExcelValidator.class);
    /**
     * 允许的文件格式
     */
    private static final List<String> ALLOWED_EXTENSIONS = Collections.singletonList("xlsx");
    /**
     * 预期的文件列
     */
    private static final Integer COLUMN_COUNT = 12;
    /**
     * 预期的参数列
     */
    private static final List<String> EXPECTED_HEADERS = Arrays.asList(
            "序号", "单位编号", "所属单位", "印信事项类别编号", "印信事项类别", "业务经办人名称", "业务分管领导", "业务正职领导", "分管校领导", "主要校领导", "版本号"
    );

    public static String validateExcelFile(MultipartFile file) throws IOException, InvalidFormatException {
        // 校验文件是否为空
        if (file == null || file.isEmpty()) {
            throw new RuntimeException("文件不允许为空");
        }

        // 校验文件格式
        String fileExtension = getFileExtension(Objects.requireNonNull(file.getOriginalFilename()));
        if (!ALLOWED_EXTENSIONS.contains(fileExtension)) {
            throw new RuntimeException("文件格式有误");
        }
        // 校验文件内容
        try {
            ExcelListenerConfig listener = new ExcelListenerConfig();
            List userExcelList = listener.getUserExcelList();
            logger.info("拿到的集合内容是:{}", userExcelList.toString());
            // 读取 文件列头
            EasyExcel.read(file.getInputStream(), PzrtExportDto.class, listener).sheet(0).doRead();
            // 读取转成的Java对象
            logger.info("===========Excel Header数据===========");
            Map map = listener.getUserHeaderMap();
            Optional.ofNullable(map)
                    .ifPresent(headers -> {
                        headers.forEach((k, v) -> {
                            System.out.println("我的文件头格式是:" + k + v);
                            if (StringUtils.isEmpty(v) || !EXPECTED_HEADERS.contains(v)) {
                                logger.error("文件格式有误");
                                throw new RuntimeException("文件格式有误");
                            }
                        });
                    });
            //检查EasyExcel 表头顺序是否与规定得一致
            Map headerMap = listener.getUserHeaderMap();
            for (int i = 0; i < EXPECTED_HEADERS.size(); i++) {
                String expectedHeader = EXPECTED_HEADERS.get(i);
                String actualHeader = null;
                if (headerMap != null) {
                    actualHeader = (String) headerMap.get(i);
                }

                if (StringUtils.isEmpty(actualHeader) || !expectedHeader.equals(actualHeader)) {
                    logger.error("文件表头顺序有误");
                    throw new RuntimeException("文件表头顺序有误");
                }
            }

            //检查文件的列是否多余10列。
            Field[] fields = PzrtExportDto.class.getDeclaredFields();
            int columnCount = fields.length;
            logger.info("当前有几列:{}", columnCount);
            if (columnCount > COLUMN_COUNT) {
                throw new RuntimeException("文件格式有误");
            }
        } catch (IOException e) {
            throw new RuntimeException("文件格式有误" + e);
        }
        return "";
    }

    /**
     * 判断 一些文字是否用英文逗号隔开
     */
    public static void validateExcelData(List<?> excelList) {
        for (Object obj : excelList) {
            if (obj instanceof PzrtExportDto) {
                PzrtExportDto entity = (PzrtExportDto) obj;
                if (!isValidNamesOrEmpty(Optional.ofNullable(entity.getYwjbrmc()).orElse(""))) {
                    throw new RuntimeException("业务人名称格式不正确: " + entity.getYwjbrmc());
                }

                // 验证业务分管领导
                if (!isValidNamesOrEmpty(Optional.ofNullable(entity.getYwfgld()).orElse(""))) {
                    throw new RuntimeException("业务分格式不正确: " + entity.getYwfgld());
                }

                // 验证业务正职领导
                if (!isValidNamesOrEmpty( Optional.ofNullable(entity.getYwzzld()).orElse(""))) {
                    throw new RuntimeException("业务格式不正确: " + entity.getYwzzld());
                }

                // 验证分管校领导
                if (!isValidNamesOrEmpty(Optional.ofNullable(entity.getFgxld()).orElse(""))) {
                    throw new RuntimeException("分管格式不正确: " + entity.getFgxld());
                }

                // 验证主要校领导
                if (!isValidNamesOrEmpty(Optional.ofNullable(entity.getZyxld()).orElse(""))) {
                    throw new RuntimeException("主要格式不正确: " + entity.getZyxld());
                }
            }
        }
    }

    public static void main(String[] args) {
        String names = "";
        String regex = "^([\\u4e00-\\u9fa5]+\\([a-zA-Z0-9]+\\),)*[\\u4e00-\\u9fa5]+\\([a-zA-Z0-9]+\\)$";
//        String regex = "^([\\u4e00-\\u9fa5]+\\([a-zA-Z0-9]+\\),?)*[\\u4e00-\\u9fa5]+\\([a-zA-Z0-9]+\\)$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(names);
        boolean isMatch = matcher.find();

        System.out.println("格式是否匹配" + isMatch);
        System.out.println("=====" + isMatch);
    }
    /**
     * 验证多个姓名格式,用英文逗号隔开,允许为空
     */
    private static boolean isValidNamesOrEmpty(String names) {
        if (names.isEmpty()) {
            System.out.println(names);
            return true;
        }
        String regex = "^([\\u4e00-\\u9fa5]+\\([a-zA-Z0-9]+\\),)*[\\u4e00-\\u9fa5]+\\([a-zA-Z0-9]+\\)$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(names);
        boolean isMatch = matcher.find();

        System.out.println("格式是否匹配" + isMatch);
        System.out.println("=====" + isMatch);
        return isMatch;
    }



    private static String getFileExtension(String fileName) {
        int lastDotIndex = fileName.lastIndexOf(".");
        if (lastDotIndex == -1) {
            return "";
        }
        return fileName.substring(lastDotIndex + 1).toLowerCase();
    }
}

检查Excel内容是否符合规范,excel文章来源地址https://www.toymoban.com/news/detail-774704.html

到了这里,关于检查Excel内容是否符合规范的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SAP ABAP Microsoft Excel 在剪贴板上有大量信息。是否保留其内容,以便此后粘贴到其他程序中?

    引言: 在 SAP 批导/上载 Excel 文件时,出现“在剪贴板上有大量信息。是否保留其内容,以便此后粘贴到其他程序中?”的弹窗提示,无论点击“是”、“否”、“取消”最终批导/上载都失败,数据为空。 : SAP ABAP Excel批导上载 ALSM_EXCEL_TO_INTERNAL_TABLE 在剪贴板上有大量

    2024年02月02日
    浏览(36)
  • R语言【技巧】——判断自定义函数的传参内容是否符合要求

    比如 对一个应该传入 数值型 ,数值为 0 或 1 的参数: 比如 对一个应该传入 字符型 ,字符串为 某个向量元素之一 的参数,类似于选项框:

    2024年01月23日
    浏览(31)
  • 多次复制Excel符合要求的数据行:Python批量实现

      本文介绍基于 Python 语言,读取 Excel 表格文件数据,并基于其中 某一列数据的值 ,将 这一数据处于指定范围 的 那一行 加以复制,并将所得结果保存为新的 Excel 表格文件的方法。   首先,我们来明确一下本文的具体需求。现有一个 Excel 表格文件,在本文中我们就以

    2024年04月08日
    浏览(32)
  • 解决python workbook处理excel文件后打开报错问题:发现“.xlsx”中的部分内容有问题。是否让我们尽量尝试恢复?如果您信任此工作簿的源,请单击“是”。

    使用python workbook处理excel文件、保存后,再次打开提示: #发现“新建 Microsoft Excel 工作表.xlsx”中的部分内容有问题。是否让我们尽量尝试恢复?如果您信任此工作簿的源,请单击“是”。 #Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃。 #单击查看

    2024年02月11日
    浏览(36)
  • 用python实现检查一个文件夹中所有word文件内容是否重复

    要检查一个文件夹中所有Word文件的内容是否重复,你可以使用Python的 python-docx 库来读取Word文件的内容,并使用Python的集合数据结构来检查重复项。 以下是一个示例代码,演示如何实现这个功能: python复制代码 import os from docx import Document def get_word_files(directory): \\\"\\\"\\\"获取指定目

    2024年01月23日
    浏览(53)
  • [excel与dict] python 读取excel内容并放入字典、将字典内容写入 excel文件

    一 读取excel内容、并放入字典 1 读取excel文件 2 读取value,舍弃行号 3 读取为字典 一 读取excel内容、并放入字典(完整代码) 二、将字典内容写入 excel文件 1 假设已有字典内容为: 即student列表里有4个字典, 第一个字典里面有3对key-value \\\"num\\\": 1, \\\"name\\\": \\\"cod1\\\", \\\"wfm\\\": 0.1 2 导入Workb

    2024年02月04日
    浏览(36)
  • 判断电话号码是否重复-excel

    有时候重复的数据不需要或者很烦人,就需要采取措施,希望以下的方法能帮到你。 方法一: 1)针对第一个单元格输入等号,以及公式countif(查找记录数的范围,需要查找的单元格) 2)输入enter之后,然后鼠标变为黑色的加号后,往下拉自动填充,如下图所示。 方法二:先

    2024年02月03日
    浏览(30)
  • panda读取excel文件内容时出错,提示excel表格不能被指定

    panda读取excel文件内容时出错,提示exc表格不能被指定,详细内容如下:      Excel file format cannot be determined, you must specify an engine manually. 源码如下(panda包和xlrd包都已经导入): 根据报错内容来到显示报错的代码中 当ext等于none时,提示这个错误。那么ext是怎么等于none的呢,

    2024年02月16日
    浏览(44)
  • python操作现有excel文件并修改其内容保存到excel文件

    最近需要实现一个功能,为了确保每次函数运行的时候count是唯一的,所以想读取excel中存储的icount,赋值完之后对其进行+1操作,并存入excel文件,确保下次读取的count是新的,没有出现过的。 具体实现 1、创建一个现有excel表,命名为test.xlsx,存储内容如下: 2、创建一个py文

    2024年02月11日
    浏览(27)
  • EasyExcel读取EXcel文件内容

    目录 一 官方文档介绍 二 读取文件内容 1.根据文档内容建立读对象 2.创建读监听器 3.测试类代码 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一

    2024年02月14日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包