sql2java-excel:基于apache poi实现数据库表的导出的spring web支持
Posted 10km
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql2java-excel:基于apache poi实现数据库表的导出的spring web支持相关的知识,希望对你有一定的参考价值。
sql2java是我几年年开始写的一个sql2java是一个轻量级数据库(SQL)访问代码(java)生成器。这几年一直在根据工作需要维护升级,最近的项目中需要对数据库的记录提供导出excel的功能。
就开始学习apache的POI,参照网上的示例实现了单张表的导出。并进一步将它封装成一个通用库成为sql2java下的子项目sql2java-excel.以方便在其他项目中技术复用。
本文开始介绍sql2java-excel的使用spring 支持的部分
Spring Web导出
快速入门
以下是基于Spring Web的数据库导出最简示例:
import static gu.sql2java.Managers.instanceOf;
@RestController
@Api(value="ExcelController",tags="Excel Export Controller")
public class ExcelController
/**
* 这里必须指定produces,否则swagger下载的excel文件不正确,
* 参见 <a href="https://blog.csdn.net/iuie_sl/article/details/114904170 ">《使用swagger api 下载excel,excel打不开》</a>
*/
@ApiOperation(value = "导出设备列表", notes = "",httpMethod="GET",produces=MediaType.APPLICATION_OCTET_STREAM_VALUE)
@RequestMapping(method=RequestMethod.GET, value="/ExcelController/exportDevices")
public void exportDevices(HttpServletResponse response) throws IOException
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd_HHmmss");
String currentDateTime = dateFormatter.format(new Date());
/** 设置下载文件文件名 */
String headerKey = "Content-Disposition";
String headerValue = "attachment; filename=device_" + currentDateTime + ".xlsx";
response.setHeader(headerKey, headerValue);
/** 从数据库中获取记录 **/
List<DeviceBean> beans = instanceOf(IDeviceManager.class).loadAllAsList();
ExcelGenerator<DeviceBean> generator = new ExcelGenerator<DeviceBean>(beans);
/** 输出到 http response */
generator.generate(response);
自定义导出配置
以下是基于Spring Web的数据库导出示例,与前一个示例不同的就是增加了通过SheetConfig对象设置excel 导出配置参数:
import static gu.sql2java.Managers.instanceOf;
@RestController
@Api(value="ExcelController",tags="Excel Export Controller")
public class ExcelController
/**
* 这里必须指定produces,否则swagger下载的excel文件不正确,
* 参见 <a href="https://blog.csdn.net/iuie_sl/article/details/114904170 ">《使用swagger api 下载excel,excel打不开》</a>
*/
@ApiOperation(value = "导出设备列表", notes = "",httpMethod="GET",produces=MediaType.APPLICATION_OCTET_STREAM_VALUE)
@RequestMapping(method=RequestMethod.GET, value="/ExcelController/exportDevices")
public void exportDevices(HttpServletResponse response) throws IOException
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd_HHmmss");
String currentDateTime = dateFormatter.format(new Date());
/** 设置下载文件文件名 */
String headerKey = "Content-Disposition";
String headerValue = "attachment; filename=device_" + currentDateTime + ".xlsx";
response.setHeader(headerKey, headerValue);
/** 从数据库中获取记录 **/
List<DeviceBean> beans = instanceOf(IDeviceManager.class).loadAllAsList();
ExcelGenerator<DeviceBean> generator = new ExcelGenerator<DeviceBean>(beans);
/** excel 导出配置对象 */
SheetConfig sheetConfig = generator.getSheetConfig();
/** 设置exce表的标题 */
sheetConfig.setTitle("设备表记录");
/** 设置输出字段列名,如果不指定则输出原始的英文字段名 */
sheetConfig.configOf("physicalAddress").getColumnConfig().setName("物理地址");
sheetConfig.configOf("addressType").getColumnConfig().setName("地址类型");
sheetConfig.configOf("iotCard").getColumnConfig().setName("物联网卡编号");
sheetConfig.configOf("status").getColumnConfig().setName("设备状态").setReadConverterExp("ENABLE=正常,DISABLE=禁用,MAINTAIN=维护,PENDING=挂起(待审核)");
sheetConfig.configOf("fixedMode").getColumnConfig().setName("安装方式").setReadConverterExp("HANG=悬挂,FLOOR=落地");
sheetConfig.configOf("name").getColumnConfig().setName("设备名称");
sheetConfig.configOf("groupId").getColumnConfig().setName("设备组ID");
sheetConfig.configOf("model").getColumnConfig().setName("设备型号");
sheetConfig.configOf("vendor").getColumnConfig().setName("设备供应商");
sheetConfig.configOf("osArch").getColumnConfig().setName("操作系统平台");
sheetConfig.configOf("versionInfo").getColumnConfig().setName("版本");
sheetConfig.configOf("planId").getColumnConfig().setName("当前节目ID");
sheetConfig.configOf("targetId").getColumnConfig().setName("目标节目ID");
sheetConfig.configOf("screenInfo").getColumnConfig().setName("屏幕信息").setHandler(ScreenInfoFormatter.class);
sheetConfig.configOf("createTime").getColumnConfig().setName("记录创建时间");
sheetConfig.configOf("updateTime").getColumnConfig().setName("记录更新时间");
sheetConfig.configOf("remark").getColumnConfig().setName("备注");
/** 设置子成员输出字段名 */
sheetConfig.addNestedColumn("props.last_active_time","上次在线时间");
sheetConfig.addNestedColumn("props.disk_capacity","磁盘容量");
sheetConfig.addNestedColumn("props.network","网络连接类型");
sheetConfig.addNestedColumn("props.status_comment","状态变更说明");
sheetConfig.addNestedColumn("device_detail.device_name","产品名称");
sheetConfig.addNestedColumn("device_detail.manufacturer","制造商");
sheetConfig.addNestedColumn("device_detail.made_date","生产日期");
/** 设置不需要导出的隐藏字段 */
sheetConfig.setHideColumns("props","token_time","device_detail");
/** 输出到 http response */
generator.generate(response);
Spring AOP导出
启用aspect
excelGenerator支持Spring AOP(切面),需要如下在@ComponentScan
注解中增加包名gu.sql2java.excel.aspect
,才能让spring扫描到excelGenerator的切面导出实现类
@SpringBootApplication
@ComponentScan("net.facelib.eam.devicecenter","net.facelib.eam.web.handler","gu.sql2java.excel.aspect")
public class RestfulService
//
快速入门
通过对服务方法增加@ExcelSheet
注解,就可以实现数据库记录的Excel导出.
- 要求服务方法的返回类型为
Collection,Set,List
以及任何实现了java.lang.Iterable
接口的可迭代容器 - 要求容器元素类型为
Map
或Java Bean(fastjson的JSONObject
也属于Map
) - 不限制HTTP method的类型,可以是POST,也可以是GET
以下是基于Spring AOP的数据库导出最简示例:
. /**
* 设备表导出EXCEL<br>
*/
@ExcelSheet()
/**
* 这里必须指定produces,否则swagger下载的excel文件不正确,
* 参见 <a href="https://blog.csdn.net/iuie_sl/article/details/114904170 ">《使用swagger api 下载excel,excel打不开》</a>
*/
@ApiOperation(value = "设备表导出EXCEL", notes = "设备表导出EXCEL",httpMethod="GET",produces="application/octet-stream")
@RequestMapping(method=RequestMethod.GET,produces="application/octet-stream")
public List<JSONObject> exportDevices()
return instanceOf(IDeviceManager.class).loadAllAsList();
Excel输出配置
如果需要对导出的EXCEL进行配置(标题,列名,字体等等),可以通过在服务方法中增加注解来实现,基于上面的示例在exportDevices
方法中增加@ExcelSheet
注解对Excel 输出的全局参数进行配置,增加 @ExcelColumn
注解对各个输出字段进行配置
/**
* 设备表导出EXCEL<br>
*/
@ExcelSheet(title="设备表记录",
fileNamePrefix = "device_",
hideColumns="props","token_time","device_detail",
defaultIncludeColumns="id","provinces","city","top_group_name","name",
"physicalAddress","addressType","iotCard","network","screenInfo","fixedMode","model","osArch","versionInfo",
"status","props.disk_capacity","props.last_active_time","createTime","remark")
@ExcelColumn(columnName="physicalAddress",name="物理地址")
@ExcelColumn(columnName="addressType",name="地址类型")
@ExcelColumn(columnName="iotCard",name="物联网卡编号")
@ExcelColumn(columnName="status",name="设备状态",readConverterExp="ENABLE=正常,DISABLE=禁用,MAINTAIN=维护,PENDING=挂起(待审核)")
@ExcelColumn(columnName="fixedMode",name="安装方式",readConverterExp="HANG=悬挂,FLOOR=落地")
@ExcelColumn(columnName="name",name="设备名称")
@ExcelColumn(columnName="groupId",name="设备组ID")
@ExcelColumn(columnName="provinces",name="省/自治区/直辖市")
@ExcelColumn(columnName="city",name="市")
@ExcelColumn(columnName="top_group_name",name="设备组名称")
@ExcelColumn(columnName="screenInfo",name="屏幕信息")
@ExcelColumn(columnName="name",name="设备名称")
@ExcelColumn(columnName="model",name="设备型号")
@ExcelColumn(columnName="vendor",name="设备供应商")
@ExcelColumn(columnName="osArch",name="操作系统平台")
@ExcelColumn(columnName="network",name="网络连接类型")
@ExcelColumn(columnName="versionInfo",name="版本")
@ExcelColumn(columnName="planId",name="当前节目ID")
@ExcelColumn(columnName="targetId",name="目标节目ID")
@ExcelColumn(columnName="createTime",name="记录创建时间")
@ExcelColumn(columnName="updateTime",name="记录修改时间")
@ExcelColumn(columnName="remark",name="备注")
@ExcelColumn(columnName="props.last_active_time",name="上次在线时间")
@ExcelColumn(columnName="props.disk_capacity",name="磁盘容量")
@ExcelColumn(columnName="props.status_comment",name="状态变更说明")
@ExcelColumn(columnName="device_detail.device_name",name="产品名称")
@ExcelColumn(columnName="device_detail.manufacturer",name="制造商")
@ExcelColumn(columnName="device_detail.made_date",name="生产日期")
/**
* 这里必须指定produces,否则swagger下载的excel文件不正确,
* 参见 <a href="https://blog.csdn.net/iuie_sl/article/details/114904170 ">《使用swagger api 下载excel,excel打不开》</a>
*/
@ApiOperation(value = "设备表导出EXCEL", notes = "设备表导出EXCEL",httpMethod="GET",produces="application/octet-stream")
@RequestMapping(method=RequestMethod.GET,produces="application/octet-stream")
public List<DeviceBean> exportDevices()
return instanceOf(IDeviceManager.class).loadAllAsList();
Web端控制输出格式
Spring AOP方式导出Excel也支持Web端通过请求参数控制Excel的输出格式,这种方式要求服务方法定义与@ExcelSheet
注解中对应的方法名同名的参数,切面执行时会自动将这些参数注入到@ExcelSheet
注解中。
基于上面的exportDevices
服务方法改造示例如下:
/**
* 设备表导出EXCEL<br>
*/
@ExcelSheet(title="设备表记录",
fileNamePrefix = "device_",
hideColumns="props","token_time","device_detail",
defaultIncludeColumns="id","provinces","city","top_group_name","name",
"physicalAddress","addressType","iotCard","network","screenInfo","fixedMode","model","osArch","versionInfo",
"status","props.disk_capacity","props.last_active_time","createTime","remark")
@ExcelColumn(columnName="physicalAddress",name="物理地址")
@ExcelColumn(columnName="addressType",name="地址类型")
@ExcelColumn(columnName="iotCard",name="物联网卡编号")
@ExcelColumn(columnName="status",name="设备状态",readConverterExp="ENABLE=正常,DISABLE=禁用,MAINTAIN=维护,PENDING=挂起(待审核)")
@ExcelColumn(columnName="fixedMode",name="安装方式",readConverterExp="HANG=悬挂,FLOOR=落地")
@ExcelColumn(columnName="name",name="设备名称")
@ExcelColumn(columnName="groupId",name="设备组ID")
@ExcelColumn(columnName="provinces",name="省/自治区/直辖市")
@ExcelColumn(columnName="city",name="市")
@ExcelColumn(columnName="top_group_name",name="设备组名称")
@ExcelColumn(columnName="screenInfo",name="屏幕信息")
@ExcelColumn(columnName="name",name="设备名称")
@ExcelColumn(columnName="model",name="设备型号")
@ExcelColumn(columnName="vendor",name="设备供应商")
@ExcelColumn(columnName="osArch",name="操作系统平台")
@ExcelColumn(columnName="network",name="网络连接类型")
@ExcelColumn(columnName="versionInfo",name="版本")
@ExcelColumn(columnName="planId",name="当前节目ID")
@ExcelColumn(columnName="targetId",name="目标节目ID")
@ExcelColumn(columnName="createTime",name="记录创建时间")
@ExcelColumn(columnName="updateTime",name="以上是关于sql2java-excel:基于apache poi实现数据库表的导出的spring web支持的主要内容,如果未能解决你的问题,请参考以下文章
sql2java-excel:基于apache poi实现数据库表的导出及支持spring web
sql2java-excel:基于apache poi实现数据库表的导出及支持spring web