java中操作Excel——POI、EasyExcel

接了一个任务,需要把Excel中的数据导入到数据库中,查阅了资料后,学习了POI和EasyExcel两个库。
在这之前,我们先来分析一下Excel,我们可以把Excel简单的理解成四部分,1、工作簿2、工作表3、行4、单元格
java中操作Excel——POI、EasyExcel_第1张图片

POI

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
有以下类实现了Workbook接口,区别如下:

  1. HSSFWorkbook是操作Excel2003以前(包括2003)的版本,扩展名是.xls;XSSFWorkbook,SXSSFWorkbook是操作Excel2007的版本,扩展名是.xlsx
  2. SXSSFWorkbook读写比XSSFWorkbook快
    java中操作Excel——POI、EasyExcel_第2张图片

新建一个maven项目,导入jar包

<dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <!-- 03 xls -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <!-- 07 xlsx -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.0</version>
        </dependency>
    </dependencies>
  • 写入数据
public class writeTest {

    public static void main(String[] args) {
        String path = "D:\\project\\poidemo\\";
        //创建工作簿
        Workbook workbook = new HSSFWorkbook();
        //工作表
        Sheet sheet = workbook.createSheet("学生成绩表");
        //创建行
        Row row1 = sheet.createRow(0);//第1行
        Row row2 = sheet.createRow(1);//第2行
        //创建单元格
        Cell cell11 = row1.createCell(0);//第1行第1列
        Cell cell12 = row1.createCell(1);//第1行第2列
        Cell cell13= row1.createCell(2);//第1行第2列
        Cell cell14 = row1.createCell(3);//第1行第4列
        Cell cell21 = row2.createCell(0);//第2行第1列
        Cell cell22 = row2.createCell(1);//第2行第2列
        Cell cell23= row2.createCell(2);//第2行第3列
        Cell cell24 = row2.createCell(3);//第2行第4列
        //写入值
        cell11.setCellValue("学号");
        cell12.setCellValue("姓名");
        cell13.setCellValue("学科");
        cell14.setCellValue("成绩");
        cell21.setCellValue("1001");
        cell22.setCellValue("张三");
        cell23.setCellValue("语文");
        cell24.setCellValue("85");


        try {
            //输出流生成xls文件
            FileOutputStream fileOutputStream = new FileOutputStream(path+"学生成绩表03.xls");
            workbook.write(fileOutputStream);
            System.out.println("生成表成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



}

java中操作Excel——POI、EasyExcel_第3张图片
java中操作Excel——POI、EasyExcel_第4张图片

批量写入大量数据,SXSSFWorkbook比XSSFWorkbook效率高
相同的代码,一个是XSSFWorkbook,另一个是SXSSFWorkbook,向Excel中写入1000000行数据,一个用时18秒,一个用时3秒

 public static void main(String[] args) throws Exception {
        String path = "D:\\project\\poidemo\\";
        long begin = System.currentTimeMillis();
        //创建工作簿
        Workbook workbook = new XSSFWorkbook();
        //工作表
        Sheet sheet = workbook.createSheet("学生成绩表");
        //创建行
        for(int i=0;i<1000000;i++){
            Row row = sheet.createRow(i);
            Cell cell = row.createCell(0);
            cell.setCellValue(i);
        }


            //输出流生成xlsx文件
            FileOutputStream fileOutputStream = new FileOutputStream(path+"07.xlsx");
            workbook.write(fileOutputStream);
            System.out.println("生成表成功");
            Long end = System.currentTimeMillis();
            System.out.println((double)(end-begin)/1000);
            fileOutputStream.close();
    }

java中操作Excel——POI、EasyExcel_第5张图片

java中操作Excel——POI、EasyExcel_第6张图片

  • 读Excel中的数据
public static void main(String[] args) throws Exception {
        String path = "D:\\project\\poidemo\\";
        //获取Excel文件
        FileInputStream fileInputStream = new FileInputStream(path+"学生成绩表03.xls");
        //获取工作簿
        Workbook workbook = new HSSFWorkbook(fileInputStream);
        //获取工作表
        Sheet sheet = workbook.getSheetAt(0);
        //获取行数
        int rowNum = sheet.getPhysicalNumberOfRows();
        for (int i=0;i<rowNum;i++){
            Row row = sheet.getRow(i);
            //获取列数
            int cellNum = row.getPhysicalNumberOfCells();
            for(int j=0;j<cellNum;j++){
                Cell cell = row.getCell(j);
                String value = cell.getStringCellValue();
                System.out.println("["+i+","+(j+1)+"]"+"("+value+")");
            }

        }

    }

java中操作Excel——POI、EasyExcel_第7张图片
java中操作Excel——POI、EasyExcel_第8张图片

EasyExcel

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。 EasyExcel的github地址

  • 写Excel
public static void main(String[] args) {
        String path = "D:\\project\\easyExceldemo\\";
        List<DemoData> demoDataList = new ArrayList<>();
        for (int i=1;i<=10;i++){
            DemoData demoData = new DemoData();
            demoData.setString("字符串"+i);
            demoData.setDate(new Date());
            demoData.setDoubleData(0.56d);
            demoDataList.add(demoData);
        }
        String fileName =  path+ "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(demoDataList);
    }

java中操作Excel——POI、EasyExcel_第9张图片

你可能感兴趣的:(java)