导入Excel工具类

Posted xiaoyinger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了导入Excel工具类相关的知识,希望对你有一定的参考价值。

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.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.util.*;

@Component
public class ImportExcelUtil {
    /**
     * 导入Excel将每行数据存为List<String>
     *
     * @param file:文件
     * @param cellTypes:key:=列数 列下标从0开始
     *                          value:列类型:  0:numeric
     *                          1:string
     * @param requiredCol:必填列
     * @return List<List < String>>
     */
    public static List<List<String>> importExcel(MultipartFile file, LinkedHashMap<Integer, Integer> cellTypes, List<Integer> requiredCol) throws Exception {
        XSSFWorkbook xssfWorkbook = new XSSFWorkbook(file.getInputStream());
        XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);
        //存储所有行数据
        List<List<String>> rows = new ArrayList<>();
        if (xssfSheet != null) {
            //从文件第二行开始解析数据
            for (int i = 1; i <= xssfSheet.getLastRowNum(); i++) {
                XSSFRow xssfRow = xssfSheet.getRow(i);
                //本行不为空且列数size不为0
                if (xssfRow != null && xssfRow.getPhysicalNumberOfCells() != 0) {
                    //存储单行数据
                    List<String> row = new ArrayList<>();
                    //解析列数据 key;第几列   value:列类型
                    int blankCellCount = 0;
                    int cellCount = cellTypes.size();
                    Integer[] cellNums = new Integer[cellCount];
                    for (Map.Entry<Integer, Integer> m : cellTypes.entrySet()) {//循环每列
                        String cellData = null;
                        Integer cellNum = m.getKey();
                        Integer cellType = m.getValue();
                        XSSFCell cell = xssfRow.getCell(cellNum);
                        //当前单元格不为空
                        if (cell != null && cell.getCellType() != 3) {
                            xssfRow.getCell(cellNum).setCellType(cellType);
                            if (cellType == 0) {//数值型
                                cellData = String.valueOf(xssfRow.getCell(cellNum).getNumericCellValue()).trim();
                            }
                            if (cellType == 1) {//字符串型
                                cellData = xssfRow.getCell(cellNum).getStringCellValue().trim();
                            }
                            row.add(cellData);
                        } else if (cell != null && cell.getCellType() == 5) {//错误型
                            throw new Exception((i + 1) + "行" + (cellNum + 1) + "列为错误单元格");
                        } else if (cell == null || cell.getCellType() == 3) {//空值型
                            blankCellCount++;
                            cellNums[blankCellCount - 1] = cellNum;
                            cellData = "0";
                            row.add(cellData);
                        }
                    }


                    if (blankCellCount != 0 && blankCellCount != cellCount) {
                        //存在为空的列且不是所有列都为空,找为空的列判断该列是否是必填列
                        for (Integer cellNum : cellNums) {
                            if (requiredCol.size() > 0 && requiredCol.contains(cellNum)) {
                                row.clear();
                                throw new Exception("第"+(i + 1) + "行第" + (cellNum + 1) + "列数据错误,必填项不可为空");
                            } else {
                                continue;
                            }
                        }
                        //存在为空的列且所有列都为空
                    } else if (blankCellCount == cellCount) {
                        row.clear();
                    }
                    if (row.size() != 0) {
                        rows.add(row);
                    }

                }
            }
        }
        return rows;
    }
}

以上是关于导入Excel工具类的主要内容,如果未能解决你的问题,请参考以下文章

C#导入导出数据到Excel的通用类代码

配置简单功能强大的excel工具类搞定excel导入导出工具类

JAVA工具类(17)--Java导入导出Excel工具类ExcelUtil

导入Excel工具类

2.自定义@Excel注解实现数据Excel形式导入导出

java中excel导入导出工具类