当前位置: 首页 > news >正文

为什么做电子商务网站的原因赣州住房建设部网站

为什么做电子商务网站的原因,赣州住房建设部网站,配件网站模板,快速建站学什么0. 引言 在业务系统开发中#xff0c;我们经常遇到excel导入导出的业务场景#xff0c;普通的excel导入导出我们可以利用 apache poi、jxl以及阿里开源的easyexcel来实现#xff0c;特别easyexcel更是将excel的导入导出极大简化#xff0c;但是对于一些负载的表格形式我们经常遇到excel导入导出的业务场景普通的excel导入导出我们可以利用 apache poi、jxl以及阿里开源的easyexcel来实现特别easyexcel更是将excel的导入导出极大简化但是对于一些负载的表格形式比如一条数据中再包含了多条子表数据的一对多场景还有多对多场景这类场景时easyexcel相对支持较弱。 于是今天我们就来看看如何通过apache easy-poi库来实现excel一对多、多对多导入导出的功能 1. easy-poi介绍 easy-poi是一个基于Apache POI的Java端Excel 操作工具库目的是为了简化java程序对excel文件的操作。该库提供了简单的API接口支持excel的读写、格式化等以及excel数据导出到pdf、word等文件。 官方地址https://gitee.com/lemur/easypoi easy-poi提供了3个版本的工具库 easypoi-base easypoi-base 是 easypoi的核心模块提供了基本的 Excel 处理功能如读取、写入、转换等。 它不依赖于 Spring Boot可以在任何 Java 项目中使用。 这个模块主要包含了 EasyPOI 的核心 API如 ExcelReader、ExcelWriter、SXSSFSheet 等。easypoi-web easypoi-web 是基于 Spring Boot 的 Web 模块它扩展了 easypoi-base 的功能主要用于在 Web 环境中处理 Excel 文件。 这个模块提供了基于 Spring MVC 的控制器和方法使得可以通过 HTTP 请求来上传和下载 Excel 文件。 easypoi-web 支持文件上传、文件下载、Excel 表单提交等功能适用于需要在前端界面和后端服务之间传输 Excel 文件的应用场景。easypoi-annotation easypoi-annotation 是 easypoi 的注解模块它提供了一系列注解用于简化对象与 Excel 表格之间的映射。 通过使用这些注解可以非常方便地将 Java 对象转换为 Excel 文件或者从 Excel 文件中读取数据到 Java 对象。 这个模块特别适合于需要将数据库表结构映射为 Excel 文件或者将 Excel 文件数据导入到数据库表中的场景。 2. 导入功能实现 作者提供使用案例https://gitee.com/lemur/easypoi/blob/master/basedemo.md 2.1 一对一导入 1、引入easypoi依赖这里我们项目环境是springboot 2.6.13java 1.8版本因为已经引入了spring-web依赖这里就单独引入easypoi-base核心库即可 dependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-base/artifactIdversion4.2.0/version/dependency另外引入下依赖hibernate-validator用于支持校验注解否则会报错 Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider dependencygroupIdorg.hibernate/groupIdartifactIdhibernate-validator/artifactIdversion5.4.1.Final/version/dependency2、创建实体类通过Excel注解标注excel列表和实体类字段的绑定关系其中name属性要与导入的excel列名保持完全一致 Data public class DataInfo {Excel(name 姓名 )private String name;Excel(name 数量 )private Integer number;Excel(name 地址 )private String address;Excel(name 创建日期, formatyyyy-MM-dd, width 24)private Date createDate;}3、创建导入接口 通过ExcelImportUtil.importExcel接口即可实现导入excel数据解析 PostMapping(import)public ListDataInfo importData(MultipartFile file) throws Exception {ImportParams params new ImportParams();params.setTitleRows(1);params.setHeadRows(2);params.setNeedVerify(true);ListDataInfo dataInfos ExcelImportUtil.importExcel(file, DataInfo.class, params);return dataInfos;}需要注意的是这里的TitleRows表示的是excel导入文件中的标题行的所在行数HeadRows表示的是表头行的所在行数 如下图黄色部分所示就是excel的标题行蓝色部分就是表头行如果没有标题将其值设置为0或不设置即可该值默认为0 4、所用的模版文件如上图所示注意列名与实体类中的name属性保持一致否则会识别不到 2.2 一对多多对多导入 1、要实现一对多导入就需要通过ExcelImportUtil.importExcelMore方法该方法返回一个ExcelImportResult对象 该对象中的list字段就是解析出来的数据failList是解析失败时的数据verifyFail表示验证是否失败。workbook和failWorkbook就是对应解析成功和失败时的表格体对象 2、我们利用该方法书写一个工具类实现导入方法 public static T ListT importExcel(MultipartFile file, Integer titleRows, Integer headerRows,ClassT clazz) {if (file null) {return null;}ImportParams params new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);params.setNeedVerify(true);ExcelImportResultT result null;try {InputStream inputStream file.getInputStream();result ExcelImportUtil.importExcelMore(inputStream, clazz, params);} catch (NoSuchElementException e) {// 日志记录错误log.error(String.format(导入数据为空: %s, ExceptionUtils.getStackTrace(e)));throw new RuntimeException(导入数据为空);} catch (Exception e) {// 日志记录错误log.error(String.format(导入失败: %s, ExceptionUtils.getStackTrace(e)));throw new RuntimeException(导入失败);}if (result null) {return null;}if (result.isVerifyFail()) {// 如有需要可以根据result.getFailWorkbook();获取到有错误的数据throw new RuntimeException(校验出错);}return result.getList();}3、实体类中我们创建子类实体 Data public class DataInfoOrder {Excel(name 订单号)private String orderNo;Excel(name 价格)private BigDecimal price;Excel(name 商品类型)private String type;Excel(name 商品名称)private String name; }4、主类实体中通过ExcelCollection注解声明子类且在需要合并表头的单元格中添加needMerge true注意一对多的字段要写到最后 Data public class DataInfo {Excel(name 姓名 , needMerge true)private String name;Excel(name 数量 , needMerge true)private Integer number;Excel(name 地址 , needMerge true)private String address;Excel(name 创建日期, formatyyyy-MM-dd, width 24,needMerge true)private Date createDate;ExcelCollection(name 订单信息)private ListDataInfoOrder orderList;其对应的导入模版如下图可以看到需要合并的就是前面一对一的字段 5、如果需要多对多则再添加一个ExcelCollection即可 Data public class DataInfo {Excel(name 姓名 , needMerge true)private String name;Excel(name 数量 , needMerge true)private Integer number;Excel(name 地址 , needMerge true)private String address;Excel(name 创建日期, formatyyyy-MM-dd, width 24,needMerge true)private Date createDate;ExcelCollection(name 订单信息)private ListDataInfoOrder orderList;ExcelCollection(name 标签信息)private ListDataInfoTag tagList; }模版如下注意这里故意模拟了3种多对多产生的数据空缺情况后者空缺、前者空缺、都不空缺待会我们看看解析的数据是怎么样的 6、修改一下导入接口 PostMapping(import)public ListDataInfo importData(MultipartFile file) throws Exception {ListDataInfo dataInfos ExcelUtil.importExcel(file, 1, 2, DataInfo.class);return dataInfos;}7、测试调用 8、解析返回数据如下可以看到实际上表格中的空行子数据也添加了一个空子对象因为easypoi本身是通过构建识别workbook表格对象的方式来解析数据的因为这些空行属于中间空行上下都有值因此会被识别为空对象这算是一个待优化项但主体数据正确解析了实际我们再通过一个非空判断就可以过滤这些空子对象也很好处理。 [{name: 张三,number: 2,address: 王府井,createDate: 2024-03-31T16:00:00.00000:00,orderList: [{orderNo: 2024040100001,price: 20,type: 生鲜,name: 苹果},{orderNo: 2024040100002,price: 10,type: 生鲜,name: 香蕉}],tagList: [{tag: 送货上门,type: 物流,level: 1},{tag: null,type: null,level: null}]},{name: 李四,number: 2,address: 中山中路,createDate: 2024-03-31T16:00:00.00000:00,orderList: [{orderNo: 2024040100003,price: 100,type: 电器,name: 充电器},{orderNo: 2024040100004,price: 20000,type: 电脑,name: macbook},{orderNo: null,price: null,type: null,name: null}],tagList: [{tag: 送货上门,type: 物流,level: 1},{tag: 电子产品,type: 货物,level: 2},{tag: 24小时达,type: 物流,level: 1}]},{name: 王五,number: 2,address: 中山中路,createDate: 2024-03-31T16:00:00.00000:00,orderList: [{orderNo: 2024040100005,price: 10,type: 百货,name: 手机膜},{orderNo: 2024040100006,price: 200,type: 百货,name: 电钻}],tagList: [{tag: 送货上门,type: 物流,level: 1},{tag: 24小时达,type: 物流,level: 1}]} ]3. 导出功能实现 1、导入实现了导出的实现就相对更加简单了只需要调用ExcelExportUtil.exportExcel方法即可 该方法需要三个参数 ExportParams对象我们自己new一个如果有导出样式要求可以在该对象中定义 Class 导出的实体类class与导入时创建的实体类一个用法字段上声明Excel注解可以在其中声明数据格式、表格高度、宽度等如果有一对多、多对多的子表导出那么通过ExcelCollection声明即可Collection? dataSet 要导出的数据其结构体与上述class参数保持一致 2、当然该方法是构建了一个Workbook对象如果我们需要excel文件导出到浏览器就需要将其文件数据输出为文件流响应给前端那么还需要用到响应体HttpServletResponse以及Workbook的write方法同时声明好数据类型content-Type为文件流 基础示例代码如下 public static T void downLoadExcel(String fileName, HttpServletResponse response,Class clazz,Workbook workbook) throws RuntimeException{ExportParams params new ExportParams();params.setSheetName(data);//设置sheet名try {// 兼容中文fileName new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1); response.setCharacterEncoding(utf-8);response.setHeader(content-Type, application/octet-stream);response.setHeader(Content-Disposition, attachment;filename fileName);workbook.write(response.getOutputStream());} catch (IOException e) {// 一个自定义枚举 错误信息的e.printStackTrace();throw new RuntimeException(下载出错);}}3、导出接口封装同时造一下假数据 GetMapping(export)public void exportData(HttpServletResponse response){ListDataInfo dataInfos new ArrayList();for (int i 1; i 10; i) {DataInfo info new DataInfo();info.setName(数据i);info.setAddress(地址i);info.setNumber(i);info.setCreateDate(new Date());Random rand new Random();int num rand.nextInt(5) 1;int num2 rand.nextInt(5) 1;ListDataInfoOrder orderList new ArrayList(num);for (int j 1; j num; j) {DataInfoOrder order new DataInfoOrder();order.setPrice(new BigDecimal(j));order.setName(商品j);order.setOrderNo(订单号j);order.setType(类型j);orderList.add(order);}ListDataInfoTag tagList new ArrayList();for (int j 1; j num2; j) {DataInfoTag tag new DataInfoTag();tag.setTag(标签j);tag.setLevel(j);tag.setType(标签类型j);tagList.add(tag);}info.setOrderList(orderList);info.setTagList(tagList);dataInfos.add(info);}ExcelUtil.downLoadExcel(导出数据.xlsx, response, DataInfo.class, dataInfos);}4、浏览器直接调用该导出接口 5、导出生成的excel如下图所示有样式需要的大家自行在ExportParams参数中调整即可 总结 如上我们就实现了针对excel的一对一、一对多、多对多的导入导出功能实际使用时大家可以将方法进行二次封装实现更加简洁方便的API 本文演示代码见https://gitee.com/wuhanxue/wu_study/tree/master/demo/excel_import_demo
http://www.hkea.cn/news/14511764/

