POI和easyExcel

zhangxiaocc 2020-06-10

 1.常用场景

(1)将用户数据导出为excel表格(导出数据)

(2)将Excel表中的数据导出到网站数据库中

操作Excel最常用的就是Apache的POI和阿里巴巴的easyExcel。

2.官网地址

Apache POI的官网:https://poi.apache.org/

easyExcel的官网:https://github.com/alibaba/easyexcel

3.poi和easyExecel的区别:

以下是我在官网截的图:

POI和easyExcel

 POI和easyExcel

 4.Excel中的对象

    在java中万物皆对象,Excel也不例外,Excel中的对象有:

    工作簿:Workbook(是一个接口)

    (使用时需要导入Workbook:import org.apache.poi.ss.usermodel.Workbook;)

   Workbook的三个实现类:

(1)HSSFWorkbook:HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;(2)XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx;(3)SXSSFworkbook:是XSSFWorkbook的升级版,当数据量超出65536条后,在使用HSSFWorkbook或XSSFWorkbook,程序会报OutOfMemoryError:Javaheap space;内存溢出错误。这时应该用SXSSFworkbook。
工作表:Sheet (使用时需要导入Sheet:import org.apache.poi.ss.usermodel.Sheet;)

    行:Row     (使用时需要导入Row:import org.apache.poi.ss.usermodel.Row;)

    列:Cell  (使用时需要导入Cell  :import org.apache.poi.ss.usermodel.Cell;)

 5.03版Excel表的生成代码:

package com.lqz.controller;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
 * @Author:liqinzhen
 * @Date:2020/6/9
 * @Description:
 */
public class ExcelWriteTest {
    String  path = "E:\\java\\project\\springmvc-ajax-json";
    @Test
    public void test() throws IOException {
        //1.创建一个工作簿
        Workbook workbook = new HSSFWorkbook();
        //2.创建一个工作表,因为工作表在工作簿中,所以用工作簿创建工作表
        Sheet sheet = workbook.createSheet("学生表");
        //3.创建一个 行
        Row row1 = sheet.createRow(0);
        //4.创建一个单元格
        Cell cell11 = row1.createCell(0);
        //给单元格设置值
        cell11.setCellValue("陈咬金");;
        //创建第二个单元格
        Cell cell12 = row1.createCell(1);
        cell12.setCellValue("1021");
        //创建第二行
        Row row2 = sheet.createRow(1);
        //创建第二行的第一个单元格
        Cell cell21 = row2.createCell(0);
        cell21.setCellValue("芈月");
        //创建第二行的第二个单元格
        Cell cell22 = row2.createCell(1);
        cell22.setCellValue("1023");
        //生成一张表(io流),03版的Excel使用.xls结尾
        FileOutputStream fileOutputStream = new FileOutputStream(path+"学生表03.xls");
        //输出
        workbook.write(fileOutputStream);
        //关闭流
        fileOutputStream.close();
        System.out.println("学生表03.xls表生成完毕");
    }

}

6.07版的Excel生成代码:

//(1)导入少量数据package com.lqz.controller;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
 * @Author:liqinzhen
 * @Date:2020/6/9
 * @Description:
 */
public class ExcelWriteTest {
    String  path = "E:\\java\\project\\springmvc-ajax-json";
    @Test
    public void test() throws IOException {
        //1.创建一个工作簿
        Workbook workbook = new XSSFWorkbook();
        //2.创建一个工作表,因为工作表在工作簿中,所以用工作簿创建工作表
        Sheet sheet = workbook.createSheet("学生表");
        //3.创建一个 行
        Row row1 = sheet.createRow(0);
        //4.创建一个单元格
        Cell cell11 = row1.createCell(0);
        //给单元格设置值
        cell11.setCellValue("陈咬金");;
        //创建第二个单元格
        Cell cell12 = row1.createCell(1);
        cell12.setCellValue("1021");
        //创建第二行
        Row row2 = sheet.createRow(1);
        //创建第二行的第一个单元格
        Cell cell21 = row2.createCell(0);
        cell21.setCellValue("芈月");
        //创建第二行的第二个单元格
        Cell cell22 = row2.createCell(1);
        cell22.setCellValue("1023");
        //生成一张表(io流),03版的Excel使用.xls结尾
        FileOutputStream fileOutputStream = new FileOutputStream(path+"学生表07.xls");
        //输出
        workbook.write(fileOutputStream);
        //关闭流
        fileOutputStream.close();
        System.out.println("学生表07.xls表生成完毕");
    }

}

