关于springboot项目前端导出从数据库查询到的数据到Excel时出现的问题

Never妥协 2021-01-26 05:29:22
问题是这样的,我现在想通过下载在用户在点击导出时将查询的结果导出来。

然后这是我的js

layer.confirm('确定导出到Excel?', {
btn : [ '确定', '取消' ]
}, function() {
$.ajax({
type : "POST",
url : "/require/export2Excel",
responseType : Blob,
data : {
requireName : $('#requireName').val(),
requireId : $('#requireId').val(),
functionName : $('#functionName').val(),
functionModule : $('#functionModule').val(),
functionType : $('#functionType').val(),
assignState : $('#assignState').val(),
submitState : $('#submitState').val(),
},success: (wb) => {//wb为我后端的workbook,我写成respong时excel文件直接没数据,写成这个的时候有数据,这儿可能有问题
var blob = new Blob([wb]); //创建一个blob对象
var a = document.createElement('a'); //创建一个<a></a>标签
a.href = URL.createObjectURL(blob); // response is a blob
a.download = "功能需求表.xlsx";
a.style.display = 'none';
document.body.appendChild(a);
a.click();
a.remove();
layer.msg("导出成功!");
}
})
});


后端代码是这样的
controller

@PostMapping("export2Excel")
@ResponseBody
public void export2Excel(@RequestParam Map<String, Object> params, HttpServletResponse response){
Query query = new Query(params,"");
List<FunctionRequireDO> list = requireService.list(query);
ExcelUtils.writeExcel(response,list,FunctionRequireDO.class);
}


工具类ExcelUtils

public static <T> void writeExcel(HttpServletResponse response, List<T> dataList, Class<T> cls){
Field[] fields = cls.getDeclaredFields();
List<Field> fieldList = Arrays.stream(fields)
.filter(field -> {
ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
if (annotation != null && annotation.col() > 0) {
field.setAccessible(true);
return true;
}
return false;
}).sorted(Comparator.comparing(field -> {
int col = 0;
ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
if (annotation != null) {
col = annotation.col();
}
return col;
})).collect(Collectors.toList());

Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("Sheet1");
AtomicInteger ai = new AtomicInteger();
{
Row row = sheet.createRow(ai.getAndIncrement());
AtomicInteger aj = new AtomicInteger();
//写入头部
fieldList.forEach(field -> {
ExcelColumn annotation = field.getAnnotation(ExcelColumn.class);
String columnName = "";
if (annotation != null) {
columnName = annotation.value();
}
Cell cell = row.createCell(aj.getAndIncrement());

CellStyle cellStyle = wb.createCellStyle();
cellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
cellStyle.setAlignment(CellStyle.ALIGN_CENTER);

Font font = wb.createFont();
font.setBoldweight(Font.BOLDWEIGHT_NORMAL);
cellStyle.setFont(font);
cell.setCellStyle(cellStyle);
cell.setCellValue(columnName);
});
}
if (CollectionUtils.isNotEmpty(dataList)) {
dataList.forEach(t -> {
Row row1 = sheet.createRow(ai.getAndIncrement());
AtomicInteger aj = new AtomicInteger();
fieldList.forEach(field -> {
Class<?> type = field.getType();
Object value = "";
try {
value = field.get(t);
} catch (Exception e) {
e.printStackTrace();
}
Cell cell = row1.createCell(aj.getAndIncrement());
if (value != null) {
if (type == Date.class) {
cell.setCellValue(value.toString());
} else {
cell.setCellValue(value.toString());
}
cell.setCellValue(value.toString());
}
});
});
}
//冻结窗格
wb.getSheet("Sheet1").createFreezePane(0, 1, 0, 1);
//浏览器下载excel
buildExcelDocument("功能需求表.xlsx",wb,response);
//生成excel文件
// buildExcelFile("C:/Users/Administrator/Desktop/"+fileName+".xlsx",wb);
}

/**
* 浏览器下载excel
* @param fileName
* @param wb
* @param response
*/

