Java实现excel表数据的批量存储(结合easyexcel插件)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Java实现excel表数据的批量存储(结合easyexcel插件)

场景:加哥最近在做项目时,苦于系统自身并未提供数据批量导入的功能还不能自行添加上该功能,且自身不想手动一条一条将数据录入系统。随后,自己使用JDBC连接数据库、使用EasyExcel插件读取表格并将数据按照业务逻辑批量插入数据库完成数据的初始化。接下来就看看加哥是怎么做的呢?

第一步:创建一个maven项目并导入依赖。

结合项目需要,只需要数据库和easyexcel的依赖包(在这里加哥使用的是mysql数据库,引入的就是mysql的数据库驱动,如果你想用sqlServer等数据库自行更换依赖就行)。

 

<!--数据库驱动-->

<dependency>

 <groupId>mysql</groupId>

 <artifactId>mysql-connector-java</artifactId>

 <version>8.0.21</version>

</dependency>

<!--表格导入处理-->

<dependency>

 <groupId>com.alibaba</groupId>

 <artifactId>easyexcel</artifactId>

 <version>3.1.3</version>

</dependency>

第二步:手写或者准备好JDBC连接、操作数据库的工具类。

在这里加哥是把JDBC连接数据库、操作数据库、关闭数据库封装成了工具类并用static修饰作为静态方法,方便后面使用时候直接使用类型.方法调用。

以下是数据库的驱动、url、用户名、密码定义

//驱动

private static String driver = "com.mysql.jdbc.Driver";

//URL

private static String url = "jdbc:mysql://127.0.0.1:3306/mytestcharacterEncoding=utf-8&serverTimezone=Asia/Shanghai";

//用户名

private static String username = "root";

// 密码

private static String pwd = "123456";

连接数据库的方法,由于使用比较频繁将其抽取为一个独立的方法,该方法主要是加载驱动、创建连接。自己可以定义好后,在main方法中直接调用若执行通过则和数据库建立连接成功,否则失败。

/**

* 创建连接

* @return

*/

public static Connection getConnection(){

   Connection connection=null;

   //加载驱动

   try {

       Class.forName(driver);

   } catch (ClassNotFoundException e) {

       e.printStackTrace();

   }

   //建立连接获取Connection对象

   try {

       connection= DriverManager.getConnection(url,username,pwd);

   } catch (SQLException e) {

       e.printStackTrace();

   }

   return connection;

}

关闭连接,由于每次创建连接、都会有一个新的连接打开,如果一直不关闭就会出现连接建立满了的情况,也容易造成资源浪费,因为每次都必须关闭则也将其抽取成一个独立的方法。

/**

* 关闭链接

* @param connection

* @param statement

* @param resultSet

*/

public static void closeAll(Connection connection, Statement statement, ResultSet resultSet){


   try {

       if(resultSet!=null){

           resultSet.close();

       }


       if(statement!=null){

           statement.close();

       }

       if (connection!=null){

           connection.close();

       }

   } catch (SQLException e) {

       e.printStackTrace();

   }

}

封装增删改方法,由于增删改调用的方法一致,则可以将其抽取成一个公用方法,在后面需要的时候直接调用该方法即可。查询方法由于每次处理的数据不一致,不适合做成公用方法。

/**

* 执行增、删、改的方法

* @param sql

* @return

*/

public static int execute(String sql){

   //获取链接

   Connection connection=getConnection();

   int flag=0;

   try {

       //创建Statement对象

       Statement statement=connection.createStatement();

       //执行sql语句

       flag=statement.executeUpdate(sql);

       //关闭链接

       closeAll(connection,statement,null);


   } catch (SQLException e) {

       e.printStackTrace();

   }

   return flag;

}

最后,为了保证我们写的方法可以正常建立连接、关闭连接、完成对应操作,需要大家创建一个main方法完成测试,下面是加哥给大家提供的。但是你在测试过程中,必须保证自己的数据库及其表、表字段都存在。

/*

 测试

*/

