java解析Excel数据

该博客介绍了如何使用Java的Apache POI库从Excel文件中读取数据,并将其转换为特定的JSON格式。实现了ExcelOperateServiceImpl类,包含analysisExcel方法,用于处理MultipartFile类型的Excel文件,获取首行标题并遍历后续数据行,生成包含标题和值的Map。内容涉及到数据读取、单元格值处理及日期格式化等操作。
摘要由CSDN通过智能技术生成

Excel格式为表头加上值的格式
在这里插入图片描述

service接口层:

 Map<String, Object> analysisExcel(MultipartFile file);

实现层(impl)

package com.yxf.util.service.impl;/*
 *@program:Utils
 *@author: yuXF
 *@Time: 2022/3/8  15:35
 */

import com.yxf.util.service.ExcelOperateService;
import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.math.BigDecimal;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.*;

@Service
public class ExcelOperateServiceImpl implements ExcelOperateService {

    @Override
    public Map<String, Object> analysisExcel(MultipartFile file) {
        /*读取Excel首行 命名为title*/
        List<String> titles = getTheFirstRow(file);
        if (titles.size() > 0) {
            /*根据title的下标去遍历v后续的Excel*/
            List<Map<String, String>> valueMapList = getExcelValue(file, titles);
            Map<String, Object> valueMap = new HashMap<>();
            valueMap.put("title", titles);
            valueMap.put("value", valueMapList);
            return valueMap;
        }
        return null;
    }

    private List<Map<String, String>> getExcelValue(MultipartFile file, List<String> titles) {
        List<Map<String, String>> valueMapLis = new ArrayList<>();
        Sheet sheetAt = readExcel(file);
        if (sheetAt != null) {
            for (int i = 1; i <= sheetAt.getLastRowNum(); i++) {/*遍历第一行之后的数据*/
                Row row = sheetAt.getRow(i);
                if (row != null) {
                    Map<String, String> valueMap = new HashMap<>();
                    for (int n = 0; n < titles.size(); n++) {
                        String value = getTheValue(row.getCell(n));
                        valueMap.put(titles.get(n), value);
                    }
                    valueMapLis.add(valueMap);
                }
            }
        }
        return valueMapLis;
    }

    private List<String> getTheFirstRow(MultipartFile file) {
        List<String> titles = new ArrayList<>();
        Sheet sheetAt = readExcel(file);
        if (sheetAt != null) {
            /*获取的第一行*/
            Row row = sheetAt.getRow(0);
            if (row != null) {
                for (Cell cell : row) {
                    String title = getTheValue(cell);
                    titles.add(title);
                }
            }

        }
        return titles;
    }

    private String getTheValue(Cell cell) {
        String value;
        if (cell == null) {
            return "";
        } else if (cell.getCellType().equals(CellType.FORMULA)) {
            switch (cell.getCachedFormulaResultType()) {
                case STRING:
                    value = cell.getStringCellValue();
                    break;
                case NUMERIC:
                    NumberFormat nf = NumberFormat.getInstance();
                    nf.setGroupingUsed(false);
                    value = String.valueOf(nf.format(cell.getNumericCellValue()));
                    break;
                case BOOLEAN:
                    value = String.valueOf(cell.getBooleanCellValue());
                    break;
                default:
                    value = cell.getCellFormula();
            }
        } else if (cell.getCellType().equals(CellType.NUMERIC)) {
            if (DateUtil.isCellDateFormatted(cell)) {
                value = new SimpleDateFormat("yyyy-MM-dd").format(cell.getDateCellValue());
            } else {
                value = new BigDecimal(cell.toString()).stripTrailingZeros().toPlainString();
            }
        } else {
            value = cell.toString() == null ? "" : cell.toString();
        }
        return value;
    }


    private Sheet readExcel(MultipartFile file) {
        try {
            return WorkbookFactory.create(file.getInputStream()).getSheetAt(0);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

出参样式:

{
  "title": [
    "排班工号",
    "员工姓名",
    "可用小时",
    "开始日期",
    "失效日期",
    "日程类型",
    "备注"
  ],
  "value": [
    {
      "员工姓名": "张三",
      "失效日期": "2022-9-31",
      "开始日期": "2022-3-8",
      "可用小时": "4",
      "备注": "",
      "排班工号": "1002658",
      "日程类型": "市场监管局12315|调休"
    },
    {
      "员工姓名": "李四",
      "失效日期": "2022-9-31",
      "开始日期": "2022-3-8",
      "可用小时": "4",
      "备注": "",
      "排班工号": "1000239",
      "日程类型": "市场监管局12315|调休"
    },
    {
      "员工姓名": "王五",
      "失效日期": "2022-9-31",
      "开始日期": "2022-3-8",
      "可用小时": "4",
      "备注": "",
      "排班工号": "1000508",
      "日程类型": "市场监管局12315|调休"
    }
  ]
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值