EasyExcel 实现模板导出、模板导入分析功能

文章目录

    • 0.POM依赖
    • 1.导出模板实现
    • 2.导入模板并分析实现
    • 3.git源码

在这里插入图片描述

0.POM依赖

 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- junit --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.0</version></dependency><!-- log4j--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><!-- validation--><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId></dependency><dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--        easyExcel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</version></dependency>
<!--        fastsjon--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.56</version></dependency></dependencies>

1.导出模板实现

导出模板 映射 ExcelBO:

@Data
@ToString
public class InvoiceTemplateBO {@NotEmpty(message = ",发票代码未填写")@ExcelProperty(value = "*发票代码")private String invoiceCode;@NotEmpty(message = ",发票号码未填写")@ExcelProperty(value = "*发票号码")private String invoiceNo;@NotNull(message = ",开票日期未填写")@ExcelProperty(value = "*开票日期\n" + "2000-00-00")@DateTimeFormat("yyyy-MM-dd")private Date invoiceDate;@NotEmpty(message = ",校验码未填写")@ExcelProperty(value = "*校验码")private String checkCode;public static String getTemplateHead(){return "[*发票代码, *发票号码, *开票日期\n" +"2000-00-00, *校验码]";}
}

控制层:

@RestController
public class ExcelController {// http://localhost:8989/invoiceTemplateDownload@GetMapping("/invoiceTemplateDownload")public void templateDownload(HttpServletResponse response) throws IOException {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("发票导入模板-普票s", "UTF-8").replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");ExcelWriterBuilder excelWriterBuilder = EasyExcel.write(response.getOutputStream(), InvoiceTemplateBO.class);excelWriterBuilder.registerWriteHandler(templateWriteHandler);excelWriterBuilder.registerWriteHandler(InvoiceTemplateColumnWidthStyleStrategy.getInstance());excelWriterBuilder.sheet().doWrite(new ArrayList());}private static WriteHandler templateWriteHandler;static {WriteCellStyle headWriteCellStyle = new WriteCellStyle();//字体WriteFont headWriteFont = new WriteFont();headWriteFont.setFontHeightInPoints((short) 11);headWriteFont.setBold(false);headWriteCellStyle.setWriteFont(headWriteFont);//边框headWriteCellStyle.setBorderBottom(BorderStyle.THIN);headWriteCellStyle.setBorderLeft(BorderStyle.THIN);headWriteCellStyle.setBorderRight(BorderStyle.THIN);//前景色headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());//是否换行headWriteCellStyle.setWrapped(true);headWriteCellStyle.setLocked(true);templateWriteHandler = new HorizontalCellStyleStrategy(headWriteCellStyle,new WriteCellStyle());}}

2.导入模板并分析实现

验证功能返回值BO:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class InvoiceTemplateImportRspBO {//验证有效的发票信息private List<InvoiceTemplateBO> invoiceList;//验证无效的发票信息 提示private String invalidMsg;}

控制层:

@RestController
public class ExcelController {@Autowiredprivate ExcelImportService excelImportService;@PostMapping("/invoiceTemplateImport")public InvoiceTemplateImportRspBO invoiceTemplateImport(@RequestParam("file") MultipartFile file) throws IOException{return excelImportService.invoiceTemplateImport(file.getInputStream());}}

Service:

public interface ExcelImportService {InvoiceTemplateImportRspBO invoiceTemplateImport(InputStream inputStream);}
@Service
public class ExcelImportServiceImpl implements ExcelImportService {@Overridepublic InvoiceTemplateImportRspBO invoiceTemplateImport(InputStream inputStream) {InvoiceTemplateAnalyseListener invoiceTemplateAnalyseListener = new InvoiceTemplateAnalyseListener();EasyExcel.read(inputStream, InvoiceTemplateBO.class,invoiceTemplateAnalyseListener).sheet().doRead();return invoiceTemplateAnalyseListener.getImportResult();}}

Excel导入监听类:

@Slf4j
public class InvoiceTemplateAnalyseListener  extends AnalysisEventListener<InvoiceTemplateBO> {private  List<InvoiceTemplateBO> invoiceList = new ArrayList<>();private  StringBuilder validMsg = new StringBuilder();private StringBuilder invalidInvoiceMsg = new StringBuilder();private static String templateHead = InvoiceTemplateBO.getTemplateHead();private static String TEMPLATE_ERROR = "导入模板有误";public InvoiceTemplateImportRspBO getImportResult(){return new InvoiceTemplateImportRspBO(invoiceList,invalidInvoiceMsg.toString());}//校验模板表头@Overridepublic void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {if(4 != headMap.size()){throw new RuntimeException(TEMPLATE_ERROR);}String importHead = headMap.values().toString();log.info("templateHead:{}",importHead);if(!templateHead.equals(importHead)){throw new RuntimeException(TEMPLATE_ERROR);}}@Overridepublic void invoke(InvoiceTemplateBO data, AnalysisContext context) {log.info("读取到行数据:"+data);//校验参数。 通过:data放入invoiceList ;不通过:异常信息放入validMsgvalidInvoiceParam(data,context);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//validMsg不为空抛出异常;为空 整理参数,查询发票是否有效if(0 == validMsg.length()){log.info("校验验证通过集合:"+invoiceList);verifyInvoiceValidity(invoiceList);}else {invoiceList.clear();throw new RuntimeException(validMsg.toString());}}//校验参数。 通过:data放入invoiceList ;不通过:异常信息放入validMsgprivate void validInvoiceParam(InvoiceTemplateBO target,AnalysisContext context){ValidatorFactory factory = Validation.buildDefaultValidatorFactory();Validator validator = factory.getValidator();Set<ConstraintViolation<InvoiceTemplateBO>> constraintViolations = validator.validate(target, Default.class);Iterator<ConstraintViolation<InvoiceTemplateBO>> iterator = constraintViolations.iterator();StringBuilder constraintViolationMsg = new StringBuilder();while (iterator.hasNext()){ConstraintViolation<InvoiceTemplateBO> constraintViolationItem = iterator.next();constraintViolationMsg.append(constraintViolationItem.getMessage());}if(0 == constraintViolationMsg.length()){invoiceList.add(target);}else {validMsg.append("发票第").append(context.getCurrentRowNum()+1).append("行").append(constraintViolationMsg).append("。");}}//校验发票有效性。有效:放入invoiceList。无效:组合 invalidInvoiceMsgprivate void verifyInvoiceValidity(List<InvoiceTemplateBO> invoiceList){//todo Constructor注入校验service,调用方法,处理返回值if(true){//验证通过,}else {//验证不通过,invoiceList remove无效记录。invalidInvoiceMsg添加无效信息}}}

3.git源码

https://github.com/lls19950330/easyExcelDemo.git

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

金蝶云拿下客户满意度第一,中国SaaS企业觅得“后发先至”良机

本月&#xff0c;全球SaaS行业迎来了开年第一份重磅奖项的揭晓&#xff1a;由国际知名研究机构IDC颁发的SaaS行业全球客户满意度奖&#xff08;CSAT大奖&#xff09;。 该奖项基于IDC SaaSPath针对全球约2000家组织机构中高层的调研&#xff0c;综合30多项客户满意度指标&…

一名创业者浴火涅磐的自白——对话阿里云MVP孙琦

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 简介&#xff1a; 孙琦喜欢调侃自己为“一个失败的创业者”。跟他聊过之后&#xff0c;我却发现他跟以往的创业者不同&#x…

mysql 指定类型和指定位数创建序列号

文章目录一、脚本部分1. 表结构2. 函数二、代码部分2.1. xml2.2. 接口2.3. api接口2.4. api实例2.5. 控制层三、测试3.1. 效果图一、脚本部分 1. 表结构 有注释 CREATE TABLE ldmaxno (notype varchar(60) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT 号码…

系统架构设计师 - ESB 企业服务总线

文章目录定义功能定义 传统中间件技术和WEB、XML相结合的产物&#xff0c;主要用以异构系统的集成。具备复杂数据的传输能力&#xff0c;支持基于内容的消息路由、过滤&#xff0c;并提供一系列标准的接口。 功能 服务位置透明、 消息路由、 消息增强、 消息格式转换、 传输…

阿里云助力完美日记半年内系统吞吐量提升50倍

阿里云 Redis 直播地址 近年来&#xff0c;完美日记的“小黑钻口红”“动物眼影盘”等爆款彩妆出现在了越来越多女孩子的化妆台上&#xff0c;完美日记&#xff08;Perfect Diary&#xff09;是由逸仙电商在2017年推出的彩妆品牌&#xff0c;凭借着高颜值和性价比&#xff0c;完…

唏嘘!程序员,你的年底KPI完不成的原因找到了!

加班是每个互联网人不愿面对而却又绕不过去的话题&#xff0c;就连面试时“你怎么看待加班”的问题都成了必答题。现在临近年底&#xff0c;大家都在努力冲业绩&#xff0c;期待拿更多的年终奖&#xff0c;回家过个“富足年”。年底冲业绩&#xff0c;势必会增加我们的工作量&a…

阿里云SAG2.0发布,助力企业全球互联

2016年以来&#xff0c;阿里云洛神云网络陆续发布了高速通道、VPN网关、云企业网CEN&#xff08;cloud enterprise network&#xff09;、SAG&#xff08;smart access gateway&#xff09;等混合云网络产品&#xff0c;基于阿里云全球核心网络不断扩展云网络的应用场景&#x…

云原生存储详解:容器存储与K8s存储卷

作者 | 阚俊宝 阿里云技术专家 导读&#xff1a;云原生存储详解系列文章将从云原生存储服务的概念、特点、需求、原理、使用及案例等方面&#xff0c;和大家一起探讨云原生存储技术新的机遇与挑战。本文为该系列文章的第二篇&#xff0c;会对容器存储的相关概念进行讲述&#x…

阿里彻底拆中台了!

作者| Mr.K来源| 技术领导力(ID&#xff1a;jishulingdaoli)头图 | 付费下载于视觉中国老K独家了解到&#xff0c;张勇近期在阿里内网发布文章表示&#xff0c;他对目前阿里的中台并不满意&#xff0c;他直言道&#xff0c;现在阿里的业务发展太慢&#xff0c;要把中台变薄&…

漫画通信:有了它,终于可以放心买买买了

原文链接 本文为云栖社区原创内容&#xff0c;未经允许不得转载。

企业微信小程序~开启线上真机调试模式

文章目录一、概念理解1. 概念简述2. 线上真机调试前提二、线上真机调试流程2.1.开发小程序2.2.上传小程序2.3.补充小程序发布信息2.4.程序提交审核2.5.发布小程序2.6. 企微后台应用关联小程序2.7. 小程序发布流程三、开启调试模式3.1. 扫描二维码3.2. 打开多场景调试3.3. 进入调…

EasyExcel 设置单元格格式为 文本

文章目录1.全局设置标题和内容字体格式2.个性化设置某一列格式3.无内容时 &#xff08;预制模板&#xff0c;流形式写会&#xff09;1.全局设置标题和内容字体格式 通过WriteCellStyle 的dataFormat属性和BuiltinFormats指定字体格式 这种单元格有内容时字体才会生效&#xff…

云原生人物志 | Pulsar翟佳:社区的信任最重要

云原生已无处不在&#xff0c;《云原生人物志》是CSDN重磅推出的系列原创采访&#xff0c;我们关注云原生中每一个技术人、公司的身影。知微见著&#xff0c;窥见云原生价值与趋势。编辑 | 宋 慧出品 | CSDN云计算头图 | 付费下载于视觉中国

田亮:坚信大数据的变革力量

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 简介&#xff1a; 我和田亮的交流耗时较久&#xff0c;甚至用上了他出差的所有碎片时间&#xff0c;而他的回答始终谨慎、认真…

Easyexcel异常处理:getOutputStream() has already been called for this response

文章目录异常日志源码位置异常原因异常前代码调整后代码异常日志 java.lang.IllegalStateException: getOutputStream() has already been called for this responseat org.apache.catalina.connector.Response.getWriter(Response.java:582) ~[tomcat-embed-core-9.0.17.jar!…

玩转DB里的数据—阿里云DMS任务编排之简介和实操

1.任务编排介绍 数据库是企业IT系统里的重要基础设施&#xff0c;里面存储了大量有价值的数据资产&#xff0c;如&#xff1a;交易数据、客户数据、订单数据&#xff0c;等等。其实&#xff0c;数据库在企业里一直扮演着一个数据生产者&#xff08;Producer&#xff09;的角色…

用户隐私保护指引设置~参考案例

文章目录1. 搜索小程序2. 进入小程序详情3. 更多资料4. 小程序隐私指引5. 具体参考事项1. 搜索小程序 这里以腾讯文档进行演示 2. 进入小程序详情 3. 更多资料 4. 小程序隐私指引 5. 具体参考事项 以实际的情况为准&#xff0c;这里只是演示

在存储器的层次结构里,谁最快,谁最贵,谁最大?

来源 | 小林coding责编 | 寇雪芹头图 | 下载于视觉中国前言大家如果想自己组装电脑的话&#xff0c;肯定需要购买一个 CPU&#xff0c;但是存储器方面的设备&#xff0c;分类比较多&#xff0c;那我们肯定不能只买一种存储器&#xff0c;比如你除了要买内存&#xff0c;还要买硬…

云原生存储系列文章:云原生应用的基石

作者| 郡宝 阿里云技术专家 参与文末留言互动&#xff0c;即有机会获得赠书福利&#xff01; 导读&#xff1a;存储服务支撑了应用的状态、数据的持久化&#xff0c;是计算机系统中的重要组成部分&#xff0c;也是所有应用得以运行的基础&#xff0c;其重要性不言而喻。在存储…

java 读取jar包中的文件

文章目录项目resource中文件路径和jar包中文件路径的区别正常读取jar包读取完整代码&#xff1a;项目resource中文件路径和jar包中文件路径的区别 打成jar包后&#xff0c;是一个整体的文件。 正常读取 InputStream inputStream new FileInputStream("src/main/resource…