//(2)批量数据导入
@Test
public void test02() throws IOException {
    String  path = "E:\\java\\project\\springmvc-ajax-json";
    //1.创建一个工作簿
    HSSFWorkbook workbook = new HSSFWorkbook();
    //2.创建一个工作表
    HSSFSheet sheet = workbook.createSheet();
    for (int rowNum = 0;rowNum<65536;rowNum++){
        //3.创建行
        Row row = sheet.createRow(rowNum);
        for (int cellNum = 0;cellNum <5;cellNum++){
            Cell cell = row.createCell(cellNum);
            cell.setCellValue(cellNum);
        }
    }
    System.out.println("写入完毕");
    FileOutputStream fileOutputStream = new FileOutputStream(path + "工作表03.xls");
    workbook.write(fileOutputStream);
    //关闭流
    fileOutputStream.close();
}

//(3)读取Excel文件@Test
    public void readExcelTest() throws IOException {
        //获取文件流
        FileInputStream fileInputStream = new FileInputStream(path + "学生表03.xls");
        //创建一个工作簿
        HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);
        //得到表
        Sheet sheet  = workbook.getSheetAt(0);
        //得到行
        Row row = sheet.getRow(0);
        //得到列
        Cell cell = row.getCell(0);
        System.out.println(cell.getStringCellValue());
        fileInputStream.close();
}
//读取不同数据类型 @Test
    public void testCellType() throws IOException {
        //获取文件流
        FileInputStream fileInputStream = new FileInputStream(path + "学生表03.xls");
        //创建一个工作簿
        HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);
        HSSFSheet sheet = workbook.getSheetAt(0);
        //获取标题,表的第一行
        Row rowTile = sheet.getRow(0);
        //如果第一行不为空
        if (rowTile != null) {
            //读取第一行列的数量
            int numberOfCells = rowTile.getPhysicalNumberOfCells();
            //循环遍历每一列
            for (int i = 0; i < numberOfCells; i++) {
                //获得列
                Cell cell = rowTile.getCell(i);
                //如果列不为空
                if (cell != null) {
                    //获取列的类型
                    CellType cellType = cell.getCellType();
                    String stringCellValue = cell.getStringCellValue();
                    System.out.print(stringCellValue + "|");
                }

            }
        }
            System.out.println();

            //获取行内容,行的数量
            int numberOfRows = sheet.getPhysicalNumberOfRows();
            //循环获取每一行
            for (int i = 1; i < numberOfRows; i++) {
                //获得行
                Row row = sheet.getRow(i);
                if (row != null) {
                    //获取列
                    int numberOfCells1 = rowTile.getPhysicalNumberOfCells();
                    for (int j = 0; j < numberOfCells1; j++) {
                        System.out.print("[" + (j + 1) + (numberOfCells1 + 1) + "]");
                        Cell cell = rowTile.getCell(j);
                        //匹配列的数据类型
                        if (cell != null) {
                            CellType cellType = cell.getCellType();
                            String cellValue = "";
                            switch (cellType) {
                                case STRING:
                                    System.out.println("[STRING]");
                                    cellValue = cell.getStringCellValue();
                                    break;
                                case BOOLEAN:
                                    System.out.println("[BOOLEAN]");
                                    cellValue = String.valueOf(cell.getStringCellValue());
                                    break;
                                case BLANK://空
                                    System.out.println("[BOOLEAN]");
                                    break;
                                case NUMERIC://空
                                    System.out.println("[NUMERIC]");//数字(普通数字,日期)
                                    if (HSSFDateUtil.isCellDateFormatted(cell)) {
                                        System.out.println("[日期]");
                                        Date date = cell.getDateCellValue();
                                        cellValue = new DateTime(date).toString("yyyy-MM-dd");
                                    } else {
                                        System.out.println("转换为字符串输出");
                                        cell.setCellType(STRING);
                                        cellValue = cell.toString();
                                    }
                                    break;
                                case ERROR://空
                                    System.out.println("[数据类型错误]");
                                    break;
                            }
                            System.out.println(cellValue);
                        }
                    }
                }
            }
            //关闭流
            fileInputStream.close();
        }

POI和easyExcel

相关推荐

WindyQCF / 0评论 2016-09-30