java解析excel文件,返回json

我这里用的是springboot项目,配合Maven使用的。首先需要引入依赖:

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>

接下来写一个ExcelUtils工具类,用于读取和解析单元格内的数据

    
public class ExcelUtils {

    // sheet页下标
    private static final int SHEET_INDEX = 0;

    // 开始读取的行
    private static final int STARTER_EAD_LINE = 4;

    // 去除最后读取的行
    private static final int TAIL_LINE = 2;

上面的三个参数值根据自己要解析的excel定。

    private static final String[] PARAM_ARR = new String[] {"", ""};

数组内容自己定....


    public static void main(String[] args) {
        //读取excel数据
        ExcelUtils excelUtil = new ExcelUtils();
        List<Map<String, String>> result = excelUtil.readExcelToObj("文件路径");

        JSONArray jsonArray = new JSONArray();
        for (Map<String, String> map : result) {
            JSONObject jsonObject = new JSONObject();
            for (Map.Entry<String, String> entry : map.entrySet()) {
                jsonObject.put(entry.getKey(), entry.getValue());
            }
            jsonArray.add(jsonObject);
        }
        System.out.println(jsonArray.toJSONString());

    }


    private List<Map<String, String>> readExcelToObj(String path) {

        Workbook wb = null;
        List<Map<String, String>> result = null;
        try {
            wb = WorkbookFactory.create(new File(path));
            result = readExcel(wb, SHEET_INDEX, STARTER_EAD_LINE, TAIL_LINE);
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }


        public String getCellValue(Cell cell) {

        if (cell == null) {
            return "";
        }

        if (cell.getCellType() == CellType.STRING) {

            return cell.getStringCellValue();

        } else if (cell.getCellType() == CellType.BOOLEAN) {

            return String.valueOf(cell.getBooleanCellValue());

        } else if (cell.getCellType() == CellType.FORMULA) {

            return String.valueOf((int) cell.getNumericCellValue());

        } else if (cell.getCellType() == CellType.NUMERIC) {

            return String.valueOf((int) cell.getNumericCellValue());

        }
        return "";
    }



     private boolean isMergedRegion(Sheet sheet, int row, int column) {
        int sheetMergeCount = sheet.getNumMergedRegions();
        for (int i = 0; i < sheetMergeCount; i++) {
            CellRangeAddress range = sheet.getMergedRegion(i);
            int firstColumn = range.getFirstColumn();
            int lastColumn = range.getLastColumn();
            int firstRow = range.getFirstRow();
            int lastRow = range.getLastRow();
            if (row >= firstRow && row <= lastRow) {
                if (column >= firstColumn && column <= lastColumn) {
                    return true;
                }
            }
        }
        return false;
    }



    public String getMergedRegionValue(Sheet sheet, int row, int column) {
        int sheetMergeCount = sheet.getNumMergedRegions();

        for (int i = 0; i < sheetMergeCount; i++) {
            CellRangeAddress ca = sheet.getMergedRegion(i);
            int firstColumn = ca.getFirstColumn();
            int lastColumn = ca.getLastColumn();
            int firstRow = ca.getFirstRow();
            int lastRow = ca.getLastRow();

            if (row >= firstRow && row <= lastRow) {

                if (column >= firstColumn && column <= lastColumn) {
                    Row fRow = sheet.getRow(firstRow);
                    Cell fCell = fRow.getCell(firstColumn);
                    return getCellValue(fCell);
                }
            }
        }

        return null;
    }


    private List<Map<String, String>> readExcel(Workbook wb, int sheetIndex, int startReadLine, int tailLine) {
        Sheet sheet = wb.getSheetAt(sheetIndex);
        Row row = null;
        List<Map<String, String>> result = new ArrayList<Map<String, String>>();
        for (int i = startReadLine; i < sheet.getLastRowNum() - tailLine + 1; i++) {

            row = sheet.getRow(i);
            Map<String, String> map = new HashMap<String, String>();

            // 开始循环填充数据
            for (Cell c : row) {
                String returnStr = "";

                boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());
                //判断是否具有合并单元格
                if (isMerge) {
                    String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
                    returnStr = rs;
                } else {
                    //设置单元格类型
                    c.setCellType(CellType.STRING);
                    returnStr = c.getRichStringCellValue().getString();
                }

                int columnIndex = c.getColumnIndex();
                if (columnIndex < PARAM_ARR.length) {
                    map.put(PARAM_ARR[columnIndex], returnStr);
                }

            }
            result.add(map);
        }
        return result;
    }

}

