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

基于Apache组件,分析对象池原理

在虚拟机上的关于Apache(阿帕奇)基于端口访问网站

CentOS系统中基于Apache+php+mysql的许愿墙网站的搭建

Gradle学习笔记