日常在做后台系统的时候会很频繁的遇到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(); } 注解使用示例
三个注解创建好之后就需要开始操作Excel了
首先,导入方法。在后台接收到前端上传的Excel文件之后,使用poi来读取Excel文件。扩展:接私活 我们根据传入的类型上面的字段注解的顺序来分别为不同的字段赋值,然后存入集合中,再返回 代码如下:
/** *将Excel转换为对象集合 *@paramexcelExcel文件 *@paramclazzpojo类型 *@return */ publicstaticList
- 建立一张sheet表
- 设置标的行高和列宽
- 绘制标题和表头
这两个方法是自定义方法,代码会贴在后面
- 写入数据到Excel
- 创建下拉列表
- 写入文件到response
到这里导出工作就完成了
colNames){ //插入标题行 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); } } ); } }
下面是一些自定义方法的代码
/** *获取一个基本的带边框的单元格 *@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,List
使用实例
导出数据
导入数据(返回对象List)
源码地址:
https://github.com/xyz0101/excelutils
审核编辑 :李倩
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
Excel
+关注
关注
4文章
218浏览量
55455 -
代码
+关注
关注
30文章
4751浏览量
68358
原文标题:注解+反射优雅的实现Excel导入导出(通用版),飘了!
文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
Kali Linux常用工具介绍
Kali Linux 虚拟机中自带了大量渗透测试工具,涵盖了信息收集、漏洞利用、口令破解、漏洞扫描等多个方面。 以下是按分类简要介绍一部分常用工具的使用方法: 使用方法只能当做参考,**详细
dubbo3.0 服务导入导出原理
不管是服务导出还是服务引入,都发生在应用启动过程中,比如:在启动类上加上 @EnableDubbo 时,该注解上有一个 @DubboComponentScan 注解
立创商城导出来的CAE和PCB封装用PADS导入遇到的问题
能导入的低版本DXP格式
如果采用第一种方法导入,就出现了分配CAE封装的时候,管脚不能自动识别的问题,请问这个问题有解吗?只不过不想自己画CAE封装而已,在pads里面,想直接导入立
发表于 09-21 17:17
数据分析的工具有哪些
数据分析是一个涉及收集、处理、分析和解释数据以得出有意义见解的过程。在这个过程中,使用正确的工具至关重要。以下是一些主要的数据分析工具,以及
怎么用fatfs写excel?
开始新建一个文件,写了几个汉字,存盘后用UE打开,全是乱码,汉字不见了。
但是,公司的读卡器插上U盘就能把考勤表都出来啊,EXCEL的。
然后,把考勤表文件拿到,用UE打开,XML的格式,虽然不懂
发表于 05-11 07:59
LabVIEW模板匹配位置信息导出
大家好,我在利用ni vision assistant生成的模板匹配界面时,想要将每一个匹配物体的位置信息导出到word或者Excel,但是他这个匹配个数不确定,怎么样把匹配到的所有物体信息导
发表于 03-11 20:22
求助,如何在Micrium uc探针中导出REF_BGT60LTR11AIP_M0雷达原始数据?
我刚刚从 REF BGT60LTR11AIP M0 开始。那么官方的数据包只有一个基于 Micrium 的 GUI 界面,而这个 GUI 界面只有数据图表,没有导出数据开关。
右边的exce
发表于 01-26 06:11
甲骨文发布VirtualBox 7.0.14版本,支持NVMe存储导入导出
此次升级带来了多项重要功能,例如支持导入与导出自带NVMe存储控制器的虚拟机;初始引入Red Hat Enterprise Linux 9.4的内置核心技术支持等等。同时,也涵盖了多个bug修正,如
如何利用Excel轻松创建任意波形?
在从零开始创建任意波形时,大多数工程师要么采用工程编程环境,比如Matlab、LabVIEW或VEE,要么采用免费或收费的定制任意波形软件套件。这些是很好的工具,但如果你不常用的话,它们的价格就显得比较昂贵,并且学会使用也比较耗时。多数工程师未曾想到的另
ADS导入导出数据的方法介绍
直接导出是不行的,图形可以直接copy出去复制,但数据要采用Palette里的List,不是Rectangular Plot,生成后可以选中然后右键,就可以使用Export了。CSV格式就和Excel差不多了,很好处理。
excel把所有的NA替换成0
在Excel中将所有的NA替换为0是一个常见的操作,特别是当我们处理大量数据时。本文将详细介绍如何使用Excel的功能来进行替换,以及
excel中if函数有多个条件,如何写公式
多个条件,你可以嵌套多个IF函数来实现。每一个IF函数都作为上一个IF函数的value_if_true或value_if_false参数的一部分。以下是一
评论