public static void main(String[] args) {

   String sql = "SELECT * FROM bs_structure  WHERE id = 1688350472671";

   Connection connection = getConnection();

   Statement statement = null;

   try {

       statement= connection.createStatement();

       ResultSet resultSet = statement.executeQuery(sql);

       while(resultSet.next()){

           String typename = resultSet.getString(3);

           System.out.println("类别名称:"+typename);

       }

   } catch (SQLException e) {

       e.printStackTrace();

   }

}

第三步、创建实体类

实体类的属性必须和excel表格的列数一致,一般有多少列就会定义多少个属性,这里的实体类就是为了后面读取表格时映射处理使用的。以下是加哥的表格式,由于模版有12列则加哥定义了12个属性。大家可以结合自己excel表格的实际情况去完成。

实体类

public class Structure {


   @ExcelProperty(value = "序号", index = 0)

   private String param1;

   @ExcelProperty(value = "水厂", index = 1)

   private String param2;

   @ExcelProperty(value = "工艺", index = 2)

   private String param3;

   @ExcelProperty(value = "设备", index = 3)

   private String param4;

   @ExcelProperty(value = "测点", index = 4)

   private String param5;

   @ExcelProperty(value = "点长名", index = 6)

   private String param6;

   @ExcelProperty(value = "点描述", index = 7)

   private String param7;

   @ExcelProperty(value = "设备类型名称", index = 11)

   private String param8;

   @ExcelProperty(value = "数据类型", index = 8)

   private String param9;

   @ExcelProperty(value = "小数位数", index = 9)

   private String param10;

   @ExcelProperty(value = "单位", index = 10)

   private String param11;

   @ExcelProperty(value = "测点名称", index = 5)

   private String param12;


   public String getParam1() {

       return param1;

   }


   public void setParam1(String param1) {

       this.param1 = param1;

   }


   public String getParam2() {

       return param2;

   }


   public void setParam2(String param2) {

       this.param2 = param2;

   }


   public String getParam3() {

       return param3;

   }


   public void setParam3(String param3) {

       this.param3 = param3;

   }


   public String getParam4() {

       return param4;

   }


   public void setParam4(String param4) {

       this.param4 = param4;

   }


   public String getParam5() {

       return param5;

   }


   public void setParam5(String param5) {

       this.param5 = param5;

   }


   public String getParam6() {

       return param6;

   }


   public void setParam6(String param6) {

       this.param6 = param6;

   }


   public String getParam7() {

       return param7;

   }


   public void setParam7(String param7) {

       this.param7 = param7;

   }


   public String getParam8() {

       return param8;

   }


   public void setParam8(String param8) {

       this.param8 = param8;

   }


   public String getParam9() {

       return param9;

   }


   public void setParam9(String param9) {

       this.param9 = param9;

   }


   public String getParam10() {

       return param10;

   }


   public void setParam10(String param10) {

       this.param10 = param10;

   }


   public String getParam11() {

       return param11;

   }


   public void setParam11(String param11) {

       this.param11 = param11;

   }


   public String getParam12() {

       return param12;

   }


   public void setParam12(String param12) {

       this.param12 = param12;

   }

}

第四步、定义DAO层

在DAO层定义并实现自己需要操作数据库表的方法,加哥在这里直接在DAO层实现并区分接口和实现类,大家可以区分开来做。

public String selectParentId(String param) throws SQLException {

   String sql = "select id from bs_structure where structure_name='" + param + "'";

   Connection connection = BaseDao.getConnection();

   Statement statement = connection.createStatement();

   ResultSet resultSet = statement.executeQuery(sql);

   String id = "";

   while (resultSet.next()) {

       id = resultSet.getString(1);

   }

   BaseDao.closeAll(connection,statement,resultSet);

   return id;


}


public String selectParentId1(String param,String param1) throws SQLException {

   String sql = "select id from bs_structure where structure_name='" + param + "' and parent_uuid= '"+param1+"'";

   Connection connection = BaseDao.getConnection();

   Statement statement = connection.createStatement();

   ResultSet resultSet = statement.executeQuery(sql);

   String id = "";

   while (resultSet.next()) {

       id = resultSet.getString(1);

   }

   BaseDao.closeAll(connection,statement,resultSet);

   return id;


}