private static void buildExcelDocument(String fileName, Workbook wb, HttpServletResponse response){
try {
//application/octet-stream
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setHeader("content-type", "application/vnd.ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(fileName, "utf-8"));

response.flushBuffer();
wb.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}

我现在这样写可以导出来一个excel文件,但是打开的时候显示


还有一种方式就是我可以不用下载,直接在后端生成,但是这样目录我又就写死了,感觉对用户的友好性不好。。。大佬们帮帮我吧,,,毕设写的我快疯了
...全文
646 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Never妥协 2021-01-27
  • 打赏
  • 举报
回复
我回头看看easyExcel
Never妥协 2021-01-27
  • 打赏
  • 举报
回复
没报错,就是response里面全是乱码,然后解析下载后的excel打开就显示我上面那个图片
SKA_LYZ 2021-01-27
  • 打赏
  • 举报
回复
我用的是alibaba的EasyExcel,只用在你返回的类上加上注解,然后再controller里面设置请求头就行了。你这个看着好麻烦···
lin351550660 2021-01-27
  • 打赏
  • 举报
回复
报啥错啊 这个我们在用的 肯定是可以用的
Never妥协 2021-01-26
  • 打赏
  • 举报
回复
不好使啊老哥
Never妥协 2021-01-26
  • 打赏
  • 举报
回复
引用 1 楼 lin351550660 的回复:
1、前端别用post,改用打开新窗口 2、后端改用get请求,引入 import cn.hutool.core.*
@GetMapping("/export")
    @ApiOperation(value = "导出",httpMethod = "GET")
    public void test3( FeedbackListParam param, HttpServletResponse response) {
        ExcelWriter writer = ExcelUtil.getWriter();
        try {
            /**
             */
            String head = "导出数据";
            List<List<Object>> rows = new LinkedList<>();
            //填充rows
            List<String> rowHead = CollUtil.newArrayList("id", "用户id", "用户昵称");
            writer.writeHeadRow(rowHead);
            writer.write(rows);
            //设置宽度自适应
            writer.setColumnWidth(-1, 22);
            //response为HttpServletResponse对象
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
            response.setHeader("Content-Disposition", "attachment;filename=" + new String((head).getBytes("UTF-8"), "ISO-8859-1") + ".xls");
            ServletOutputStream out = response.getOutputStream();
            //out为OutputStream,需要写出到的目标流
            writer.flush(out);
        } catch (Exception e) {
            log.error("导出异常",e);
            e.printStackTrace();
        } finally {
            // 关闭writer,释放内存
            writer.close();
        }
    }
我写个测试类试下你给的这个类吧。。
Never妥协 2021-01-26
  • 打赏
  • 举报
回复
引用 1 楼 lin351550660 的回复:
1、前端别用post,改用打开新窗口 2、后端改用get请求,引入 import cn.hutool.core.*
@GetMapping("/export")
    @ApiOperation(value = "导出",httpMethod = "GET")
    public void test3( FeedbackListParam param, HttpServletResponse response) {
        ExcelWriter writer = ExcelUtil.getWriter();
        try {
            /**
             */
            String head = "导出数据";
            List<List<Object>> rows = new LinkedList<>();
            //填充rows
            List<String> rowHead = CollUtil.newArrayList("id", "用户id", "用户昵称");
            writer.writeHeadRow(rowHead);
            writer.write(rows);
            //设置宽度自适应
            writer.setColumnWidth(-1, 22);
            //response为HttpServletResponse对象
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
            response.setHeader("Content-Disposition", "attachment;filename=" + new String((head).getBytes("UTF-8"), "ISO-8859-1") + ".xls");
            ServletOutputStream out = response.getOutputStream();
            //out为OutputStream,需要写出到的目标流
            writer.flush(out);
        } catch (Exception e) {
            log.error("导出异常",e);
            e.printStackTrace();
        } finally {
            // 关闭writer,释放内存
            writer.close();
        }
    }
我改成了get,没改调用的类,没用啊
lin351550660 2021-01-26
  • 打赏
  • 举报
回复
1、前端别用post,改用打开新窗口 2、后端改用get请求,引入 import cn.hutool.core.*
@GetMapping("/export")
    @ApiOperation(value = "导出",httpMethod = "GET")
    public void test3( FeedbackListParam param, HttpServletResponse response) {
        ExcelWriter writer = ExcelUtil.getWriter();
        try {
            /**
             */
            String head = "导出数据";
            List<List<Object>> rows = new LinkedList<>();
            //填充rows
            List<String> rowHead = CollUtil.newArrayList("id", "用户id", "用户昵称");
            writer.writeHeadRow(rowHead);
            writer.write(rows);
            //设置宽度自适应
            writer.setColumnWidth(-1, 22);
            //response为HttpServletResponse对象
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            //test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
            response.setHeader("Content-Disposition", "attachment;filename=" + new String((head).getBytes("UTF-8"), "ISO-8859-1") + ".xls");
            ServletOutputStream out = response.getOutputStream();
            //out为OutputStream,需要写出到的目标流
            writer.flush(out);
        } catch (Exception e) {
            log.error("导出异常",e);
            e.printStackTrace();
        } finally {
            // 关闭writer,释放内存
            writer.close();
        }
    }

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