文章目录

  • 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

EasyExcel 实现模板导出、模板导入分析功能相关推荐

  1. EasyExcel自定义表头导出模板并封装数据下拉选择

    EasyExcel自定义表头导出模板 首先查询可变数据 动态数据Controller 表头封装 定义导出模板时的下拉数据 最终结果 首先查询可变数据 动态数据Controller @ApiOperat ...

  2. Excel导出模板加数据时,下拉框丢失解决方案

    简介: 在工作中.我们大多数会碰到导出.导入excel功能.此篇文档便是对导出时,模板中自带的下拉框丢失的问题记录. 摘要: 首先简要描述如何实现excel导出模板加数据功能. 1.读取sheet模板 ...

  3. 使用EasyExcel实现模板下载、导入和导出功能

    最近项目中需要用到Excel表格的上传下载功能,于是选择了EasyExcel这款工具,总的来说非常的好用,下面就做一个简单的演示. 官方文档地址 https://www.yuque.com/easye ...

  4. 使用EasyExcel导出模板并设置级联下拉及其原理分析

    一.概述 项目中有时会遇到需要导出一个Excel模板,然后在导出的Excel中填充数据,最终再调用接口批量把Excel中的数据导入到数据库当中的需求. 其中级联下拉选择,手机号校验,性别校验等都是比较 ...

  5. springboot使用jxls导出excel___(万能通用模板)--- SpringBoot导入、导出Excel文件___SpringBoot整合EasyExcel模板导出Excel

    springboot使用jxls导出excel 实现思路: 首先在springBoot(或者SpringCloud)项目的默认templates目录放入提前定义好的Excel模板,然后在具体的导出接口 ...

  6. java使用EasyExcel实现导入导出几种方式(导入、模板导出、和不需要模板的导出)

    java通过EasyExcel实现导入导出(导入.模板导出.和不需要模板的导出) 此文章只是涉及到简单的导入导出 通过实体模板导入数据 无实体模板导入数据 导出数据 通过模板导出数据 使用到的mave ...

  7. easyExcel不同版本按照模板导出

    Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有 ...

  8. 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续2篇-模板导出综合示例)...

    自ExcelUtility类推出以来,经过项目中的实际使用与不断完善,现在又做了许多的优化并增加了许多的功能,本篇不再讲述原理,直接贴出示例代码以及相关的模板.结果图,以便大家快速掌握,另外这些示例说 ...

  9. easyexcel复杂模板导出(合并行列,列统计汇总)

    easyexcel复杂模板导出(合并行列,统计汇总) 为什么使用easyexcel 1. easyexcel可以通过模板导出(符合项目使用习惯) 2. easyexcel支持大数据量导出,性能较好(满 ...

最新文章

  1. 2022-2028年中国氢化丁晴橡胶行业市场研究及前瞻分析报告
  2. c#写图像tif gdal_C# GDAL显示TIF
  3. 胖爷的vim实用手册 - 基础篇(打开、关闭、移动、搜索)
  4. python怎么安装tensorflow-Python使用pip安装TensorFlow模块
  5. 室内空气流动原理图_新风系统原理图—新风系统原理介绍
  6. JSON简介,语法,在html中应用
  7. 专业正则表达式site
  8. AndroidStudio_开发工具的设置_快捷键设置_编辑器设置---Android原生开发工作笔记72
  9. tkinter的pack布局与place布局结合
  10. 小小方法,问题锦集。
  11. 极客星球 | Unity3D插件模板化探索
  12. python程序设计 清华大学出版社 pdf下载-清华大学出版社-图书详情-《Python程序设计教程》...
  13. maiark京东短信登录
  14. 理解雅可比矩阵和海森矩阵
  15. (C语言) 用牛顿迭代法求方程2x^3 - 4x^2 + 3x - 6 = 0在1.5附近的根
  16. 约翰霍普金斯大学计算机专业,约翰霍普金斯大学计算机专业排名第几?
  17. March 7th Wednesday (三月 七日 水曜日)
  18. 计算机技术员自我介绍,技术员的自我介绍范文
  19. c语言编程单片机中的sbit,用sbit定义可位寻址的特殊功能寄存器时的地址转换-51单片机C编程...
  20. 在线CAD看图网页版,一样可以快速查看CAD图纸

热门文章

  1. 中小园区网配置案例 超详细
  2. 行业上的品牌策划公司是怎么做品牌策划方案的?
  3. 联盟链系统开发 联盟链开发多钱
  4. 提取文件名+复制+改名+批量创建文件程序(Excel VBA版)
  5. Android 组件化代码中心化问题之.api化方案
  6. VUE组件日时分秒倒计时
  7. 小米、360、盛大路由器?居然还有这么多人趋之若鹜!!!想不通!
  8. Rosalind: DNA核苷酸计数和DNA翻译成RNA
  9. Python—SJ—实验4—DNA翻译
  10. python生成字符画_Python生成字符画 | 文艺数学君