文件解析工具

前言

对Excel & CSV 文件解析

java 复制代码
package com.wind.bird.Utils;

import com.opencsv.CSVReader;
import com.opencsv.CSVReaderBuilder;
import org.apache.commons.validator.Var;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.util.NumberToTextConverter;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

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

/**
 * @Author windBird
 * @Date 2023/11/25 21:28
 * @ClassName FileParseUtil
 * coding ^_^ every Day
 * @Desc  excel & csv  parse
 */
public class FileParseUtil {

    private static final Logger log = LoggerFactory.getLogger(FileParseUtil.class);


    /**
     * @param file
     * @return
     */
    public static List<Object[]> readFileToList(MultipartFile file) {
        String fileName = file.getOriginalFilename();
        String suffixName = fileName.substring(fileName.lastIndexOf("."));
        try {
            switch (suffixName) {
                case FileTypeEnum.CSV:
                    return parseFileWithCsv(file);
                case FileTypeEnum.XLS:
                    return readExcelWithXLs(file);
                case FileTypeEnum.XLSX:
                    return parseExcelWithXlsx(file);
                default:
                    return null;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new ArrayList<Object[]>();
    }

    private static List<Object[]> parseExcelWithXlsx(MultipartFile file) throws IOException {
        XSSFWorkbook xssfWorkbook = null;
        List<Object[]> list = new ArrayList<Object[]>();
        InputStream inputStream = file.getInputStream();
        try {
             xssfWorkbook = new XSSFWorkbook(inputStream);
            XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);
            XSSFRow xssfRow = null;
            XSSFCell xssfCell = null;
            Object cellValue = null;
            for (int i = 1; i <= xssfSheet.getPhysicalNumberOfRows(); i++) {
                xssfRow = xssfSheet.getRow(i);
                if (null == xssfRow) {
                    continue;
                }

                Object[] values = new Object[xssfSheet.getRow(0).getLastCellNum()];
                for (int j = 0; j <= xssfRow.getLastCellNum(); j++) {
                    xssfCell = xssfRow.getCell(j);
                    if (null == xssfCell) {
                        continue;
                    }
                    switch (xssfCell.getCellType()) {
                        case Cell.CELL_TYPE_STRING:
                            cellValue = xssfCell.getStringCellValue();
                            break;
                        case Cell.CELL_TYPE_NUMERIC:
                            if (DateUtil.isCellDateFormatted(xssfCell)) {

                                cellValue = DateUtil.getJavaDate(xssfCell.getNumericCellValue());
                                break;
                            } else {
                                cellValue = NumberToTextConverter.toText(xssfCell.getNumericCellValue());
                                break;
                            }
                        case Cell.CELL_TYPE_BOOLEAN:
                            cellValue = xssfCell.getBooleanCellValue();
                            break;
                        case Cell.CELL_TYPE_FORMULA:
                            cellValue = xssfCell.getCellFormula();
                            break;
                        case Cell.CELL_TYPE_BLANK:
                            cellValue = "";
                            break;
                        default:
                            cellValue = cellValue.toString();
                    }
                    values[j] = cellValue;
                }
                list.add(values);
            }
            return list;
        } catch (Exception e) {
            log.error("文件格式有误,请检查:{}", e);
            return null;
        } finally {
            if (null != inputStream) inputStream.close();
            if (null != xssfWorkbook) xssfWorkbook.close();
        }
    }

    private static List<Object[]> readExcelWithXLs(MultipartFile file) throws IOException {
        HSSFWorkbook hssfWorkbook = null;
        List<Object[]> list = new ArrayList<Object[]>();
        InputStream inputStream = file.getInputStream();
        try {
            hssfWorkbook = new HSSFWorkbook(inputStream);
            HSSFSheet xssfSheet = hssfWorkbook.getSheetAt(0);
            HSSFRow hssfRow = null;
            HSSFCell hssfCell = null;
            Object cellValue = null;
            for (int i = 1; i <= xssfSheet.getPhysicalNumberOfRows(); i++) {
                hssfRow = xssfSheet.getRow(i);
                if (null == hssfRow) {
                    continue;
                }
                Object[] values = new Object[xssfSheet.getRow(0).getLastCellNum()];
                for (int j = 0; j <= hssfRow.getLastCellNum(); j++) {
                    hssfCell = hssfRow.getCell(j);
                    if (null == hssfCell) {
                        continue;
                    }
                    switch (hssfCell.getCellType()) {
                        case Cell.CELL_TYPE_STRING:
                            cellValue = hssfCell.getStringCellValue();
                            break;
                        case Cell.CELL_TYPE_NUMERIC:
                            if (DateUtil.isCellDateFormatted(hssfCell)) {
                                cellValue = DateUtil.getJavaDate(hssfCell.getNumericCellValue());
                                break;
                            } else {
                                cellValue = NumberToTextConverter.toText(hssfCell.getNumericCellValue());
                                break;
                            }
                        case Cell.CELL_TYPE_FORMULA:
                            cellValue = hssfCell.getCellFormula();
                            break;
                        case Cell.CELL_TYPE_BOOLEAN:
                            cellValue = hssfCell.getBooleanCellValue();
                            break;
                        case Cell.CELL_TYPE_BLANK:
                            cellValue = "";
                            break;
                        default:
                            cellValue = cellValue.toString();
                    }
                    values[j] = cellValue;
                }
                list.add(values);
            }
            return list;
        } catch (Exception e) {
            log.error("文件格式有误,请检查:{}", e);
            return null;
        } finally {
            if (null != inputStream) inputStream.close();

            if (null != hssfWorkbook) hssfWorkbook.close();

        }
    }

    private static List<Object[]> parseFileWithCsv(MultipartFile file) {
        List<Object[]> list = new ArrayList<>();
        int i = 0;
        try {
            CSVReader csvReader = new CSVReaderBuilder(
                    new BufferedReader(
                            new InputStreamReader(file.getInputStream()))).build();
            Iterator<String[]> iterator = csvReader.iterator();
            while (iterator.hasNext()) {
                String[] next = iterator.next();
                //去除第一行的表头,从第二行开始
                if (i >= 1) {
                    list.add(next);
                }
                i++;
            }
            return list;
        } catch (Exception e) {
            log.error("CSV文件读取异常");
            return list;
        }
    }


    public interface FileTypeEnum {
        String CSV = ".csv";
        String XLS = ".xls";
        String XLSX = ".xlsx";
    }
}
相关推荐
Goldn.4 小时前
Java核心技术栈全景解析:从Web开发到AI融合
java· spring boot· 微服务· ai· jvm· maven· hibernate
李慕婉学姐5 小时前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
m0_740043735 小时前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
编织幻境的妖5 小时前
SQL查询连续登录用户方法详解
java·数据库·sql
未若君雅裁6 小时前
JVM面试篇总结
java·jvm·面试
kk哥88996 小时前
C++ 对象 核心介绍
java·jvm·c++
招风的黑耳6 小时前
我用SpringBoot撸了一个智慧水务监控平台
java·spring boot·后端
xunyan62346 小时前
面向对象(下)-接口的理解
java·开发语言
程序员游老板6 小时前
基于SpringBoot3+vue3的爱心陪诊平台
java·spring boot·毕业设计·软件工程·课程设计·信息与通信
期待のcode6 小时前
Springboot核心构建插件
java·spring boot·后端