项目背景
最近在做公司一个项目,其中有个功能是库存盘点。大致流程是:创建盘点计划--> 激活盘点计划 --> 实盘录入 --> 差异确认(或生成复盘计划) --> 同步盘点数据至库存中心 --> 盘点完成。
其中在实盘录入环节,由于物料数量较多,需求要求可以将待盘点物料导出excel,处理完了之后再将excel数据导入到盘点表中。物料存在不同的盘点单位,如:箱(KAR)、公斤(KG)....等,这样盘点人员在excel上操作时必须限定其盘点的单位是存在的。这样就要求我们在导出excel的时候,将盘点单位单元格生成下拉框数据,而且下拉的数据内容可能会不同(单位数据存储在商品中心:基本单位、运输单位、存储单位等)。
实现效果
可以看到不同的物料生成的下拉框数据是不同的
代码截图
大致步骤:
1.查询数据库获取要导出的数据,并按照easypoi规范生成具体dto对象(使用过easypoi的应该都知道)
2.根据查询的数据生成对应的下拉框数据(重点说下这个)
3.执行导出(使用easypoi的util工具)
1.前端请求入口
下拉框创建工具类
通用DTO定义
根据查询的数据动态生成下拉内容
将创建的下拉框数据对象植入到workbook中
导出前执行上面的操作
该篇文章着重介绍的是怎么动态生成下拉框,easypoi的使用方法比较简单,网上教学的文章也很多,本篇不做说明,如果看不明白的可以先学会easypoi的使用,再来对着看会比较简单。
代码实现
1.前端调用入口代码
@ApiOperation("实盘单导出")
@RequestMapping(value = "/v1/export/{orderNo}", method = RequestMethod.GET)
public void export(HttpServletResponse response, @PathVariable("orderNo") String orderNo) {
try {
// 要导出的数据
List<CheckOrderExcelDTO> dataList = checkOrderFacade.getCheckOrderExcelData(orderNo);
String title = "盘点单明细(库存状态:非限制、待质检、冻结)";
String sheetName = "盘点单明细";
String fileName = sheetName + DateUtils.getCurrentDay(null) + ExcelUtil.XLS;
// 表格下拉框信息
List<ExcelSelectortDTO> selectors = checkOrderFacade.getExcelSelectorData(dataList);
// excel导出(带单位下拉框)
ExcelUtil.exportExcel(dataList, selectors, title, sheetName, CheckOrderExcelDTO.class, fileName, response);
} catch (Exception e) {
log.error("实盘单导出异常:", e);
throw new RomeException(ResponseMsg.FAIL.getCode(), "盘点单导出失败");
}
}
2.查询导出数据的代码(可以写死数据)
调用service,查询数据库得到要导出的数据list
将list中的数据转成:List<CheckOrderExcelDTO> dataList
// CheckOrderExcelDTO对象
@Data
public class CheckOrderExcelDTO extends BaseImportDTO {
@Excel(name = "盘点单号", orderNum ="0", width = 20)
private String orderNo;
@NotBlank(message = "物料编码为空")
@Excel(name = "物料编码", orderNum ="1", width = 15)
private String skuCode;
@Excel(name = "物料名称", orderNum ="2", width = 25, isWrap = false)
private String skuName;
@Excel(name = "基本单位", or