这是我参与更文挑战的第30天,活动详情查看: 更文挑战
Javaweb开发中数据的导入导出很常见,每次我们都需要写很多代码,所以我就在想能不能写一些通用的方法,之前已经在网上
整理过一些通用的方法,最近在网上看到一位牛人封装的更加简介,自己拿过来整理了一下。
复制代码
前提
- 相信很多小伙伴刚入行时都是流水性的编程!遇到需求直接开发就完事了。但是这样带了的结果就是代码不易维护。稍微需求变动可能带来的就是灾难性的复盘!美其名曰叫重构实际上就是因为代码混乱导致自己都不维护
- 在Java中提供了一种技术叫做注解,我们可以通过注解将属性分类或者将方法进行标注!随后我们再根据注解进行反向执行。今天我们就是通过注解来实现我们平时基于POI的导入导出功能
- 在poi的基础上我们很容易就可以实现数据的导入导出了。但是每次最烦的就是导出数据字段和列表中表头的对应关系以及表头信息的记录,包括导入也是一样的都需要维护下excel和我们数据中属性的映射关系!那么我们可不可用将这层映射关系通过注解的形式来维护呢?
配置注解
- 之前我们了解了Java注解的使用,现在我们正是通过注解的方式来简化javaweb中繁琐的Excel上传和下载两个功能。由于时间有限今天先实现了Excel的下载(Excel 导出)。
- 上面的就是我们的注解类的简化图。参数的意思分别是指定表头的名字+表头所占列宽度+该列是否明文显示+加密显示的方式+特殊文本的格式 。 就是这么一个简单的实体类我们就完成了数据的映射关系。内部实际上就是一个Hash表维护!
数据实体类
- 有了上面的注解我们的实体类非常的简单,只是在我们平常建的Javabean的属性字段上加上我们刚才的注解就行了。
- 其中ExportConfig注解中的属性值我们可以不设置,不设置就是默认的。这里设置完成后就开始写导出了。
Excel导出
- 现在该如何获取我们的注解呢,之前的文章已经介绍了。我们得首先获得我们的Javabean的字段。
for (Field field : _class.getDeclaredFields())
复制代码
- 可能会出现我们的Javabean的数据并不是完全的查出来了。所以这里我们得先看看这个字段到底有没有值。
property = BeanUtils.getProperty(data.get(0), field.getName());
复制代码
- 在有值得前提下我们在获取字段的注解。
ExportConfig config = field.getAnnotation(ExportConfig.class);
复制代码
- 最后我们开始讲注解的信息存在到信息类上ExportItem.java
items.add(new ExportItem.$Build()
.setField(field.getName())
.setDisplay(
"field".equals(config.value()) ? field
.getName() : config.value())
.setWidth(config.width())
.setIsExport(config.isExport())
.setContent(config.blankContent())
.setFieldTypeName(field.getClass().getSimpleName())
.setFormat(config.format())
.create());
复制代码
- ExportItem 类也很简单。里面拷贝了自身的一个类实现了链式操作。这里没什么讲解的。到这里我们的表头显示设置已经完成了。下面自然就是遍历list集合数据了。当然遍历之前先设置表头样式。
ExportItem exportItem = items.get(index);
// 首先创建该行指定列的单元格
Cell cell = headRow.createCell(index);
sheet.setColumnWidth(index, (short) (exportItem.getWidth() * 35.7));
cell.setCellValue(exportItem.getDisplay());
CellStyle style = handler.getHeadCellStyle(wb);
if (style != null)
{
cell.setCellStyle(style);
}
复制代码
- 在设置表身的时候我们得先去注解信息类中拿到该列显示的风格(是否是明文)。
if (exportItem.getIsExport())
复制代码
- 在设置了内容之后我们还要根据注解的单元格格式进行样式的设置
setStyleByType(wb,exportItem.getFormat());
复制代码
Excel输出
fileName += getExcelSuffix(type);
_response.setContentType(getContentType(type));
_response.setHeader(
"Content-disposition",
"attachment; filename="
+ new String(fileName.getBytes("gbk"), "iso8859-1"));
if (out == null)
{
out = _response.getOutputStream();
}
wb.write(out);
out.flush();
out.close();
复制代码
所需jar
log4j-1.2.17.jar 日志jar包
servlet-api.jar 正常在web项目中都不需要引入该jar包
poi-3.9.jar 操作表格jar包
pi-ooxml-3.12.jar XSSFWorkbook 处理2007版本及以上的excel
复制代码
调用代码
- 剩下的就非常简单了。我们使用注解的目的也是简化我们的代码重复操作!通过注解就可以将重复操作交由计算机操作!这样在我们的维护上也方便了很多!
List<ExcelUser> list = adminManageServiceI.getUsers(ConstantUtil.ADMIN_ID);
// 生成Excel并使用浏览器下载
ExcelTool.$Brower(ExcelUser.class, response).toExcel(list, "用户信息");
复制代码
效果
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END