日常在做后台系统的时候会很频繁的遇到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文章
230浏览量
57546 -
代码
+关注
关注
30文章
4941浏览量
73136
原文标题:注解+反射优雅的实现Excel导入导出(通用版),飘了!
文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
热点推荐
KiCad 已支持导入 Altium 工程(Project)
“ 9.0.3 的小版本更新中增加一个非常实用的功能:直接导入 Altium 的工程,省去了分别导入原理图和 PCB 的麻烦。 ” Altium
使用Word/Excel管理需求的10个痛点及解决方案Perforce ALM
还在用Word/Excel做需求管理?10个“翻车信号”,都是小伙伴们踩过的坑~来看看你踩过哪些?是不是也该升级到更专业的ALM工具了~
如何导出Excel文件 -- excel_hm介绍 ##三方SDK##
前阵子在和朋友讨论,记账类的app已经那么普遍了,如果想要做点不一样的还能加什么功能。从我自己的角度出发,我觉得完全可以加一个导出Excel
发表于 06-30 17:57
Simcenter FLOEFD EDA Bridge模块:使用导入的详细PCB设计和IC热特性来简化热分析
的EDABridge模块可将印刷电路板(PCB)详细导入到您选择的机械计算机辅助设计(MCAD)工具中,为热分析做准备。一直以来,访问PCB数据的有效方法是使用中间数
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 文件上传到制造商网站之前,我将使用一个特殊工
Allegro Skill封装功能-导出device文件介绍与演示
焊盘连接,Device文件会明确这种映射。Device文件仅适用于导入第三方网表的情况,PCB导入第三方网表不能直接与原理图进行交互式,这时候需要导出Device 文件,然后PCB才能
发表于 04-19 09:44
•1656次阅读
Spire.Cloud.Excel云端Excel文档处理SDK
Spire.Cloud.Excel 是一款专业的云端 Excel 文档处理 SDK,开发人员可调用 SDK 在云端创建、读取、编辑、转换、及保存 Excel 文档。作为
使用插件将Excel连接到MySQL/MariaDB
,可以快速地将数据从 MySQL 或 MariaDB 加载到 Excel,立即从数据库刷新 Excel 工作簿中的数据,编辑这些数据,并将它们保存回 MySQL。之后您能够像使用的 Excel 工作表
Chart FX——图表导出
Web格式的图片(如 PNG 或 JPEG)。 Chart FX 中还有其他文件类型,称为 “图表模板”,允许您将图表的外观(颜色、图表类型和样式、可视工具等)保存在一个文件中,以便以后将其应用到另
适用于Oracle的SSIS数据流组件:提供快速导入及导出功能
使用SSIS 数据流组件,通过与关键数据库和云服务的 Oracle 数据集成来改进您的 ETL 流程,这些组件提供快捷和可靠的数据导入和导出功能。 Oracle SSIS 数据流组件 适用于
适用于Oracle的Devart Excel插件:轻松管理数据
工作簿中的数据,编辑这些数据并将其保存回 Oracle。它使您能够像使用 Excel 工作表一样处理 Oracle 数据,可以轻松进行数据清理和重复数据删除的工作,并将 Excel
Devart Excel的附加组件
获取和设置多种工具来处理不同来源的数据。您只需使用一个工具——Microsoft Excel。最重要的是,您无需熟悉它。你已经知道

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