背景

图书馆项目中用到excel的导入导出,不过组长整理了文档,我们可以按照组长整理的文档来。不过,就算是有了文档我们也是遇到了很多问题,做了一些分析之后清晰了很多,说明什么呢?文档是帮助我们思考,不是让我们坐享其成的。


操作

配置文件

在Pom文件中加入下面的配置:

<version.JExcel>1.0.0-SNAPSHOT</version.JExcel>
<!--导入导出的依赖-->
<dependency><groupId>org.jplus</groupId><artifactId>J-Excel</artifactId><version>${version.JExcel}</version>
</dependency>

注解

我们在整个实体中增加注解类注解@ExcelModelConfig
   导入的时候,我们提供相应的文字,例如班级:土木一班,但是我们在数据库增加的一条数据确实这样的:className:土木一班。这个时候需要我们在实体中添加注解,让她知道,班级对应的字段是className。如下:@Lang(value=”属性对应要导出的名字”)导出同上,我们要让它认识到导出的班级的字段是className。
   主外键关联,我们用字典管理。说明一下,我们在班级表中有一个年级的外键:gradeId,但是我们导入的时候,在班级表里插入的数据时年级:一年级,但是我们数据库存的时候,应该是一年级对应的gradeId。首先我们添加注解:@InputDicConfig(dicCode=”gradeId”),其次我们需要将主外键进行关联:

Map<Serializable,Serializable> dictDataMap=new HashMap<>();
Map<Serializable,Serializable> gradeData=new HashMap<>();
Map<Serializable,Serializable> majorData=new HashMap<>();gradeData.put("11", "土木1班");gradeData.put("10", "土木2班");gradeData.put( "9","工管1班");majorData.put("1", "土木工程");majorData.put("2", "信息技术");dictDataMap.put("gradeId", (Serializable) gradeData);dictDataMap.put("majorId", (Serializable) majorData)

excel解析

 String filePath = UploadFileUtil.upload(response, request);Map<Serializable,Serializable> map = new HashMap<>();map.put("sheetName","sheet1");map.put("Class",BookType.class);List<BookType>    importListParentType=ExcelUtil.importExcel(filePath,response,map);

实例分析

