这篇博客再次记录一下导出excel; 收到一个改一个excel导出的任务,于是很自然的去参考上一篇博客。
https://blog.csdn.net/qq_35529931/article/details/81988802
结果导出excel后,里面的内容却一直是乱码。于是一度认为是字符集没有设置,各种设置都没有效果。于是改成了英文,发现下载下来的却也是乱码。可以得出结论,不是乱码的问题了。改成英文打开,如下图;
于是参考了另一篇博客。记录一下。
前端的写法,url的传输方式没有改变,增加了传入一个json数组。 这样后台就会带一个参数了。
<input type="hidden" name="jsonStr" :value="reversedMessage"/>
<form method="get" :action="apiUrl + context.oms + '/material/goods/v1/stocks/enter/template/export'"
accept-charset="UTF-8">
<input type="hidden" name="access_token" :value="token"/>
<input type="hidden" name="jsonStr" :value="jsonStr"/>
<input type="submit" size="small" class="lightGreenBtn" value="导出模版">
</form>
JS的写
computed: {
// json对象
reversedMessage: function () {
this.jsonStr = JSON.stringify(this.tableData);
return 1;
}
},
后台的写法 也很简单。
代码如下:
展示 接收前端传过来的数据,进行解析:
@ResponseBody
@RequestMapping(value = "v1/stocks/enter/template/export", method = RequestMethod.GET)
@ApiOperation(httpMethod = "GET", value = "导出物资入库模板")
public void exportEnterStockDetailTemplate(HttpServletResponse response,String jsonStr) throws IOException{
// 接收前端传过来的json值
JSONArray obj = JSONArray.fromObject(jsonStr);
List<EnterStockImportDTO> enterStockImportDTOList = (List<EnterStockImportDTO>) JSONArray.toList(obj,EnterStockImportDTO.class);
...
后台继续展示创建excel,并且将前端的DTO放到对应的excel中:
// 创建excel,设置名称
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("物资入库导出模板");
String fileName = null;
try {
fileName = new String("物资入库导出模板.xls".getBytes("utf-8"), "iso-8859-1");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("字符编码格式不支持," + e);
}
// 设置excel的表头
HSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue("入库数量");
row.createCell(1).setCellValue("物资名称");
row.createCell(2).setCellValue("品牌");
row.createCell(3).setCellValue("型号");
row.createCell(4).setCellValue("单位");
row.createCell(5).setCellValue("入库单价");
row.createCell(6).setCellValue("有效期");
row.createCell(7).setCellValue("供应商");
row.createCell(8).setCellValue("位置");
// 将数据插入到excel中
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
for(int i= 0; i < enterStockImportDTOList.size(); i++){
row = sheet.createRow(i + 1);
row.createCell(0).setCellValue(enterStockImportDTOList.get(i).getEnterNum());
row.createCell(1).setCellValue(enterStockImportDTOList.get(i).getGoodsName());
row.createCell(2).setCellValue(enterStockImportDTOList.get(i).getBrand());
row.createCell(3).setCellValue(enterStockImportDTOList.get(i).getModel());
row.createCell(4).setCellValue(enterStockImportDTOList.get(i).getUnit());
row.createCell(5).setCellValue(String.valueOf(enterStockImportDTOList.get(i).getPrice()));
row.createCell(6).setCellValue(simpleDateFormat.format(enterStockImportDTOList.get(i).getDueDate()));
row.createCell(7).setCellValue(enterStockImportDTOList.get(i).getSupplierName());
row.createCell(8).setCellValue(enterStockImportDTOList.get(i).getLocation());
}
// 写入并导出
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
response.flushBuffer();
workbook.write(response.getOutputStream());
这样就可以了。主要是设置了表名的中文,以及头部的设置,并将前端的数据导入到excel中
这个DTO的数据是未保存到数据库中的,通过前端json得到值后,进行解析放到对应的excel的列中。
这次记录完成。这是第二种spring boot导出excel的方法!!!