相关文章:

  • 长春财经学院宿舍图片佛山seo优化
  • 外汇申报在哪个网站上做响水做网站找哪家好
  • 仓储物流网站建设自己电脑上做网站
  • 建设网站要多少费用购物网站 app
  • 重庆网站建设 快速建站可信网站认证logo
  • 医院网站建设方案策划书网站开发英文论文
  • 山东济南网站建设怎么弄一个网站
  • 网站开发要学什么搜索网站的方法
  • 企业网站推广属于付费推广吗做网站还要做点手机吗
  • 城市建设灯具网站免费商标logo在线制作软件
  • 模板建站小程序公司和公司网站的关系
  • 沈阳网站建设定制怎么做seo关键词优化
  • 网站开发 职位百度怎么做自己的网站
  • 科技 网站建设做美食有哪些网站
  • 做宣传网站的公司网站的汉化包怎么做
  • 哪些网站可以做go注释学校招聘教师网站建设
  • 杭州专业做网站的公司怎么开个网站
  • 接网站建设单子的网站设计网页机构
  • 做电商网站的公司怎样建手机网站
  • 网站模版上线需要什么意思网站设计规范
  • 做园林景观的网站免费行情100个软件
  • 中国建设教育协会网站开发手机网站
  • 旅游网站建设服务网站设计公司哪家好
  • 网站一直做竞价么搭建自己的博客网站
  • 福建专业网站建设公司小型app开发公司
  • 温州做网站如何汉化wordpress插件
  • 网站备案号查询系统织梦网站中的对话框怎摸做
  • 学做宝宝衣服的网站尚海整装为啥口碑那么差
  • 精品手机网站案例徐州人才网
  • 个人做网站时不要做什么样的网站百度平台我的订单