导出

 /*** 下载模板--刘雅雯--2017年11月3日20:31:24* @param requst* @param response* @return*/@GET@Path("/downBookType")@ApiOperation(value = "下载模板", response = BookType.class, responseContainer = "List", tags = "Android")@ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = BookType.class),@ApiResponse(code = 400, message = "Not Found", response = BookType.class)})public ItooResult downExcel(@Context HttpServletRequest  requst,@Context HttpServletResponse  response){Map<Serializable,Serializable> map=new HashMap<>();//sheet的名字map.put("sheetName","sheet1");map.put("columns",new String[]{"name","PID","Pname","remark"});//导出的表格标题map.put("title","图书类别管理");List<BookType> bookTypeList = new ArrayList<>();BookType bookTypeView=new BookType();bookTypeView.setName("诗歌");bookTypeView.setPID("文学类");bookTypeView.setPname("文学类");bookTypeView.setRemark("刘雅雯测试数据");bookTypeList.add(bookTypeView);map.put("dataList",(Serializable)bookTypeList);try {ExcelUtil.exportExcel(map,response);log.info("下载模板成功");return  ItooResult.build("0000", "下载成功");} catch (Exception e) {log.error("下载模板失败");return ItooResult.build("1111", "下载失败");}}

导入

我们表中有两个字段:id和pid,其中的主外键关联是一张表进行关联的,根据我们的pid我们要找到对应id下的name是什么;再有就是添加一条记录中我们涉及到了父类和子类的关系,即当父类中没有的话我们需要先添加一条父类,再进行子类的添加。那么问题就来了,因为涉及到了主外键的关联,因此需要进行两次excel解析。

 @POST@Path("/importBookType/")@Consumes({"multipart/form-data"})@Produces({ "application/json" })@ApiOperation(value = "通过excel导入图书分类", notes = "Adds items to the system", response = void.class, tags= "PC")@ApiResponses(value = { @ApiResponse(code = 201, message = "item created", response = void.class),@ApiResponse(code = 400, message = "invalid input, object invalid", response = void.class),@ApiResponse(code = 409, message = "an existing item already exists", response = void.class) })/*** 导入-刘雅雯重构--2017年11月3日20:30:33* */public ItooResult importBookType(@Context HttpServletResponse response,@Context HttpServletRequest request)throws NotFoundException ,Exception{String filePath = UploadFileUtil.upload(response, request);Map<Serializable,Serializable> map = new HashMap<>();map.put("sheetName","sheet1");map.put("Class",BookType.class);//将查询出来的外键关联值放入map中Map<Serializable,Serializable> dictDataMap=new HashMap<>();Map<Serializable,Serializable> classData=new HashMap<>();//当插入子类和父类时:先查询导入中是否有父类,如果没有的话就先添加父类try{//获取excel的数据List<BookType> importListParentType =ExcelUtil.importExcel(filePath,response,map);TBookAndType bookTypeEntity =new TBookAndType();BookType bookTypeList =new BookType();for (int i=0; i<importListParentType.size();i++){bookTypeList=importListParentType.get(i);//判断是父类名称是否为null,如果为null则不用添加if (bookTypeList.getPID()!=null){//通过父类名称查询是否有该条记录List<TBookAndType> bookTypeTemp=bookTypeService.findTypeIdByTypeName(bookTypeList.getPname());//没有这条记录,则添加一条if (bookTypeTemp!=null && bookTypeTemp.size()==0){bookTypeEntity.setpId("0");bookTypeEntity.setName(bookTypeList.getPname());bookTypeEntity.setId(bookTypeList.getId());bookTypeEntity.setShelfId("");bookTypeEntity.setRemark(bookTypeList.getRemark());bookTypeEntity.setoperator("");//添加bookTypeService.addBookType(bookTypeEntity);}else{continue;}}else{continue;}}}catch (Exception e){log.error("导入失败");return ItooResult.build("1111", "教师信息导入失败");}//获取父类名称和键值的对应关系List<TBookAndType> tBookAndTypeList =bookTypeService.findAllbookType();if (tBookAndTypeList!=null && tBookAndTypeList.size()!=0){for (int i =0 ;i<tBookAndTypeList.size();i++){classData.put(tBookAndTypeList.get(i).getId(),tBookAndTypeList.get(i).getName());}}dictDataMap.put("PID",(Serializable)classData);boolean flag = false;try{//获取excel中的数据List<BookType> importList = ExcelUtil.importExcel(filePath,response,map,dictDataMap);TBookAndType bookTypeEntity = new TBookAndType();BookType bookType =new BookType();for(int n = 0; n<importList.size();n++){bookType = importList.get(n);//判断要添加的类别名称是否已经存在,若存在执行n+1List<TBookAndType> bookTypeList=bookTypeService.findTypeIdByTypeName(bookType.getName());if (bookTypeList!=null && bookTypeList.size()!=0){continue;}bookTypeEntity.setId(bookType.getId());bookTypeEntity.setName(bookType.getName());if (bookType.getPID()==null){bookTypeEntity.setpId("0");}else {bookTypeEntity.setpId(bookType.getPID());}bookTypeEntity.setRemark(bookType.getRemark());bookTypeEntity.setShelfId("");bookTypeEntity.setoperator("");bookTypeService.addBookType(bookTypeEntity);}log.info("导入成功");return ItooResult.build("0000", "图书类型信息导入成功",flag);}catch(Exception e){log.error("导入失败");return ItooResult.build("1111", "教师信息导入失败");}}

End

代码的调试,导入的过程可以分成两部分,第一部分:从excel中获取数据,第二部分添加到数据库中。不过我们前端访问的时候就要多加一部分:上传到服务器上。代码调试的过程中思路很重要。
   文档的学习,多加练习自己看起来用起来才不会很被动~

excel导入导出--Java相关推荐

  1. @excel注解_Excel导入导出Java解决方案推荐

    今天锋哥介绍一款Excel导入导出Java解决方案Easy-POI,以前我们用POI,麻烦点,Easy-POI是封装好的,用起来Easy点,封装过,性能好,所以大伙有空可以研究下: Easy-POI ...

  2. java超级简单到爆的Excel导入导出(easypoi)

    场景: 在日常工作中,excel导入导出,是十分常见的,有两种主流的技术,一种是jxl,另一种是poi,而easypoi就是对poi进行了封装,使得导入导出变得更加的简单,阿里巴巴也有封装的工具名叫E ...

  3. java Excel导入导出工具类 及使用demo

    java Excel导入导出工具类 及使用demo 前言:相信进来的都是想尽快解决问题的,话不多说,按照以下步骤来,可以操作导出excel到本地,导入同理,自行学习.步骤一:直接复制以下excel工具 ...

  4. java实现excel导入导出,对象图片读取,上传七牛云

    java实现excel导入导出以及解决方案 因为公司业务需求,要完成针对表格的导入导出,excel这里使用MultipartFile类接收 ,下面是部分关键代码,希望有所帮助 //获取excel文件的 ...

  5. Java操作大数据量Excel导入导出万能工具类(完整版)

    Java操作大数据量Excel导入导出万能工具类(完整版) 转载自:https://blog.csdn.net/JavaWebRookie/article/details/80843653 更新日志: ...

  6. Java操作百万数据量Excel导入导出工具类(程序代码教程)

    Java操作百万数据量Excel导入导出工具类(程序代码教程): # 功能实现1.自定义导入数据格式,支持配置时间.小数点类型(支持单/多sheet)(2种方式:本地文件路径导入(只支持xls.xls ...

  7. Java POI Excel导入导出

    Java POI Excel导入导出 1.maven引入依赖 2.导入Excel 3.导出Excel 1.maven引入依赖 <!-- POI Excel 操作 --> <depen ...

  8. Java poi 实现excel导入导出工具类

    最近项目上又要大量的涉及excel导入导出,网上各种导入导出的方式层出不穷,我是比较青睐官方的poi,但是要自己去操作工作簿对象自己一行一行的读取,会有很多的重复代码,重复劳动,也极为不美观,基于合成 ...

  9. Java实现Excel导入导出操作详解

    前言 本次封装是基于 POI 的二次开发,最终使用只需要调用一个工具类中的方法,就能满足业务中绝大部门的导入和导出需求. 1. 功能测试 1.1 测试准备 在做测试前,我们需要將[2. 环境准备]中的 ...

  10. 注解+反射优雅的实现Excel导入导出(通用版)

    以下文章来源方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/youzi1394046585/ article/details/86670203 日常在做后 ...

最新文章

  1. Python实现一元及多元线性回归
  2. 【字节码插桩】Android 打包流程 | Android 中的字节码操作方式 | AOP 面向切面编程 | APT 编译时技术
  3. Unobtrusive Ajax
  4. Dart 5-Day
  5. 后端技术栈学习路线与面试技巧指北
  6. android mac 调试,Mac下使用Android studio真机调试
  7. python 下载股票数据_利用python下载股票交易数据
  8. python 导入离线地图_PyQGIS开发 -- 离线地图
  9. “丧文化”的祖师:波德莱尔:不懂得使自己的孤独为众人接受的人,也不懂得在碌碌众生中自立。...
  10. java调用第三方短信接口 本地能发送短信,服务器却发不了,直到超时
  11. C++语言,线性素数筛(欧拉筛)
  12. 木瓜移动创始人沈思专访——从平台到孵化器
  13. Eclipse Neon EGit Integration gives Exception 401 Authorization Required
  14. 关于利用kali linux2017.2中MSFCONSOLE 利用MS17-010漏洞发起攻击的坑
  15. Longhorn安装使用全攻略(下)(转)
  16. 精简《JavaScript高级程序设计》五、引用类型(上)
  17. 【概率深度学习简介】
  18. 在线听著名英文原版小说(朗读版超赞)
  19. 【软件测试教程】Jmeter接口测试+压力测试
  20. vCenter 6.7 HTML web console连接vm黑屏

热门文章

  1. I Liked Matrix!
  2. java-php-python-springboot自行车租借管理系统计算机毕业设计
  3. 软件工程 -- RUB,极限编程
  4. Controller参数总结
  5. window配制nginx php
  6. 移动端屏幕适配dp dpi 720P values-sw480dp layout-sw720dp
  7. FOXBORO FBM233 P0926GX输入输出模块
  8. 蓝桥杯 试题 算法训练 审美课(C语言)
  9. springboot毕设项目社区志愿者招募管理系统f7m0s(java+VUE+Mybatis+Maven+Mysql)
  10. python毕设 炸弹人小游戏设计与实现 (源码)