public String selectCedianId1(String param,String param1) throws SQLException {

   String sql = "select id from bs_monitor_attr where structure_uuid='" + param + "' and tag_long_name= '"+param1+"'";

   Connection connection = BaseDao.getConnection();

   Statement statement = connection.createStatement();

   ResultSet resultSet = statement.executeQuery(sql);

   String id = "";

   while (resultSet.next()) {

       id = resultSet.getString(1);

   }

   BaseDao.closeAll(connection,statement,resultSet);

   return id;


}


public String selectObjectId(String objectType, String typename) throws SQLException {

   String sql = "SELECT id FROM `bs_object` where object_type='" + objectType + "' and type_name='" + typename + "'";

   Connection connection = BaseDao.getConnection();

   Statement statement = connection.createStatement();

   ResultSet resultSet = statement.executeQuery(sql);

   String id = "";

   while (resultSet.next()) {

       id = resultSet.getString(1);

   }

   BaseDao.closeAll(connection,statement,resultSet);

   return id;

}

public String selectObjectId1(String typename) throws SQLException {

   String sql = "SELECT id FROM `bs_object` where type_name='" + typename + "'";

   Connection connection = BaseDao.getConnection();

   Statement statement = connection.createStatement();

   ResultSet resultSet = statement.executeQuery(sql);

   String id = "";

   while (resultSet.next()) {

       id = resultSet.getString(1);

   }

   BaseDao.closeAll(connection,statement,resultSet);

   return id;

}

/**

* 基本信息表数据填充

*

* @param id

* @param structureUuid

* @param structureInfoCode

* @param structureinfovalue

* @return

*/

public int insertStructure(String id, String structureUuid, String structureInfoCode, String structureinfovalue) {

   String sql = "insert into bs_structure_info (id,structure_uuid,structure_info_code,structure_info_value) values ('" + id + "','" + structureUuid + "','" + structureInfoCode + "','" + structureinfovalue + "')";


   return BaseDao.execute(sql);

}


public int insertSbtype(Structure structure) {

   Calendar cal = Calendar.getInstance();

   String utcTime=String.valueOf(cal.getTimeInMillis());

   String sql = "insert into bs_object (id,object_type,type_name,type_code) values ('" + utcTime + "','" + structure.getParam2() + "','" + structure.getParam3() + "','" + structure.getParam4() + "')";

   Calendar cal1 = Calendar.getInstance();

   String utcTime1=String.valueOf(cal1.getTimeInMillis());

   String sql1 = "insert into bs_object_param (id,object_uuid,param_uuid,param_val) values ('" + utcTime1 + "','" + utcTime + "','f4ae866d-937a-11ec-9c0b-00ff8dea45f7','')";

   BaseDao.execute(sql);

   return BaseDao.execute(sql1);

}




/**

* 根据名称查询类型

*

* @param name

* @return

* @throws SQLException

*/

public String selectSbtypeByName(String name) throws SQLException {

   String sql = "select id from bs_object where type_name='" + name + "'";

   Connection connection = BaseDao.getConnection();

   Statement statement = connection.createStatement();

   ResultSet resultSet = statement.executeQuery(sql);

   String id = "";

   while (resultSet.next()) {

       id = resultSet.getString(1);

   }

   BaseDao.closeAll(connection,statement,resultSet);

   return id;

}


/**

* 保存设备实例数据

* @param id

* @param object_uuid

* @param structure_name

* @param parent_uuid

* @param if_scrap

* @param if_logic_delete

* @param if_restrain

* @param object_type

* @param structure_code

* @param type_name

* @param if_issued

* @return

*/

