【示例】SpringBoot读取Excel

ExcelController

java 复制代码
    @PostMapping("/dev/readExcel")
    public List<Map<String, Object>> readExcel(@RequestParam("cellHeader") String cellHeader, @RequestParam("file") MultipartFile file) {
        if (StringUtils.isEmpty(cellHeader)) {
            logger.info("列信息为空");
            return new ArrayList<>();
        }
        JSONArray cellHeaderInfoArray = JSONArray.parseArray(cellHeader);
        return ExcelUtil.readExcel(file, cellHeaderInfoArray);
    }

ExcelUtil

java 复制代码
public class ExcelUtil {

    private static Workbook getWorkbook(MultipartFile file) {
        Workbook workbook = null;
        try {
            String suffix = getFileSuffix(file);
            if ("xls".equals(suffix)) {
                workbook = new HSSFWorkbook(file.getInputStream());
            } else {
                workbook = new XSSFWorkbook(file.getInputStream());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return workbook;
    }

    public static List<String> getCellFileIdList(JSONArray cellHeaderInfoArray) {
        List<String> fileIdList = new ArrayList<>();
        JSONObject cellHeaderInfo;
        for (int i = 0; i < cellHeaderInfoArray.size(); i++) {
            cellHeaderInfo = cellHeaderInfoArray.getJSONObject(i);
            fileIdList.add(cellHeaderInfo.getString("fileId"));
        }
        return fileIdList;
    }

    public static List<String> getCellFileNameList(JSONArray cellHeaderInfoArray) {
        List<String> fileNameList = new ArrayList<>();
        JSONObject cellHeaderInfo;
        for (int i = 0; i < cellHeaderInfoArray.size(); i++) {
            cellHeaderInfo = cellHeaderInfoArray.getJSONObject(i);
            fileNameList.add(cellHeaderInfo.getString("fileName"));
        }
        return fileNameList;
    }


    public static List<Map<String, Object>> readExcel(MultipartFile file,  JSONArray cellHeaderInfoArray) {
        List<Map<String, Object>> list = new ArrayList<>();
        List<String> fileIdList;
        Workbook workbook = null;
        Sheet sheet = null;
        int firstRowNum, lastRowNum, cellNum;
        Row row;
        Cell cell;
        String fileId;
        //创建Excel,读取文件内容
        try {
            workbook = getWorkbook(file);
            //获取第一个工作表
            sheet = workbook.getSheetAt(0);
            //获取sheet中第一行行号(首行是0)
            firstRowNum = sheet.getFirstRowNum();
            //获取sheet中最后一行行号
            lastRowNum = sheet.getLastRowNum();
            //循环插入数据
            Map<String, Object> rowMap;
            fileIdList = getCellFileIdList(cellHeaderInfoArray);
            for (int i = firstRowNum + 1; i <= lastRowNum; i++) {
                rowMap = new HashMap<>();
                row = sheet.getRow(i);
                // 列数从1开始(只有一列有数据时,返回1)
                cellNum = row.getLastCellNum();
                if (cellNum > fileIdList.size()) {
                    cellNum = fileIdList.size();
                }
                for (int j = 0; j < cellNum; j++) {
                    cell = row.getCell(i);
                    fileId = fileIdList.get(0);
                    if (cell != null) {
                        if (cell.getCellType().equals(CellType.STRING)) {
                            rowMap.put(fileId, cell.getStringCellValue());
                        } else if (cell.getCellType().equals(CellType.NUMERIC)) {
                            rowMap.put(fileId, cell.getNumericCellValue());
                        } else {
                            rowMap.put(fileId, cell.getStringCellValue());
                        }
                    } else {
                        rowMap.put(fileId, "");
                    }
                }
                list.add(rowMap);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                file.getInputStream().close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return list;
    }

    private static String getFileSuffix(MultipartFile file) {
        String originalFilename = file.getOriginalFilename(); // 原始文件名(包含后缀)
        if (StringUtils.isEmpty(originalFilename)) {
            return "";
        }
        int index = originalFilename.lastIndexOf('.'); // 最后一个点号的索引位置
        if (index != -1 && index < originalFilename.length() - 1) {
            return originalFilename.substring(index + 1); // 提取后缀部分
        } else {
            return "";
        }
    }
}
相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码4 天前
别再前后端各写一套表单校验了
java·后端
大勇前进4 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
vipxieliang4 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
yuzhi_liu4 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile4 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白804 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端
二月龙4 天前
PHP 接口返回统一响应封装,让前后端对接更省心
后端