0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

写一个公用工具来进行Excel的导入导出

Android编程精选 来源:CSDN 作者:CSDN 2022-06-01 10:48 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

日常在做后台系统的时候会很频繁的遇到Excel导入导出的问题,正好这次在做一个后台系统,就想着写一个公用工具来进行Excel的导入导出。 一般我们在导出的时候都是导出的前端表格,而前端表格同时也会对应的在后台有一个映射类。 所以在写这个工具时我们先理一下需要实现的效果:
  • 导出方法接收一个list集合,和一个Class类型,和HttpServletResponse 对象
  • 导出是可能会有下拉列表,所以需要一个map存储下拉列表数据源,传入参数后只需一行代码即可导出
  • 导入方法需要传入file文件,以及一个Class类型,导入之后将会返回一个list集合,里面的对象就是传入类型的对象,传入参数后只需一行代码即可导入

实现过程:


								

								
											首先需要创建三个注解
											一个是EnableExport ,必须有这个注解才能导出

										
											/** *设置允许导出 */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) public@interfaceEnableExport{ StringfileName(); }
											然后就是EnableExportField,有这个注解的字段才会导出到Excel里面,并且可以设置列宽。

										
											/** *设置该字段允许导出 *并且可以设置宽度 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public@interfaceEnableExportField{ intcolWidth()default100; StringcolName(); }
											再就是ImportIndex,导入的时候设置Excel中的列对应的序号

										
											/** *导入时索引 */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public@interfaceImportIndex{ intindex(); }
											注解使用示例
											

36fe5bb6-e14d-11ec-ba43-dac502259ad0.png