public int saveStructure(String id, String object_uuid, String structure_name, String parent_uuid, String if_scrap, String if_logic_delete, String if_restrain, String object_type, String structure_code, String type_name, String if_issued) {

   String sql = "INSERT INTO `bs_structure` \n" +

           "\t(`id`, \n" +

           "\t`object_uuid`, \n" +

           "\t`structure_name`, \n" +

           "\t`parent_uuid`, \n" +

           "\t`if_scrap`, \n" +

           "\t`object_type`, \n" +

           "\t`structure_code`, \n" +

           "\t`type_name`, \n" +

           "\t`if_issued`\n" +

           "\t)\n" +

           "\tVALUES\n" +

           "\t('"+id+"', \n" +

           "\t'"+object_uuid+"', \n" +

           "\t'"+structure_name+"', \n" +

           "\t'"+parent_uuid+"', \n" +

           "\t'"+if_scrap+"', \n" +

           "\t'"+object_type+"', \n" +

           "\t'"+structure_code+"', \n" +

           "\t'"+type_name+"', \n" +

           "\t'"+if_issued+"'\n" +

           "\t);\n";

   return BaseDao.execute(sql);

}



/**

* 插入数据

*

* @param id

* @param objectId

* @param pointName

* @param tagDescribe

* @param dataType

* @param readOrWrite

* @param decimal

* @param unit

* @param inShow

* @param ifshow3d

* @param ifrange

* @return

*/

public int insertObjectMonitor(String id, String objectId, String pointName, String tagDescribe, String pointType, String dataType, String readOrWrite, String decimal, String unit, String inShow, String ifshow3d, String ifrange) {

   String sql = "insert into bs_object_monitor_attr (id,object_id,point_name,tag_describe,point_type,data_type,read_or_write,decimal_digit,unit,if_show,if_show_3d,if_ranging) values ('" + id + "','" + objectId + "','" + pointName + "','" + tagDescribe + "','" + pointType + "','" + dataType + "','" + readOrWrite + "','" + decimal + "','" + unit + "','" + inShow + "','" + ifshow3d + "','" + ifrange + "')";

   return BaseDao.execute(sql);

}



/**

* 根据对象类型id获取测点信息数据

*

* @param name

* @return

* @throws SQLException

*/

public String selectCedianInfoByobjid(String name,String name1) throws SQLException {

   String sql = "select id from bs_object_monitor_attr where point_name='" + name + "' and object_id='"+name1+"'";

   Connection connection = BaseDao.getConnection();

   Statement statement = connection.createStatement();

   ResultSet resultSet = statement.executeQuery(sql);

   String id = "";

   while (resultSet.next()) {

       id = resultSet.getString(1);

   }

   BaseDao.closeAll(connection,statement,resultSet);

   return id;

}


/**

* 根据单位名称获取单位的id

* @param name

* @return

* @throws SQLException

*/

public String selectUnitIdByName(String name) throws SQLException {

   String sql="SELECT id FROM `bs_unit` where unit_name='"+name+"'";

   Connection connection = BaseDao.getConnection();

   Statement statement = connection.createStatement();

   ResultSet resultSet = statement.executeQuery(sql);

   String id = "";

   while (resultSet.next()) {

       id = resultSet.getString(1);

   }

   BaseDao.closeAll(connection,statement,resultSet);

   return id;

}


第五步、定义Service层

在Service层定义数据的保存方法,便于处理时候调用。