执行main方法,填写正确的路径即可获取数据。

正常情况下后端接受的类型并非File类型,而是MultipartFile类型,因此需要转化

String originalFilename = file.getOriginalFilenam;
String fileType = "";   // 文件类型

File tempFile = null;
try {
    tempFile = File.createTempFile(originalFilename, fileType);
    file.transferTo(tempFile);
} catch (IOException e) {
    log.error("文件转换失败!", e);
}

List<Map<String, String>> maps = excelUtils.readExcelToObjByUpload(tempFile);

格式转换完后执行即可获得List<Map<String, String>>数据。

遍历数据,获得json返回

JSONArray jsonArray = new JSONArray();

for (Map<String, String> map : maps) {
    boolean putFlag = true;
    JSONObject jsonObject = new JSONObject();
    for (Map.Entry<String, String> entry : map.entrySet()) {
        // 此行有一处数据为空则不加入,自己根据业务逻辑加判断
        if (StringUtils.isNull(entry.getValue())) {
            putFlag = false;
            break;
        }
        jsonObject.put(entry.getKey(), entry.getValue());
    }
    if (putFlag) {
        jsonArray.add(jsonObject);
    }
}

log.info("excel解析完数据为:{}", jsonArray.toJSONString());

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用以下步骤将Excel格式的文件转换为JSON格式: 1. 读取Excel文件并将其转换为Java对象。可以使用Apache POI或JExcelAPI等Java库来实现此操作。 2. 将Java对象转换为JSON格式。可以使用Jackson、Gson等Java库来实现此操作。 以下是一个简单的示例代码,用于读取Excel文件并将其转换为JSON格式: ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; 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 com.fasterxml.jackson.databind.ObjectMapper; public class ExcelToJsonConverter { public static void main(String[] args) throws IOException { // 读取Excel文件 File file = new File("data.xls"); FileInputStream inputStream = new FileInputStream(file); HSSFWorkbook workbook = new HSSFWorkbook(inputStream); HSSFSheet sheet = workbook.getSheetAt(0); // 解析Excel文件中的数据 List<Object[]> rows = new ArrayList<>(); Iterator<?> rowIterator = sheet.rowIterator(); while (rowIterator.hasNext()) { HSSFRow row = (HSSFRow) rowIterator.next(); Iterator<?> cellIterator = row.cellIterator(); List<Object> cells = new ArrayList<>(); while (cellIterator.hasNext()) { HSSFCell cell = (HSSFCell) cellIterator.next(); Object cellValue = getCellValue(cell); cells.add(cellValue); } rows.add(cells.toArray()); } // 将Java对象转换为JSON格式 ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(rows); System.out.println(json); } private static Object getCellValue(HSSFCell cell) { switch (cell.getCellType()) { case STRING: return cell.getStringCellValue(); case NUMERIC: return cell.getNumericCellValue(); case BOOLEAN: return cell.getBooleanCellValue(); case FORMULA: return cell.getCellFormula(); case BLANK: return ""; default: return null; } } } ``` 上述代码将Excel文件中的数据读取到一个Java List中,并将该List转换为JSON格式。请注意,该代码使用Apache POI库来读取Excel文件。如果您使用的是其他库,则需要相应地更改代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风亦思雨

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值