POI以及EasyExcel

java操作Excel

java操作excel一般采用apach的poi或者阿里的EasyExcel

EasyExcel 是阿里巴巴开源的一个excel处理框架,以使用简单、节省内存著称

EasyExcel 能大大减少占用内存的主要原因是在解析 Excel 时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

1. POI操作Excel

1.引入相关的依赖

		<!--导入poi的包  这个是操作xsl03版的-->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.9</version>
		</dependency>
		<!--导入poi-ooxml的包,这个是操作-->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.9</version>
		</dependency>

		<!--导入日期格式化工具-->
		<dependency>
			<groupId>joda-time</groupId>
			<artifactId>joda-time</artifactId>
			<version>2.10.2</version>
		</dependency>


<!--03版与07版的区别就是03版只能支持65535行数据的读写,07版的则没有上限
导入pom文件的时候,必须注意版本
-->

2. 03版写入excel的代码

public class WriteExcelTest {
    String PATH = "F:\\";

    @Test
    public void excel03Test() throws Exception {
//        创建一个工作簿
        HSSFWorkbook workbook = new HSSFWorkbook();
//        在工作簿下创建表
        HSSFSheet sheet = workbook.createSheet("小王的工作表");
//        创建Excel的行和列
        /**
         * 这个方法里面传入一个int类型参数,表示的是excel的第几行
         * 0表示第一行,1表示第二行。。。。以此类推
         */
        HSSFRow row1 = sheet.createRow(0);
//        在excel的第一行中创建列
        /**
         * 同创建行相同,这里的0表示第一列,1表示第二列.....
         */
//        下面这个单元格就表示excel第一行的第一列,坐标(1,1)
        HSSFCell cell11 = row1.createCell(0);
//        给(1,1)这个单元格中写入数据
        cell11.setCellValue("编号");
//        创建第一行的第二列(1,2),并写入数据
        HSSFCell cell12 = row1.createCell(1);
        cell12.setCellValue("写入日期");

//        创建工作表的第二行
        HSSFRow row2 = sheet.createRow(1);
//        创建第二行的第一列并写入数据
        HSSFCell cell21 = row2.createCell(0);
        cell21.setCellValue(1);
//        创建工作表的第二行的第二列,并写入数据
        HSSFCell cell22 = row2.createCell(1);
        cell22.setCellValue(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
//        获取输出流,将工作簿输出
        FileOutputStream outputStream = new FileOutputStream(PATH+"chaochao.xls");
       workbook.write(outputStream);
//       关闭流
        outputStream.close();

    }

3.07版写入excel的代码

public class WriteExcelTest07 {
    String PATH = "F:\\";
    @Test
//    07版的xls测试  07版的03版api相同,只是使用的对象不同
    public void write07test() throws Exception{
        //        创建一个工作簿
        XSSFWorkbook workbook = new XSSFWorkbook();
//        在工作簿下创建表
        XSSFSheet sheet = workbook.createSheet("小王的工作表");
//        创建Excel的行和列
        /**
         * 这个方法里面传入一个int类型参数,表示的是excel的第几行
         * 0表示第一行,1表示第二行。。。。以此类推
         */
        XSSFRow row1 = sheet.createRow(0);
//        在excel的第一行中创建列
        /**
         * 同创建行相同,这里的0表示第一列,1表示第二列.....
         */
//        下面这个单元格就表示excel第一行的第一列,坐标(1,1)
        XSSFCell cell11 = row1.createCell(0);
//        给(1,1)这个单元格中写入数据
        cell11.setCellValue("编号");
//        创建第一行的第二列(1,2),并写入数据
        XSSFCell cell12 = row1.createCell(1);
        cell12.setCellValue("写入日期");

//        创建工作表的第二行
        XSSFRow row2 = sheet.createRow(1);
//        创建第二行的第一列并写入数据
        XSSFCell cell21 = row2.createCell(0);
        cell21.setCellValue(1);
//        创建工作表的第二行的第二列,并写入数据
        XSSFCell cell22 = row2.createCell(1);
        cell22.setCellValue(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
//        获取输出流,将工作簿输出
        FileOutputStream outputStream = new FileOutputStream(PATH+"chaochao2.xlsx");
        workbook.write(outputStream);
//       关闭流
        outputStream.close();


    }
}

4. 大文件的测试

注意:HSSF最多只能写65535行,否则报错

java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0…65535)

public class WriteBigTest {
    String PATH = "F:\\";

    @Test
    // 使用HSSF测试,这个最多只能生成65535行数据
//    优点:过程中写入缓存,不操作磁盘,最后一次性写入磁盘,速度快
    public void Big03Test() throws Exception{
        long begin = System.currentTimeMillis();
        Workbook workbook = new HSSFWorkbook();
        Sheet sheet = workbook.createSheet("测试HSSF表");
        for (int rowNum = 0; rowNum <65536 ; rowNum++) {
            Row row = sheet.createRow(rowNum);
            for (int colNum = 0; colNum < 10; colNum++) {
                Cell cell = row.createCell(colNum);
                cell.setCellValue(colNum);
            }
        }
        FileOutputStream outputStream = new FileOutputStream(PATH+"HSSF.xls");
        workbook.write(outputStream);
        outputStream.close();
        long end = System.currentTimeMillis();
        System.out.println(end-begin);   //2105ms
    }

//    使用XFFS测试
//    缺点:写数据时速度非常慢,非常耗内存,也会发生内存溢出,如100万条
//    优点:可以写较大的数据量,如20万条

    @Test
    public void bigXSSFTest() throws Exception{
        long begin = System.currentTimeMillis();
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("测试HSSF表");
        for (int rowNum = 0; rowNum <65536 ; rowNum++) {
            Row row = sheet.createRow(rowNum);
            for (int colNum = 0; colNum < 10; colNum++) {
                Cell cell = row.createCell(colNum);
                cell.setCellValue(colNum);
            }
        }
        FileOutputStream outputStream = new FileOutputStream(PATH+"XSSF.xlsx");
        workbook.write(outputStream);
        outputStream.close();
        long end = System.currentTimeMillis();
        System.out.println(end-begin);   //8172ms
    }

    //使用SXFFS测试
//  可以写非常大的数据量,如100万条甚至更多条,写数据速度快,占用更少的内存
    @Test
    public void bigSXFFSTest() throws Exception{
        long begin = System.currentTimeMillis();
        Workbook workbook = new SXSSFWorkbook();
        Sheet sheet = workbook.createSheet("测试HSSF表");
        for (int rowNum = 0; rowNum <65536 ; rowNum++) {
            Row row = sheet.createRow(rowNum);
            for (int colNum = 0; colNum < 10; colNum++) {
                Cell cell = row.createCell(colNum);
                cell.setCellValue(colNum);
            }
        }
        FileOutputStream outputStream = new FileOutputStream(PATH+"SXSSF.xlsx");
        workbook.write(outputStream);
        outputStream.close();
//        清理使用SXFFS产生的临时文件
        ((SXSSFWorkbook) workbook).dispose();
        long end = System.currentTimeMillis();
        System.out.println(end-begin);   //1352ms
    }
}

2. EasyExcel操作excel

1.导包

       <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.6</version>
        </dependency>

2.简单的写的操作

实体类,写出文件时的类型

/**
 * @Author xiaoqi
 * @Date 2020/6/12 17:26
 */
@Data
public class Student {

    @ExcelProperty(value = "姓名")
    @ColumnWidth(20) //指定列宽
    private String name;
    @ExcelProperty(value = "性别")
    @ColumnWidth(16)
    private String gender;
    @ExcelProperty(value = "出生日期")
    @ColumnWidth(20)
    private Date birthday;
    @ExcelIgnore
    private String id;
}

准备数据和写出xls文件

/**
 * @Author xiaoqi
 * @Date 2020/6/12 18:42
 */
public class StudentWriteTest {
//      准备写出的数据源
    public List<Student> data(){
        ArrayList list = new ArrayList();
        for (int i = 0; i <10 ; i++) {
            Student student = new Student();
            student.setName("nihao"+i);
            student.setBirthday(new Date());
            student.setGender("男");
            list.add(student);
        }
        return list;
    }

//    写的操作
    @Test
    public void studentWriteTest(){
//        获取工作簿
        /**
         * 第一个参数:写入的路径
         * 第二个参数:写入的类型
         */
        ExcelWriterBuilder writerBuilder = EasyExcel.write("xieruceshi.xls", Student.class);
//        获取表
        ExcelWriterSheetBuilder sheet = writerBuilder.sheet();
//        准备数据
        List<Student> data = data();
//        写入excel
        sheet.doWrite(data);

    }
}

3.最简单的读的操作

定义监听器

/**
 * @Author xiaoqi
 * @Date 2020/6/12 17:42
 */
public class StudentListener extends AnalysisEventListener<Student>{

    /**
     * 每次读取都会执行的方法
     * @param student
     * @param analysisContext
     */
    @Override
    public void invoke ( Student student, AnalysisContext analysisContext ) {
        System.out.println("student"+student);
    }

    /**
     * 读取完整个文档以后执行的方法
     * @param analysisContext
     */
    @Override
    public void doAfterAllAnalysed ( AnalysisContext analysisContext ) {

    }
}

读的操作

/**
 * @Author xiaoqi
 * @Date 2020/6/12 17:37
 */
public class ReadTest01 {
    @Test
    public void readTest001(){
        /**
         * 第一个参数:excel的路径
         * 第二个参数:读取的每一行数据要存储到的实体类的额class
         * 监听器对象
         */
//        获取工作簿
        ExcelReaderBuilder readerBuilder = EasyExcel.read("学生表.xlsx", Student.class, new StudentListener());
//        获取表  这个方法默认读取第一个工作表
        ExcelReaderSheetBuilder sheet = readerBuilder.sheet();
//        读取内容
        sheet.doRead();

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
poieasyexcel都是用于Java中操作Excel文件的开源库,它们各有优缺点。 POI(Apache POI)是一个功能强大的Java库,可以用于读写Microsoft Office格式的文档,包括Excel、Word和PowerPoint等。它的优点包括: 1. 功能丰富:POI提供了广泛的API,可以进行复杂的Excel文件读写操作,包括创建、修改、格式化、公式计算等。 2. 高度可定制化:POI允许对Excel文件进行细粒度的控制,可以对单元格、行、列进行操作,并支持自定义样式和数据格式。 3. 可跨平台使用:POI是基于Java开发的,可以在各种操作系统上运行,具有较好的跨平台性。 然而,POI也存在一些缺点: 1. 学习曲线较陡:由于POI提供了大量的功能和API,使用POI进行复杂的Excel操作可能需要一定的学习和熟悉成本。 2. 性能较低:由于POI是基于Java开发的,相比于一些底层的操作方式,性能可能会受到一定影响。 相比之下,EasyExcel是一款相对简单易用的Java库,专注于Excel文件读写操作。它的优点包括: 1. 简单易用:EasyExcel提供了简洁的API,使用起来比较容易上手,尤其适合处理中小规模的Excel操作。 2. 高性能:EasyExcel采用了基于注解的方式进行读写操作,相比于POI的API方式,性能上有一定的优势。 3. 支持大数据量处理:EasyExcel针对大数据量的Excel操作进行了优化,并提供了基于SAX模式的读写方式,可以有效避免内存溢出问题。 然而,EasyExcel也存在一些限制和缺点: 1. 功能相对有限:相比于POIEasyExcel的功能更为简化,不支持一些高级的Excel操作,如公式计算、图表等。 2. 社区支持不如POI:由于POI是一个成熟且广泛使用的库,它拥有更完善的社区生态和更多的资源支持。 综上所述,选择POI还是EasyExcel取决于具体需求和项目规模。如果需要进行复杂的Excel操作或需要更高的灵活性和定制化,可以选择POI。而如果项目规模相对较小、对性能要求较高或者只需进行简单的Excel读写操作,EasyExcel可能是一个更好的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值