三个注解创建好之后就需要开始操作Excel了


								

								
									首先,导入方法。在后台接收到前端上传的Excel文件之后,使用poi来读取Excel文件。扩展:接私活
									我们根据传入的类型上面的字段注解的顺序来分别为不同的字段赋值,然后存入集合中,再返回
									代码如下:

								
									/** *将Excel转换为对象集合 *@paramexcelExcel文件 *@paramclazzpojo类型 *@return */ publicstaticListparseExcelToList(Fileexcel,Classclazz){ Listres=newArrayList<>(); //创建输入流,读取Excel InputStreamis=null; Sheetsheet=null; try{ is=newFileInputStream(excel.getAbsolutePath()); if(is!=null){ Workbookworkbook=WorkbookFactory.create(is); //默认只获取第一个工作表 sheet=workbook.getSheetAt(0); if(sheet!=null){ //前两行是标题 inti=2; Stringvalues[]; Rowrow=sheet.getRow(i); while(row!=null){ //获取单元格数目 intcellNum=row.getPhysicalNumberOfCells(); values=newString[cellNum]; for(intj=0;j<= cellNum; j++) {                         Cell cell =   row.getCell(j);                         if(cell!=null){ //设置单元格内容类型 cell.setCellType(Cell.CELL_TYPE_STRING); //获取单元格值 Stringvalue=cell.getStringCellValue()==null?null:cell.getStringCellValue(); values[j]=value; } } Field[]fields=clazz.getDeclaredFields(); Objectobj=clazz.newInstance(); for(Fieldf:fields){ if(f.isAnnotationPresent(ImportIndex.class)){ ImportIndexannotation=f.getDeclaredAnnotation(ImportIndex.class); intindex=annotation.index(); f.setAccessible(true); //此处使用了阿里巴巴的fastjson包里面的一个类型转换工具类 Objectval=TypeUtils.cast(values[index],f.getType(),null); f.set(obj,val); } } res.add(obj); i++; row=sheet.getRow(i); } } } }catch(Exceptione){ e.printStackTrace(); } returnres; }
									接下来就是导出方法。
									导出分为几个步骤:
  1. 建立一个工作簿,也就是类型新建一个Excel文件

372aba3a-e14d-11ec-ba43-dac502259ad0.png

  1. 建立一张sheet表

3743a20c-e14d-11ec-ba43-dac502259ad0.png

  1. 设置标的行高和列宽

3786a23c-e14d-11ec-ba43-dac502259ad0.png

  1. 绘制标题和表头

37d6bb6e-e14d-11ec-ba43-dac502259ad0.png

这两个方法是自定义方法,代码会贴在后面
  1. 写入数据到Excel

37f7d628-e14d-11ec-ba43-dac502259ad0.png

  1. 创建下拉列表
38234f9c-e14d-11ec-ba43-dac502259ad0.png
  1. 写入文件到response

383f283e-e14d-11ec-ba43-dac502259ad0.png

到这里导出工作就完成了

下面是一些自定义方法的代码


								

								

										
											/** *获取一个基本的带边框的单元格 *@paramworkbook *@return */ privatestaticHSSFCellStylegetBasicCellStyle(HSSFWorkbookworkbook){ HSSFCellStylehssfcellstyle=workbook.createCellStyle(); hssfcellstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); hssfcellstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); hssfcellstyle.setBorderRight(HSSFCellStyle.BORDER_THIN); hssfcellstyle.setBorderTop(HSSFCellStyle.BORDER_THIN); hssfcellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); hssfcellstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); hssfcellstyle.setWrapText(true); returnhssfcellstyle; } /** *获取带有背景色的标题单元格 *@paramworkbook *@return */ privatestaticHSSFCellStylegetTitleCellStyle(HSSFWorkbookworkbook){ HSSFCellStylehssfcellstyle=getBasicCellStyle(workbook); hssfcellstyle.setFillForegroundColor((short)HSSFColor.CORNFLOWER_BLUE.index);//设置背景色 hssfcellstyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); returnhssfcellstyle; } /** *创建一个跨列的标题行 *@paramworkbook *@paramhssfRow *@paramhssfcell *@paramhssfsheet *@paramallColNum *@paramtitle */ privatestaticvoidcreateTitle(HSSFWorkbookworkbook,HSSFRowhssfRow,HSSFCellhssfcell,HSSFSheethssfsheet,intallColNum,Stringtitle){ //在sheet里增加合并单元格 CellRangeAddresscra=newCellRangeAddress(0,0,0,allColNum); hssfsheet.addMergedRegion(cra); //使用RegionUtil类为合并后的单元格添加边框 RegionUtil.setBorderBottom(1,cra,hssfsheet,workbook);//下边框 RegionUtil.setBorderLeft(1,cra,hssfsheet,workbook);//左边框 RegionUtil.setBorderRight(1,cra,hssfsheet,workbook);//有边框 RegionUtil.setBorderTop(1,cra,hssfsheet,workbook);//上边框 //设置表头 hssfRow=hssfsheet.getRow(0); hssfcell=hssfRow.getCell(0); hssfcell.setCellStyle(getTitleCellStyle(workbook)); hssfcell.setCellType(HSSFCell.CELL_TYPE_STRING); hssfcell.setCellValue(title); } /** *设置表头标题栏以及表格高度 *@paramworkbook *@paramhssfRow *@paramhssfcell *@paramhssfsheet *@paramcolNames */ privatestaticvoidcreateHeadRow(HSSFWorkbookworkbook,HSSFRowhssfRow,HSSFCellhssfcell,HSSFSheethssfsheet,ListcolNames){ //插入标题行 hssfRow=hssfsheet.createRow(1); for(inti=0;i< colNames.size(); i++) {         hssfcell = hssfRow.createCell(i);         hssfcell.setCellStyle(getTitleCellStyle(workbook));         hssfcell.setCellType(HSSFCell.CELL_TYPE_STRING);         hssfcell.setCellValue(colNames.get(i));     } } /**  * excel添加下拉数据校验  * @param sheet 哪个 sheet 页添加校验  * @return */ publicstaticvoidcreateDataValidation(Sheetsheet,MapselectListMap){ if(selectListMap!=null){ selectListMap.forEach( //第几列校验(0开始)key数据源数组value (key,value)->{ if(value.length>0){ CellRangeAddressListcellRangeAddressList=newCellRangeAddressList(2,65535,key,key); DataValidationHelperhelper=sheet.getDataValidationHelper(); DataValidationConstraintconstraint=helper.createExplicitListConstraint(value); DataValidationdataValidation=helper.createValidation(constraint,cellRangeAddressList); //处理Excel兼容性问题 if(dataValidationinstanceofXSSFDataValidation){ dataValidation.setSuppressDropDownArrow(true); dataValidation.setShowErrorBox(true); }else{ dataValidation.setSuppressDropDownArrow(false); } dataValidation.setEmptyCellAllowed(true); dataValidation.setShowPromptBox(true); dataValidation.createPromptBox("提示","只能选择下拉框里面的数据"); sheet.addValidationData(dataValidation); } } ); } }

使用实例


								

								
									导出数据
									

385b584c-e14d-11ec-ba43-dac502259ad0.png

导入数据(返回对象List)

3894e210-e14d-11ec-ba43-dac502259ad0.png

源码地址:
https://github.com/xyz0101/excelutils

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Excel
    +关注

    关注

    4

    文章

    231

    浏览量

    57786
  • 代码
    +关注

    关注

    30

    文章

    4975

    浏览量

    74354

原文标题:注解+反射优雅的实现Excel导入导出(通用版),飘了!

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【诚邀体验】 安利AI使用工具

    我们近年来,AI技术正在迅速改变工程师获取知识和进行开发的方式,从最早的搜索引擎到简单生成,再到如今能够理解问题并生成代码的AI工具。AI的进化正在悄无声息的改变工程师工作的环境。目前主流的AI工具
    的头像 发表于 04-10 18:25 89次阅读
    【诚邀体验】 安利<b class='flag-5'>一</b><b class='flag-5'>个</b>AI使<b class='flag-5'>用工具</b>!

    使用工业显微镜进行尺寸测量的步骤

    工业显微镜作为精密测量工具,在机械加工、电子制造、精密模具等领域发挥着不可替代的作用。其高放大倍数、高分辨率的特性,使得微米级甚至纳米级的尺寸测量成为可能。以下是使用工业显微镜进行尺寸测量的详细步骤,结合实际操作经验与行业规范,
    的头像 发表于 03-12 16:53 285次阅读

    页面导入导出功能怎么用?如何快速合并两工程,复制粘贴注意事项?

    页面导入导出功能怎么用?如何快速合并两工程,复制粘贴注意事项?
    发表于 02-03 14:16

    页面导入导出功能怎么用?如何快速合并两工程,复制粘贴注意事项?

    页面导入导出功能怎么用?如何快速合并两工程,复制粘贴注意事项?
    发表于 01-28 15:17

    EtherCAT工具 SSC 工具 5.11版本 无法添加EtherCAT_IO模板导入

    板卡型号为HPM5E00EVK,对应SSC 工具为5.11版本 想尝试烧录EtherCAT_IO-例程进行测试,按照仓库中Readme文件进行烧录测试,发现添加配置文件后无法选中EtherCAT_IO配置文件
    发表于 12-25 22:55

    电能质量在线监测装置的多维度统计报表支持远程访问导出吗?

    是的,现代电能质量在线监测装置的多维度统计报表全面支持远程访问导出功能 ,已成为主流产品标配,可通过多种方式随时随地获取分析数据。 、远程访问导出方式全景 1. Web 浏览器直连(最通用) 输入
    的头像 发表于 12-17 15:39 497次阅读
    电能质量在线监测装置的多维度统计报表支持远程访问<b class='flag-5'>导出</b>吗?

    EXCEL导入—设计与思考

    EXCEL导入—设计与思考 、案例信息与设计 1.1、案例需求与背景 B2BTC同城二期有Exce
    的头像 发表于 08-20 16:56 752次阅读
    <b class='flag-5'>EXCEL</b><b class='flag-5'>导入</b>—设计与思考

    KiCad 已支持导入 Altium 工程(Project)

    “  9.0.3 的小版本更新中增加非常实用的功能:直接导入 Altium 的工程,省去了分别导入原理图和 PCB 的麻烦。  ”   Altium
    的头像 发表于 07-21 11:15 3596次阅读
    KiCad 已支持<b class='flag-5'>导入</b> Altium 工程(Project)

    使用Word/Excel管理需求的10痛点及解决方案Perforce ALM

    还在用Word/Excel做需求管理?10“翻车信号”,都是小伙伴们踩过的坑~来看看你踩过哪些?是不是也该升级到更专业的ALM工具了~
    的头像 发表于 07-10 15:59 765次阅读
    使用Word/<b class='flag-5'>Excel</b>管理需求的10<b class='flag-5'>个</b>痛点及解决方案Perforce ALM

    如何导出Excel文件 -- excel_hm介绍 ##三方SDK##

    前阵子在和朋友讨论,记账类的app已经那么普遍了,如果想要做点不样的还能加什么功能。从我自己的角度出发,我觉得完全可以加导出Excel
    发表于 06-30 17:57

    【Banana Pi BPI-RV2开发板试用体验】移植lrzsz以便从串口和ssh导入导出文件

    cp src/lrz /mnt/d cp src/lsz /mnt/d 使用Winscp导入到开发板 开发板中 chmod +x lrz chmod +x lsz mv lrz rz mv lsz sz 此时就可以使用rz,sz导入
    发表于 06-25 16:39

    ArkUI-X应用工程结构说明

    (Ark Byte Code),并分别拷贝到Android和iOS应用工程,作为平台应用资源进行管理。 ArkUI应用资源 ArkUI Resources资源也通过OpenHarmony SDK工具
    发表于 06-19 23:11

    Simcenter FLOEFD EDA Bridge模块:使用导入的详细PCB设计和IC热特性简化热分析

    的EDABridge模块可将印刷电路板(PCB)详细导入到您选择的机械计算机辅助设计(MCAD)工具中,为热分析做准备。直以来,访问PCB数据的有效方法是使用中间数
    的头像 发表于 06-10 17:36 2022次阅读
    Simcenter FLOEFD EDA Bridge模块:使用<b class='flag-5'>导入</b>的详细PCB设计和IC热特性<b class='flag-5'>来</b>简化热分析

    TSolidX应用:液晶掩膜结构GDSⅡ文件的生成和导出

    TX系列的布局编辑器TX Layout软件可以支持GDSⅡ文件的导入导出,其功能如下: 1. GDS文件的导入 1.1创建带有GDSⅡ
    发表于 05-20 08:45

    和 Dr Peter 起学 KiCad 4.9~4.10:导出Gerber并下单(收到成品)

    作流程的第七步。在这步中,我将导出制造 PCB 所需的数据的 Gerber 文件。在将 Gerber 文件上传到制造商网站之前,我将使用特殊
    的头像 发表于 04-28 18:02 1788次阅读
    和 Dr Peter <b class='flag-5'>一</b>起学 KiCad 4.9~4.10:<b class='flag-5'>导出</b>Gerber并下单(收到成品)