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

沈阳酒店企业网站制作公司沈阳网站建设发布

沈阳酒店企业网站制作公司,沈阳网站建设发布,wordpress version,佛山网站建设专业定制目录 背景需求发展 EasyExcel官网介绍优势常用注解 SpringBoot整合EaxyExcel1.引入依赖2.实体类定义实体类代码示例注解解释 3.自定义转换器转换器代码示例涉及的枚举类型 4.Excel工具类5.简单导出接口SQL 6.简单导入接口SQL 7.复杂的导出#xff08;合并行、合并列#xff0… 目录 背景需求发展 EasyExcel官网介绍优势常用注解 SpringBoot整合EaxyExcel1.引入依赖2.实体类定义实体类代码示例注解解释 3.自定义转换器转换器代码示例涉及的枚举类型 4.Excel工具类5.简单导出接口SQL 6.简单导入接口SQL 7.复杂的导出合并行、合并列解决思路自定义注解定义实体类SQL自定义单元格合并策略接口 背景 需求 在当今信息化社会数据的导入和导出在各种业务场景中变得越来越重要。 发展 我们知道Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题但POI还是有一些缺陷比如07版Excel解压缩以及解压后存储都是在内存中完成的内存消耗依然很大。easyexcel重写了poi对07版Excel的解析一个3M的excel用POI sax解析依然需要100M左右内存改用easyexcel可以降低到几M并且再大的excel也不会出现内存溢出03版依赖POI的sax模式在上层做了模型转换的封装让使用者更加简单方便。为了满足复杂的导入导出需求结合Java编程语言、Spring Boot框架以及EasyExcel库我们可以轻松地构建出强大而灵活的数据处理系统。当涉及到在Spring Boot 中使用 EasyExcel 实现复杂的导入导出案例时我们可以结合 Spring Boot 的特性来实现更灵活和集成化的解决方案。 EasyExcel 官网 https://easyexcel.opensource.alibaba.com/ 介绍 EasyExcel 是一款基于 Java 的开源库专门用于处理 Excel 文件的导入和导出操作。它提供了简单易用的 API使开发人员能够轻松地实现 Excel 数据的读取和写入同时还支持大数据量的处理具有较高的性能和灵活性。 优势 EasyExcel 可以在数据迁移、报表生成、数据分析等多个领域发挥作用尤其适用于需要频繁处理 Excel 数据的场景。无论是个人开发者还是企业开发团队都可以通过 EasyExcel 更轻松地实现数据导入导出功能提高开发效率和用户体验。 简单易用 EasyExcel 提供了简洁的 API 接口让开发人员能够快速上手。无论是初学者还是有经验的开发者都能轻松地实现 Excel 文件的导入导出功能。支持多种数据格式 EasyExcel 支持导入导出多种数据格式包括基本的文本、数字、日期等以及复杂的对象、集合、嵌套结构等数据类型。高性能 EasyExcel 在处理大数据量时表现出色采用了基于流的方式有效地降低了内存消耗提升了性能和效率。自定义样式 开发人员可以灵活地自定义单元格样式包括字体、颜色、对齐方式等使导出的 Excel 数据更加美观和易读。数据转换 EasyExcel 支持自定义数据转换器可以将原始数据转换为目标格式满足业务需求。异常处理 EasyExcel 提供了丰富的异常处理机制能够捕获和处理导入导出过程中的异常情况保障数据的完整性和一致性。多平台支持 EasyExcel 可以在各种 Java 开发环境中使用包括传统的 Java 应用程序、Web 应用程序甚至是移动应用开发中。开源社区 EasyExcel 是一个开源项目拥有活跃的社区支持开发人员可以从社区中获取帮助、贡献代码以及分享经验 常用注解 注解作用ExcelProperty用于标识Excel中的字段可以指定字段在Excel中的列索引或列名。例如ExcelProperty(“姓名”)ExcelProperty(index 0)。ExcelIgnore用于标识不需要导入或导出的字段。ExcelIgnoreUnannotated用于标识未被 ExcelProperty 注解标识的字段是否被忽略。ColumnWidth用于设置 Excel 列的宽度。 这些注解可以根据实际需求进行组合使用以便在 Excel 读写过程中更灵活地控制字段的行为和样式。 SpringBoot整合EaxyExcel 1.引入依赖 !-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --dependencygroupIdcom.alibaba/groupIdartifactIdeasyexcel/artifactIdversion3.1.3/version/dependency2.实体类定义 使用ExcelProperty 注解标记需要在 Excel 中读写的字段可以指定字段在 Excel 中的列索引或列名。 实体类代码示例 package com.zjl.model;import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.format.DateTimeFormat; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.zjl.coverter.BillIsPaymentConverter; import lombok.Data;/*** author: zjl* datetime: 2024/3/29* desc: 订单实体类*/ Data public class BillDO {ExcelIgnoreprivate Long id;ExcelProperty(index 0, value 订单编码) // 列索引为1ColumnWidth(15)private String billCode;//订单编码ExcelProperty(index 1,value 商品名称) // 列索引为2ColumnWidth(30)private String productName;//商品名称ExcelProperty(index 2,value 商品描述) // 列索引为3ColumnWidth(30)private String productDesc;//商品描述ExcelProperty(index 3,value 商品单位) // 列索引为4ColumnWidth(15)private String productUnit;//商品单位ExcelProperty(index 4,value 商品数量) // 列索引为5ColumnWidth(15)private String productCount;//商品数量ExcelProperty(index 5,value 商品总金额) // 列索引为6ColumnWidth(15)private String totalPrice;//商品总金额ExcelProperty(index 6,value 支付状态,converter BillIsPaymentConverter.class) // 列索引为7ColumnWidth(15)private int isPayment;//支付状态:是否支付1未支付 2已支付ExcelProperty(index 7,value 创建人) // 列索引为8ColumnWidth(15)private String createdBy;//创建人ExcelProperty(index 8,value 创建时间) // 列索引为9ColumnWidth(25)DateTimeFormat(yyyy-MM-dd)private String creationDate;//创建时间ExcelProperty(index 9,value 供应商名称) // 列索引为10ColumnWidth(30)private String providerName;//供应商名称 }package com.zjl.model;import com.alibaba.excel.annotation.ExcelProperty; import com.zjl.coverter.BillIsPaymentConverter; import lombok.Data;/*** author: zjl* datetime: 2024/3/30* desc:*/ Data public class BillImportBO {ExcelProperty(index 0, value 订单编码) // 列索引为1private String billCode;//订单编码ExcelProperty(index 1,value 商品名称) // 列索引为2private String productName;//商品名称ExcelProperty(index 2,value 商品描述) // 列索引为3private String productDesc;//商品描述ExcelProperty(index 3,value 商品单位) // 列索引为4private String productUnit;//商品单位ExcelProperty(index 4,value 商品数量) // 列索引为5private String productCount;//商品数量ExcelProperty(index 5,value 商品总金额) // 列索引为6private String totalPrice;//商品总金额ExcelProperty(index 6,value 支付状态,converter BillIsPaymentConverter.class) // 列索引为7private int isPayment;//支付状态:是否支付1未支付 2已支付private String creationDate;//创建时间ExcelProperty(index 7,value 供应商ID) // 列索引为10private String providerId;//供应商名称 }注解解释 ExcelProperty核心注解value属性可用来设置表头名称converter属性可以用来设置类型转换器ColumnWidth用于设置表格列的宽度DateTimeFormat用于设置日期转换格式NumberFormat用于设置数字转换格式。 3.自定义转换器 在EasyExcel中如果想实现枚举类型到字符串类型转换例如isPayment属性1 - 未支付2 - 已支付需实现Converter接口来自定义转换器下面为自定义BillIsPaymentConverter支付状态转换器代码实现 转换器代码示例 package com.zjl.coverter;import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.ReadConverterContext; import com.alibaba.excel.converters.WriteConverterContext; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.metadata.data.WriteCellData; import com.zjl.enums.IsPaymentEnum;/*** author: zjl* datetime: 2024/3/29* desc:*/ public class BillIsPaymentConverter implements ConverterInteger {Overridepublic Class? supportJavaTypeKey() {return Integer.class;}Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}Overridepublic Integer convertToJavaData(ReadConverterContext? context) {return IsPaymentEnum.convert(context.getReadCellData().getStringValue()).getValue();}Overridepublic WriteCellData? convertToExcelData(WriteConverterContextInteger context) {return new WriteCellData(IsPaymentEnum.convert(context.getValue()).getDescription());} }涉及的枚举类型 package com.zjl.enums;import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter;import java.util.stream.Stream;/*** author: zjl* datetime: 2024/3/30* desc:*/ Getter AllArgsConstructor public enum IsPaymentEnum {UNKNOWN(0,其他),ISNOTPAY(1, 未支付),ISPAY(2, 已支付);private final Integer value;JsonFormatprivate final String description;public static IsPaymentEnum convert(Integer value) {return Stream.of(values()).filter(bean - bean.value.equals(value)).findAny().orElse(UNKNOWN);}public static IsPaymentEnum convert(String description) {return Stream.of(values()).filter(bean - bean.description.equals(description)).findAny().orElse(UNKNOWN);} }4.Excel工具类 设置相应结果 package com.zjl.utils;import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; import java.net.URLEncoder;/*** author: zjl* datetime: 2024/3/30* desc:*/ public class ExcelUtil {/*** 设置响应结果*/public static void setExcelResponseProp(HttpServletResponse response, String rawFileName) throws UnsupportedEncodingException {response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet);response.setCharacterEncoding(utf-8);String fileName URLEncoder.encode(rawFileName, UTF-8).replaceAll(\\, %20);response.setHeader(Content-disposition, attachment;filename*utf-8 fileName .xlsx);}}5.简单导出 接口 package com.zjl.controller;import com.alibaba.excel.EasyExcel; import com.alibaba.excel.support.ExcelTypeEnum; import com.zjl.model.BillDO; import com.zjl.service.BillService; import com.zjl.utils.ExcelUtil; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List;/*** author: zjl* datetime: 2024/3/30* desc:*/ RestController RequestMapping(bill) public class BillController {Resourceprivate BillService billService;/*** 导出* param response*/GetMapping(/export)public void exportExcel(HttpServletResponse response) {try {ExcelUtil.setExcelResponseProp(response, 订单列表);ListBillDO billList billService.getBillList();EasyExcel.write(response.getOutputStream()).head(BillDO.class).excelType(ExcelTypeEnum.XLSX).sheet(订单列表).doWrite(billList);} catch (IOException e) {throw new RuntimeException(e);}} }…省略service、mapper方法定义和实现没有复杂业务就返回一个数据集 SQL select idselectBillList resultTypecom.zjl.model.BillDOselectbillCode,productName,productDesc,productUnit,productCount,totalPrice,isPayment,userName as createdBy,b.creationDate,proName as providerNamefrom smbms_bill b join smbms_provider pon b.providerId p.idjoin smbms_user u on b.createdBy u.id/select6.简单导入 接口 PostMapping(/import)public String importExcel(RequestPart(value file) MultipartFile file) {try {ListBillImportBO billImportBOList EasyExcel.read(file.getInputStream()).head(BillImportBO.class).sheet().doReadSync();return billService.saveBillBath(billImportBOList);} catch (IOException e) {return 导入失败;}}省略service层 SQL insert idinsertBillBatch parameterTypecom.zjl.model.BillImportBOINSERT INTO smbms_bill(billCode,productName, productDesc, productUnit,productCount,totalPrice, isPayment, createdBy,creationDate, providerId)VALUESforeach collectionlist itembill separator,(#{bill.billCode},#{bill.productName},#{bill.productDesc},#{bill.productUnit},#{bill.productCount},#{bill.totalPrice},#{bill.isPayment},1,now(),#{bill.providerId})/foreach/insert7.复杂的导出合并行、合并列 由于 EasyPoi 支持嵌套对象导出直接使用内置 ExcelCollection 注解即可实现遗憾的是 EasyExcel 不支持一对多导出只能自行实现通过此issues了解到项目维护者建议通过自定义合并策略方式来实现一对多导出。 解决思路 只需把订单主键相同的列中需要合并的列给合并了就可以实现这种一对多嵌套信息的导出 自定义注解 创建一个自定义注解用于标记哪些属性需要合并单元格哪个属性是主键用于判断是否需要合并以及合并的主键 package com.zjl.annotate;import java.lang.annotation.*;/*** author: zjl* datetime: 2024/3/30* desc:*/ Target({ElementType.FIELD}) Retention(RetentionPolicy.RUNTIME) Documented public interface ExcelMerge {/*** 是否合并单元格* return true || false*/boolean merge() default true;/*** 是否为主键即该字段相同的行合并* return true || false*/boolean isPrimaryKey() default false; }定义实体类 在需要合并单元格的属性上设置 ExcelMerge 注解二级表头通过设置 ExcelProperty 注解中 value 值为数组形式来实现该效果 package com.zjl.model;import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.format.DateTimeFormat; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.zjl.annotate.ExcelMerge; import com.zjl.coverter.BillIsPaymentConverter; import lombok.Data;/*** author: zjl* datetime: 2024/3/30* desc:*/ Data public class ProviderDO {ExcelProperty(value 供应商ID)ExcelMerge(merge true, isPrimaryKey true)ColumnWidth(15)private String id;ExcelProperty(value 供应商编码)ExcelMerge(merge true)ColumnWidth(15)private String proCode;ExcelProperty(value 供应商名称)ExcelMerge(merge true)ColumnWidth(30)private String proName;//供应商名称ExcelProperty(value 合作联系人)ExcelMerge(merge true)ColumnWidth(20)private String proContact;ExcelProperty(value 联系电话)ExcelMerge(merge true)ColumnWidth(25)private String proPhone;ExcelProperty(value 供应商地址)ExcelMerge(merge true)ColumnWidth(30)private String proAddress;ExcelProperty(value 供应商座机)ExcelMerge(merge true)ColumnWidth(20)private String proFax;ExcelProperty(value {订单信息,订单编码})ColumnWidth(15)private String billCode;//订单编码ExcelProperty(value {订单信息,商品名称})ColumnWidth(30)private String productName;//商品名称ExcelProperty(value {订单信息,商品描述})ColumnWidth(30)private String productDesc;//商品描述ExcelProperty(value {订单信息,商品单位})ColumnWidth(15)private String productUnit;//商品单位ExcelProperty(value {订单信息,商品数量})ColumnWidth(15)private String productCount;//商品数量ExcelProperty(value {订单信息,商品总金额})ColumnWidth(15)private String totalPrice;//商品总金额ExcelProperty(value {订单信息,支付状态},converter BillIsPaymentConverter.class) // 列索引为7ColumnWidth(15)private int isPayment;//支付状态:是否支付1未支付 2已支付ExcelProperty(value {订单信息,创建人})ColumnWidth(15)private String createdBy;//创建人ExcelProperty(value {订单信息,创建时间})ColumnWidth(25)DateTimeFormat(yyyy-MM-dd)private String creationDate;//创建时间 }SQL select idselectProviderListAndBill resultTypecom.zjl.model.ProviderDOselectp.id,billCode,productName,productDesc,productUnit,productCount,totalPrice,isPayment,userName as createdBy,b.creationDate,proName,proCode,proContact,proPhone,proAddress,proFaxfrom smbms_bill b join smbms_provider pon b.providerId p.idjoin smbms_user u on b.createdBy u.id/select自定义单元格合并策略 package com.zjl.utils;import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.write.handler.RowWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteTableHolder; import com.zjl.annotate.ExcelMerge; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.util.CellRangeAddress;import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List;/*** author: zjl* datetime: 2024/3/30* desc:*/ public class ExcelMergeStrategy implements RowWriteHandler {/*** 主键下标*/private Integer primaryKeyIndex;/*** 需要合并的列的下标集合*/private final ListInteger mergeColumnIndexList new ArrayList();/*** 数据类型*/private final Class? elementType;public ExcelMergeStrategy(Class? elementType) {this.elementType elementType;}Overridepublic void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {// 判断是否为标题if (isHead) {return;}// 获取当前工作表Sheet sheet writeSheetHolder.getSheet();// 初始化主键下标和需要合并字段的下标if (primaryKeyIndex null) {this.initPrimaryIndexAndMergeIndex(writeSheetHolder);}// 判断是否需要和上一行进行合并// 不能和标题合并只能数据行之间合并if (row.getRowNum() 1) {return;}// 获取上一行数据Row lastRow sheet.getRow(row.getRowNum() - 1);// 将本行和上一行是同一类型的数据通过主键字段进行判断则需要合并if (lastRow.getCell(primaryKeyIndex).getStringCellValue().equalsIgnoreCase(row.getCell(primaryKeyIndex).getStringCellValue())) {for (Integer mergeIndex : mergeColumnIndexList) {CellRangeAddress cellRangeAddress new CellRangeAddress(row.getRowNum() - 1, row.getRowNum(), mergeIndex, mergeIndex);sheet.addMergedRegionUnsafe(cellRangeAddress);}}}/*** 初始化主键下标和需要合并字段的下标** param writeSheetHolder WriteSheetHolder*/private void initPrimaryIndexAndMergeIndex(WriteSheetHolder writeSheetHolder) {// 获取当前工作表Sheet sheet writeSheetHolder.getSheet();// 获取标题行Row titleRow sheet.getRow(0);// 获取所有属性字段Field[] fields this.elementType.getDeclaredFields();// 遍历所有字段for (Field field : fields) {// 获取ExcelProperty注解用于获取该字段对应列的下标ExcelProperty excelProperty field.getAnnotation(ExcelProperty.class);// 判断是否为空if (null excelProperty) {continue;}// 获取自定义注解用于合并单元格ExcelMerge excelMerge field.getAnnotation(ExcelMerge.class);// 判断是否需要合并if (null excelMerge) {continue;}for (int i 0; i fields.length; i) {Cell cell titleRow.getCell(i);if (null cell) {continue;}// 将字段和表头匹配上if (excelProperty.value()[0].equalsIgnoreCase(cell.getStringCellValue())) {if (excelMerge.isPrimaryKey()) {primaryKeyIndex i;}if (excelMerge.merge()) {mergeColumnIndexList.add(i);}}}}// 没有指定主键则异常if (null this.primaryKeyIndex) {throw new IllegalStateException(使用ExcelMerge注解必须指定主键);}} }接口 GetMapping(/mergeExport)public void mergeExport(HttpServletResponse response) {try {ExcelUtil.setExcelResponseProp(response, 供应商列表-合并);ListProviderDO providerList providerService.getProviderList();EasyExcel.write(response.getOutputStream()).head(ProviderDO.class).registerWriteHandler(new ExcelMergeStrategy(ProviderDO.class)).excelType(ExcelTypeEnum.XLSX).sheet(供应商列表).doWrite(providerList);} catch (IOException e) {throw new RuntimeException(e);}}
http://www.pierceye.com/news/37189/

