好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

java操作excel表格详解

使用场景

1、将用户信息导出为excel表格(导出数据....)

2、将Excel表中的信息录入到网站数据库(习题上传....)大大减轻网站录入量!开发中经常会设计到excel的处理,如导出Excel,导入Excel到数据库中!

操作Excel目前比较流行的就是Apache POI和阿里巴巴的easyExcel !

这里我们主要使用easyExcel进行操作

什么是easyExcel

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

官网:EasyExcel · 语雀 (yuque测试数据)

一个excel表格由工作簿、工作表、行、列组成

写入表格

1、引入依赖

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

<!-- easyexcel-->

  < dependency >

      < groupId >com.alibaba</ groupId >

      < artifactId >easyexcel</ artifactId >

      < version >2.2.0-beta2</ version >

  </ dependency >

  < dependency >

      < groupId >com.alibaba</ groupId >

      < artifactId >fastjson</ artifactId >

      < version >1.2.54</ version >

  </ dependency >

  <!--lombok-->

  < dependency >

      < groupId >org.projectlombok</ groupId >

      < artifactId >lombok</ artifactId >

      < version >1.18.20</ version >

  </ dependency >

  <!--日期格式化工具-->

  < dependency >

      < groupId >joda-time</ groupId >

      < artifactId >joda-time</ artifactId >

      < version >2.10.10</ version >

  </ dependency >

  <!--test-->

  < dependency >

      < groupId >junit</ groupId >

      < artifactId >junit</ artifactId >

      < version >4.13.2</ version >

  </ dependency >

2、先创建与表对应的实体类

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

@Data

public class DemoData {

     @ExcelProperty ( "字符串标题" )

     private String string;

     @ExcelProperty ( "日期标题" )

     private Date date;

     @ExcelProperty ( "数字标题" )

     private Double doubleData;

     /**

      * 忽略这个字段

      */

     @ExcelIgnore

     private String ignore;

}

3、生成表格

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

private List<DemoData> data() {

        List<DemoData> list = new ArrayList<DemoData>();

        for ( int i = 0 ; i < 10 ; i++) {

            DemoData data = new DemoData();

            data.setString( "字符串" + i);

            data.setDate( new Date());

            data.setDoubleData( 0.56 );

            list.add(data);

        }

        return list;

    }

     //根据list 写入excel

    @Test

    public void simpleWrite() {

        String path = "D:\\qdSystem\\Resources\\下载\\" ;

        // 写法1

        String fileName = path + "qiadnu.xlsx" ;

        // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭

        EasyExcel.write(fileName, DemoData. class ).sheet( "模板" ).doWrite(data());

    }

读取表格

1、实体类 同上。

2、解析

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

// 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去

public class DemoDataListener extends AnalysisEventListener<DemoData> {

     private static final Logger LOGGER = LoggerFactory.getLogger(DemoDataListener. class );

     /**

      * 每隔5条存储数据库,实际使用中可以3000条,然后清理list ,方便内存回收

      */

     private static final int BATCH_COUNT = 5 ;

     List<DemoData> list = new ArrayList<DemoData>();

     /**

      * 假设这个是一个DAO,当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。

      */

     private DemoDAO demoDAO;

     public DemoDataListener() {

         // 这里是demo,所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数

         demoDAO = new DemoDAO();

     }

     /**

      * 如果使用了spring,请使用这个构造方法。每次创建Listener的时候需要把spring管理的类传进来

      *

      * @param demoDAO

      */

     public DemoDataListener(DemoDAO demoDAO) {

         this .demoDAO = demoDAO;

     }

     /**

      * 这个每一条数据解析都会来调用

      * @param context

      */

     @Override

     public void invoke(DemoData data, AnalysisContext context) {

         LOGGER.info( "解析到一条数据:{}" , JSON.toJSONString(data));

         list.add(data);

         // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM

         if (list.size() >= BATCH_COUNT) {

             saveData();

             // 存储完成清理 list

             list.clear();

         }

     }

     /**

      * 所有数据解析完成了 都会来调用

      *

      * @param context

      */

     @Override

     public void doAfterAllAnalysed(AnalysisContext context) {

         // 这里也要保存数据,确保最后遗留的数据也存储到数据库

         saveData();

         LOGGER.info( "所有数据解析完成!" );

     }

     /**

      * 加上存储数据库

      */

     private void saveData() {

         LOGGER.info( "{}条数据,开始存储数据库!" , list.size());

         demoDAO.save(list);

         LOGGER.info( "存储数据库成功!" );

     }

}

Dao层

?

1

2

3

4

5

6

7

8

/**

  * 假设这个是你的DAO存储。当然还要这个类让spring管理,当然你不用需要存储,也不需要这个类。

  **/

public class DemoDAO {

     public void save(List<DemoData> list) {

         // 如果是mybatis,尽量别直接调用多次insert,自己写一个mapper里面新增一个方法batchInsert,所有数据一次性插入

     }

}

3、测试

?

1

2

3

4

5

6

7

8

@Test

public void simpleRead() {

     // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去

     // 写法1:

     String fileName = path + "qiadnu.xlsx" ;

     // 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭

     EasyExcel.read(fileName, DemoData. class , new DemoDataListener()).sheet().doRead();

}

这里只是简单使用,具体到官方文档进行解读

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!

原文链接:https://HdhCmsTestcnblogs测试数据/qd666/p/15370458.html

查看更多关于java操作excel表格详解的详细内容...

  阅读:17次