/**

    * 上一行数据的存储

    */

   public Structure afterData;


   /**

    * 数据持久化

    * @param cachedDataList

    * @throws SQLException

    */

   public void saveStructure(List<Structure> cachedDataList) throws SQLException, InterruptedException {

       System.out.println(cachedDataList);

       StructureDao structureDao =new StructureDao();

       for(int i=1;i<cachedDataList.size();i++){

           //等待


           Structure structure=cachedDataList.get(i);


           //若出现合并行将其合并行的数据填充进来

           if("".equals(structure.getParam2())||null==structure.getParam2()){

               structure.setParam2(afterData.getParam2());

           }

           if("".equals(structure.getParam3())||null==structure.getParam3()){

               structure.setParam3(afterData.getParam3());

           }

           if("".equals(structure.getParam4())||null==structure.getParam4()){

               structure.setParam4(afterData.getParam4());

           }

           if("".equals(structure.getParam5())||null==structure.getParam5()){

               structure.setParam5(afterData.getParam5());

           }

           if("".equals(structure.getParam6())||null==structure.getParam6()){

               structure.setParam6(afterData.getParam6());

           }

           if("".equals(structure.getParam7())||null==structure.getParam7()){

               structure.setParam7(afterData.getParam7());

           }

           if("".equals(structure.getParam8())||null==structure.getParam8()){

               structure.setParam8(afterData.getParam8());

           }



           //先判断第一个节点是否存在,存在的话查询它的id


           String parentID= structureDao.selectParentId(structure.getParam2());

           Calendar cal = Calendar.getInstance();

           //将点长名进行拆分

           String[] changmingchaifens=structure.getParam6().split("/");

           if(parentID==""&&parentID.equals("")){

               //获取object对应关系表

               String objectID= structureDao.selectObjectId("非设备","厂区");


               //不存在

               String preUuid =String.valueOf(cal.getTimeInMillis())+(int)(1+Math.random()*100);

               //System.out.println("preUuid0"+preUuid);

               int flag=  structureDao.saveStructure(preUuid, objectID, structure.getParam2(), "1688107649766",  "", "", "", "非设备", changmingchaifens[0], "厂区", "false");


               if(flag==1){

                   parentID=preUuid;

               }

               //提交节点的基本信息表获取数据

               structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentID,"type_name","厂区");

               structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentID,"f4ae8186-937a-11ec-9c0b-00ff8dea45f7","116.404,39.915,0,0,13");

               structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentID,"f4ae866d-937a-11ec-9c0b-00ff8dea45f7","getPtFormHtml?code=Bd_DeviceDetails");


           }

           //判断工艺节点是否存在

           String parentIdOfGy= structureDao.selectParentId1(structure.getParam3(),parentID);


           if(parentIdOfGy==""&&parentIdOfGy.equals("")){

               //获取object对应关系表

               String objectID= structureDao.selectObjectId("非设备","管理节点");

               TimeUnit.MILLISECONDS.sleep(1);

               //不存在

               String preUuid = String.valueOf(cal.getTimeInMillis())+(int)(1+Math.random()*100);

               int flag=  structureDao.saveStructure(preUuid, objectID, structure.getParam3(), parentID,"", "", "", "非设备", changmingchaifens[1], "管理节点", "false");

               if(flag==1){

                   parentIdOfGy=preUuid;

               }

               //提交节点的基本信息表获取数据

               structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfGy,"type_name","管理节点");

               structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfGy,"f4ae8186-937a-11ec-9c0b-00ff8dea45f7","116.404,39.915,0,0,13");

               structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfGy,"f4ae866d-937a-11ec-9c0b-00ff8dea45f7","getPtFormHtml?code=Bd_DeviceDetails");


           }

           //判断设备是否存在:根据他的父节点及其设备名称判断是否存在若不存在进行导入


           String parentIdOfSb= structureDao.selectParentId1(structure.getParam4(),parentIdOfGy);


           if(parentIdOfSb==""&&parentIdOfSb.equals("")){

               //获取object对应关系表

               String objectID= structureDao.selectObjectId1(structure.getParam8());

               TimeUnit.MILLISECONDS.sleep(1);

               //不存在

               String preUuid = String.valueOf(cal.getTimeInMillis())+(int)(1+Math.random()*100);

               int flag=  structureDao.saveStructure(preUuid, objectID, structure.getParam4(), parentIdOfGy,"", "", "","设备",preUuid, structure.getParam8(), "false");


               if(flag==1){

                   parentIdOfSb=preUuid;

               }


               //测点信息录入

               String preUuidcd = String.valueOf(cal.getTimeInMillis());

               String[] point_names=structure.getParam5().split("_");

               String[] tag_describes=structure.getParam7().split("_");

               String sql1="";

               if(null==structure.getParam10()&&null==structure.getParam11()){

                   //不保存数据位数

                   //System.out.println(structure.getParam6());

                   String longName="/"+structure.getParam6();


                   sql1= "insert into bs_monitor_attr (id,structure_uuid,point_name,tag_describe,data_type,read_or_write,data_source,tag_long_name) values ('"+preUuidcd+"','"+parentIdOfSb+"','"+structure.getParam12()+"','"+tag_describes[tag_describes.length-1]+"','"+structure.getParam9()+"','只读','2','"+longName+"')";


               }else{

                   String longName="/"+structure.getParam6();

                   sql1= "insert into bs_monitor_attr (id,structure_uuid,point_name,tag_describe,data_type,read_or_write,data_source,tag_long_name,decimal_digit,unit) values ('"+preUuidcd+"','"+parentIdOfSb+"','"+structure.getParam12()+"','"+tag_describes[tag_describes.length-1]+"','"+structure.getParam9()+"','只读','2','"+longName+"','"+Integer.valueOf(structure.getParam10())+"','"+structureDao.selectUnitIdByName(structure.getParam11())+"')";


               }

               int flag1=BaseDao.execute(sql1);


               //根据名称查询设备类型id

               String object_id= structureDao.selectObjectId1(structure.getParam8());

               //根据测点名称判断数据是否存在

               String cedianId= structureDao.selectCedianInfoByobjid(structure.getParam12(),object_id);


               if(cedianId==""&&cedianId.equals("")){

                   //不存在

                   //将测点数据同步至设备类型对应的bs_object_monitor_attr里面

                   structureDao.insertObjectMonitor(String.valueOf(cal.getTimeInMillis()),object_id,structure.getParam12(),tag_describes[tag_describes.length-1],"",structure.getParam9(),"只读",structure.getParam10(),structureDao.selectUnitIdByName(structure.getParam11()),"1","1","1");


               }


               //提交节点的基本信息表获取数据

               structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfSb,"type_name",structure.getParam8());

               structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfSb,"f4ae8186-937a-11ec-9c0b-00ff8dea45f7","116.404,39.915,0,0,13");

               structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfSb,"f4ae866d-937a-11ec-9c0b-00ff8dea45f7","getPtFormHtml?code=Bd_DeviceDetails");


               System.out.println("第{"+(i)+"}条数据,存储至数据库完成!");

           }else{

               //判断测点信息在不在

               //测点信息录入,根据设备id与长名判断是否一致,若不一致则录入

               String[] point_names=structure.getParam5().split("_");

               //根据测点名称判断数据是否存在

               String longName1="/"+structure.getParam6();


               String cedianId0 = structureDao.selectCedianId1(parentIdOfSb,longName1);

               if(cedianId0==""&&cedianId0.equals("")){

                   //录入

                   String preUuidcd = String.valueOf(cal.getTimeInMillis());

                   String[] tag_describes=structure.getParam7().split("_");

                   String sql1="";

                   if(null==structure.getParam10()&&null==structure.getParam11()){

                       //不保存数据位数

                       String longName="/"+structure.getParam6();


                       sql1= "insert into bs_monitor_attr (id,structure_uuid,point_name,tag_describe,data_type,read_or_write,data_source,tag_long_name) values ('"+preUuidcd+"','"+parentIdOfSb+"','"+structure.getParam12()+"','"+tag_describes[tag_describes.length-1]+"','"+structure.getParam9()+"','只读','2','"+longName+"')";


                   }else{

                       String longName="/"+structure.getParam6();


                       sql1= "insert into bs_monitor_attr (id,structure_uuid,point_name,tag_describe,data_type,read_or_write,data_source,tag_long_name,decimal_digit,unit) values ('"+preUuidcd+"','"+parentIdOfSb+"','"+structure.getParam12()+"','"+tag_describes[tag_describes.length-1]+"','"+structure.getParam9()+"','只读','2','"+longName+"','"+Integer.valueOf(structure.getParam10())+"','"+structureDao.selectUnitIdByName(structure.getParam11())+"')";

                   }

                   int flag1=BaseDao.execute(sql1);


                   //根据名称查询设备类型id

                   String object_id= structureDao.selectObjectId1(structure.getParam8());


                   String cedianId= structureDao.selectCedianInfoByobjid(structure.getParam12(),object_id);

                   if(cedianId==""&&cedianId.equals("")){

                       //不存在

                       //将测点数据同步至设备类型对应的bs_object_monitor_attr里面

                       structureDao.insertObjectMonitor(String.valueOf(cal.getTimeInMillis()),object_id,structure.getParam12(),tag_describes[tag_describes.length-1],"",structure.getParam9(),"只读",structure.getParam10(),structureDao.selectUnitIdByName(structure.getParam11()),"1","1","1");


                   }

                   //提交节点的基本信息表获取数据

                /*   structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfSb,"type_name",structure.getParam8());

                   structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfSb,"f4ae8186-937a-11ec-9c0b-00ff8dea45f7","116.404,39.915,0,0,13");

                   structureDao.insertStructure(UUID.randomUUID().toString().replace("-", ""),parentIdOfSb,"f4ae866d-937a-11ec-9c0b-00ff8dea45f7","getPtFormHtml?code=Bd_DeviceDetails");

*/

                   System.out.println("第{"+(i)+"}条数据,存储至数据库完成!");

               }else {

                   System.out.println("第{"+(i)+"}条数据已存在,已跳过该条记录!");

               }


           }

           //数据缓存

           afterData=cachedDataList.get(i);

       }

   }