相关文章:

  • 网站建设具体建设流程摄影设计说明
  • 支付功能网站建设百度网页高级搜索
  • 商城网站开发平台海南网站建设小强
  • 网站架构分析购物网站的功能板块
  • 网站注册 英文手机上自己设计房子软件
  • 营销型网站搭建的工作网站开发模块
  • 一个空间放2个网站北京网站建设公司案例
  • 餐厅网站建设什么线上推广引流平台
  • 佛山小企业网站建设秦皇岛建设路小学网站
  • 徐州教育平台网站建设可以做翻译兼职的网站
  • 怎么把危险网站wordpress做简单的商城
  • 企业网站策划书1000字中国跨境电商出口平台
  • 做汽车商城网站网站如何做定级备案
  • 怎么注册自己的网站域名辽宁建设工程信息网评定分离规则
  • 网站建设应该懂什么知识proxy网站
  • 广东省建设信息网站做网站的工资高
  • 哪个网站做动图网站底部样式
  • 贵阳中企动力做的网站英文wordpress 安装
  • wordpress全站开启ssl住房和城乡建设部执法网站
  • 网页设计素材网站推荐做网站销售是干什么的
  • 工 投标做哪个网站好域名注册了是永久的吗
  • 黑龙江建设人员证件查询网站wordpress主题源码
  • 程序员为什么不敢创业做网站网络品牌推广ppt
  • 做网站需要考虑哪些问题企业解决方案搞笑
  • 网站网址正能量在线学习网站建设
  • 滨州市滨城区建设局网站专业的大连网站建设
  • 网站后期维护包括自己做网站帮公司出认证证书违法吗
  • 如何进行课程中心网站建设办公室设计图平面布置图
  • 有哪些官方网站做的比较好手机网站优化公司
  • seo网站优化培无锡网站制作服务