dz可以做旅游网站吗,广州网站建设集团,奔奔网站建设,网站二次开发合同引言
文件的下载是一个非常常见的功能#xff0c;也有一些非常好的框架可以使用#xff0c;这里我们就介绍一种比较常见的场景#xff0c;下载Excel模版#xff0c;导入功能通常会配有一个模版下载的功能#xff0c;根据下载的模版#xff0c;填充数据然后再上传。
需求…引言
文件的下载是一个非常常见的功能也有一些非常好的框架可以使用这里我们就介绍一种比较常见的场景下载Excel模版导入功能通常会配有一个模版下载的功能根据下载的模版填充数据然后再上传。
需求
如图所示用户下载如下模版模版中的地区是从数据库中读出来的。
分析
如果模版都是固定的内容这种比较简单我们可以直接把模版上传到我们的文件服务器用户下载的时候可以直接在文件服务器上下载或者是把文件放到我们的工程里面直接读取文件然后以流的方式返回给前端用户直接下载。 这里比较麻烦点的就是这个模版的内容不是固定的需要在库里查询出来写到excel然后在返给前端。同时这个文件又有一定的样式一般有样式的文件我们可以根据模版填充而不是把说有的样式都用程序代码写程序代码写这种样式会很麻烦。所以我们这里用的方式就是填充模版
准备模版
把准备好的模版放到我们工程里面创建文件夹template 并把文件夹设置为resource,设置为resoucre后该文件夹下面的文件在mvn打包的时候回合我们的java类打在同一个路径下方便我们获取文件
编写下拉选项的handler
public class SelectSheetWriteHandler implements SheetWriteHandler {private String[] list;private int firstRow;private int lastRow;private int firstCol;private int lastCol;public SelectSheetWriteHandler(String[] list, int firstRow, int lastRow, int firstCol, int lastCol) {this.list list;this.firstRow firstRow;this.lastRow lastRow;this.firstCol firstCol;this.lastCol lastCol;}Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {// 区间设置 第一列第一行和第二行的数据。由于第一行是头所以第一、二行的数据实际上是第二三行CellRangeAddressList cellRangeAddressList new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);DataValidationHelper helper writeSheetHolder.getSheet().getDataValidationHelper();DataValidationConstraint constraint helper.createExplicitListConstraint(list);DataValidation dataValidation helper.createValidation(constraint, cellRangeAddressList);dataValidation.setShowErrorBox(true);writeSheetHolder.getSheet().addValidationData(dataValidation);}
}
下载的方法 public void export(HttpServletResponse response) throws IOException {//模板文件InputStream templateFile TenantInsuranceFundServiceImpl.class.getResourceAsStream(/五险一金导入模板.xlsx);//导出后的文件名String fileName 五险一金导入模板;ListBaseDictionaryVO baseDictionaryVOS dictionaryService.queryDictionaryDetail(DictionaryEnum.AREA.getCode(), DictionaryEnum.AREA.getName());SetString areaNameList new HashSet();if(!CollectionUtils.isEmpty(baseDictionaryVOS)){areaNameList baseDictionaryVOS.stream().map(BaseDictionaryVO::getName).collect(Collectors.toSet());}SelectSheetWriteHandler selectSheetWriteHandler new SelectSheetWriteHandler(areaNameList.toArray(new String[areaNameList.size()]), 2, 5000, 0, 0);//写入ExcelWriter excelWriter null;try {//流输出excelWriter EasyExcel.write(response.getOutputStream()).withTemplate(templateFile).registerWriteHandler(selectSheetWriteHandler).build();WriteSheet writeSheet EasyExcel.writerSheet().build();// 直接写入list数据 这里没有数据需要填写直接一个空集合excelWriter.fill(Arrays.asList(), writeSheet);//浏览器下载操作response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet);response.setCharacterEncoding(utf-8);// 这里URLEncoder.encode可以防止中文乱码fileName URLEncoder.encode(fileName, UTF-8).replaceAll(\\, %20);response.setHeader(Content-disposition, attachment;filename*utf-8 fileName .xlsx);excelWriter.finish();} catch (Exception e) {// 重置responseresponse.reset();response.setContentType(application/json);response.setCharacterEncoding(utf-8);MapString, String map new HashMapString, String();map.put(code, 1);map.put(message, 下载模板失败 e.getMessage());response.getWriter().println(JSON.toJSONString(map));} finally {// 千万别忘记关闭流if (excelWriter ! null) {excelWriter.finish();}}}