spring-boot导入excel

原创
2017/12/31 17:29
阅读数 610

spring-boot导出excel

本文使用Apache POL实现excel文档的导入解析

pom.xml 添加Apache POL依赖

<dependency>  
    <groupId>org.apache.poi</groupId>  
    <artifactId>poi</artifactId>  
    <version>3.14</version>  
</dependency>  

导入excel

使用表单上传excel文件,然后使用Apache POL来解析上传的excel文件,以下几个api比较重要

  • 获取文件上传input的流: InputStream fis = excelFile.getInputStream()
  • 将文件流读入excel工作薄: HSSFWorkbook workbook = new HSSFWorkbook(fis)
  • 读取工作薄中的第一张表: HSSFSheet sheet = workbook.getSheetAt(0);
  • 读取表的第一行序号: int firstRow = sheet.getFirstRowNum()
  • 读取表的最后一行序号: int lastRow = sheet.getLastRowNum()
  • 读取表的一行: HSSFRow row = sheet.getRow(i)
  • 读取行的一列: HSSFCell cell = row.getCell(j)
  • 读取一行中的第一列序号: int firstCell = row.getFirstCellNum()
  • 读取一行中的最后一列序号: int lastCell = row.getLastCellNum()
  • 读取单元格中的数据: String val =cell.getStringCellValue()

需要注意的一点,当单元格是数字格式时,需要把它的cell type转成String,否则会出错

if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
    cell.setCellType(HSSFCell.CELL_TYPE_STRING);
}

下面是全部代码

package com.example.demo.controller;

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.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class Excel2Controller {

    //上传文件的接口
    @PostMapping(value = "/excel/import")
    public List<Map<String,String>>  excelImport(@RequestParam(value = "excelFile") MultipartFile excelFile) throws Exception{
        if(excelFile==null){
            throw new Exception("请选择文件");
        }

        InputStream fis = excelFile.getInputStream(); //读取input流
        List<Map<String,String>> data = parseExcel(fis);
        return data;
    }

    //解析excel
    private List<Map<String,String>> parseExcel(InputStream fis) throws Exception{
        List<Map<String,String>> data = new ArrayList<Map<String,String>>();
        HSSFWorkbook workbook = new HSSFWorkbook(fis);
        HSSFSheet sheet = workbook.getSheetAt(0);
        int firstRow = sheet.getFirstRowNum();//第一行序号
        int lastRow = sheet.getLastRowNum();//最后一行序号

        HSSFRow titleRow = sheet.getRow(firstRow);//表头行

        for(int i=firstRow+1;i<lastRow+1;i++){
            HSSFRow row = sheet.getRow(i); //获取第行
            Map map = getRowData(row,titleRow);//获取第i行数据
            data.add(map);
        }

        return data;
    }

    //获取excel中一行的数据
    private Map<String,String> getRowData(HSSFRow row,HSSFRow titleRow){
        Map<String,String> map = new HashMap<String,String>();
        int firstCell = row.getFirstCellNum();//第一列序号
        int lastCell = row.getLastCellNum();//最后一列序号

        for(int j=firstCell;j<lastCell;j++){

            String key = titleRow.getCell(j).getStringCellValue();//当前列标题
            HSSFCell cell = row.getCell(j);//当前单元格

            //当单元格是数字格式时,需要把它的cell type转成String,否则会出错
            if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
                cell.setCellType(HSSFCell.CELL_TYPE_STRING);
            }
            String val =cell.getStringCellValue();//当前单元格的值

            map.put(key,val);
        }

        return map;
    }
    
}
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部