java 提取excel文件中的数据

1.首先文件转为字节型数组

byte[] bytes = multipartFile.getBytes();

2.

字节数组输入流在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓冲区中。创建字节数组输入流对象有以下几种方式。

接收字节数组作为参数创建:

ByteArrayInputStream bis = new ByteArrayInputStream(bytes);

3.使用的是JAVA POI实现的导出Excel;

POI 提供了对2003版本的Excel的支持 ---- HSSFWorkbook

POI 提供了对2007版本以及更高版本的支持 ---- XSSFWorkbook

定义工作簿

workbook = new XSSFWorkbook(inputStream);

定义工作表

// 默认取第一个子表
xssfSheet = xssfWorkbook.getSheetAt(0);

4.取标题
//定义行
        //默认第一行为标题行,index = 0
        XSSFRow titleRow = xssfSheet.getRow(0);
5.循环取数据
//循环取每行的数据
        for (int rowIndex = 1; rowIndex < xssfSheet.getPhysicalNumberOfRows(); rowIndex++) {
            XSSFRow xssfRow = xssfSheet.getRow(rowIndex);
            if (xssfRow == null) {
                continue;
            }

            Map<String, String> map = new LinkedHashMap<String, String>();
            //循环取每个单元格(cell)的数据
            for (int cellIndex = 0; cellIndex < xssfRow.getPhysicalNumberOfCells(); cellIndex++) {
                XSSFCell titleCell = titleRow.getCell(cellIndex);
                XSSFCell xssfCell = xssfRow.getCell(cellIndex);
                map.put(getString(titleCell),getString(xssfCell));
            }
            list.add(map);
        }

getLastRowNum  

    如果sheet中一行数据都没有则返回-1,只有第一行有数据则返回0,最后有数据的行是第n行则返回 n-1;

getPhysicalNumberOfRows  

    获取有记录的行数,即:最后有数据的行是第n行,前面有m行是空行没数据,则返回n-m;

6.不同类型的单元格分别取不同的数据。

/**
     * 把单元格的内容转为字符串
     * @param xssfCell 单元格
     * @return 字符串
     */
    public static String getString(XSSFCell xssfCell) {
        if (xssfCell == null) {
            return "";
        }
        if (xssfCell.getCellTypeEnum() == CellType.NUMERIC) {
            return String.valueOf(xssfCell.getNumericCellValue());
        } else if (xssfCell.getCellTypeEnum() == CellType.BOOLEAN) {
            return String.valueOf(xssfCell.getBooleanCellValue());
        } else {
            return xssfCell.getStringCellValue();
        }
    }
7.写入
/**
     * 把内容写入Excel
     * @param list 传入要写的内容,此处以一个List内容为例,先把要写的内容放到一个list中
     * @param outputStream 把输出流怼到要写入的Excel上,准备往里面写数据
     */
    public static void writeExcel(List<List> list, OutputStream outputStream) {
        //创建工作簿
        XSSFWorkbook xssfWorkbook = null;
        xssfWorkbook = new XSSFWorkbook();

        //创建工作表
        XSSFSheet xssfSheet;
        xssfSheet = xssfWorkbook.createSheet();

        //创建行
        XSSFRow xssfRow;

        //创建列,即单元格Cell
        XSSFCell xssfCell;

        //把List里面的数据写到excel中
        for (int i=0;i<list.size();i++) {
            //从第一行开始写入
            xssfRow = xssfSheet.createRow(i);
            //创建每个单元格Cell,即列的数据
            List sub_list =list.get(i);
            for (int j=0;j<sub_list.size();j++) {
                xssfCell = xssfRow.createCell(j); //创建单元格
                xssfCell.setCellValue((String)sub_list.get(j)); //设置单元格内容
            }
        }

        //用输出流写到excel
        try {
            xssfWorkbook.write(outputStream);
            outputStream.flush();
            outputStream.close();
        }catch (IOException e) {
            e.printStackTrace();
        }

    }
 
文学使思想充满血与肉,他比科学和哲学更能给予思想以巨大的明确性和说明性。
原文地址:https://www.cnblogs.com/zpsblog/p/13855339.html