第六步,使用EasyExcel批量读取并保存数据

大家可以打开easyexcel官网选择自己适合的读取方法,下面展示出来的仅是一种,读取数据并保存数据,在保存数据里面替换成自己的service层的保存方法即可。

String fileName = "D:\\实例表.xlsx";


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

EasyExcel.read(fileName, Structure.class, new ReadListener<Structure>() {

   /**

    * 单次缓存的数据量

    */

   public static final int BATCH_COUNT = 1000;

   /**

    *临时存储的数据

    */

   private List<Structure> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);



   @Override

   public void invoke(Structure data, AnalysisContext context) {

       cachedDataList.add(data);

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

           try {

               saveData();

           } catch (SQLException | InterruptedException e) {

               e.printStackTrace();

           }finally {

               // 存储完成清理 list

               cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

           }

       }

   }


   @Override

   public void doAfterAllAnalysed(AnalysisContext context) {

       try {

           saveData();

       } catch (SQLException | InterruptedException e) {

           e.printStackTrace();

       }

   }


   /**

    * 加上存储数据库

    */

   private void saveData() throws SQLException, InterruptedException {

       StructureService structureService=new StructureService();

       structureService.saveStructure(cachedDataList);

   }

}).sheet().doRead();

第七步,去数据库查看是否存储成功并检查数据是否正确。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
Java
轻松上手Java字节码编辑:IDEA插件VisualClassBytes全方位解析
本插件VisualClassBytes可修改class字节码,包括class信息、字段信息、内部类,常量池和方法等。
120 6
|
1月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
141 5
|
2月前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
113 3
|
2月前
|
缓存 easyexcel Java
Java EasyExcel 导出报内存溢出如何解决
大家好,我是V哥。使用EasyExcel进行大数据量导出时容易导致内存溢出,特别是在导出百万级别的数据时。以下是V哥整理的解决该问题的一些常见方法,包括分批写入、设置合适的JVM内存、减少数据对象的复杂性、关闭自动列宽设置、使用Stream导出以及选择合适的数据导出工具。此外,还介绍了使用Apache POI的SXSSFWorkbook实现百万级别数据量的导出案例,帮助大家更好地应对大数据导出的挑战。欢迎一起讨论!
268 1
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
48 3
|
2月前
|
存储 Java
【编程基础知识】 分析学生成绩:用Java二维数组存储与输出
本文介绍如何使用Java二维数组存储和处理多个学生的各科成绩,包括成绩的输入、存储及格式化输出,适合初学者实践Java基础知识。
94 1
|
18天前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
|
1月前
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
71 6
|
1月前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
102 2
|
1月前
|
Java API Apache