[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-public-FJVl0rCu":3,"public-project-articles-FJVl0rCu":17},{"id":4,"uuid":5,"project_id":6,"title":7,"content":8,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16},50,"FJVl0rCu",39,"17. SpringBoot+Vue实现数据的批量导入和导出","\n## 全部数据批量导出\n\n```java\nExcelWriter writer = ExcelUtil.getWriter(true);\nwriter.write(list, true);\n\n\u002F\u002F 设置浏览器响应的格式\nresponse.setContentType(\"application\u002Fvnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8\");\nresponse.setHeader(\"Content-Disposition\", \"attachment;filename=\" + URLEncoder.encode(\"用户信息表\", \"UTF-8\") + \".xlsx\");\n\nServletOutputStream out = response.getOutputStream();\nwriter.flush(out, true);\nout.close();\nwriter.close();\n```\n\n为什么导出数据的时候会发生这个错误呢？\n![image.png](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2023\u002Fpng\u002F751015\u002F1694004583488-adc5b7df-56d1-42e9-a0e6-ad8bae1a8dcb.png#averageHue=%23312d2d&clientId=u8c832e63-f1e0-4&from=paste&height=339&id=uafdc4d6a&originHeight=424&originWidth=1630&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=102866&status=done&style=none&taskId=u77be0af8-2454-4852-84e5-e9d3bcaae16&title=&width=1304)\n[https:\u002F\u002Fdoc.hutool.cn\u002Fpages\u002Fpoi\u002F#%E4%BB%8B%E7%BB%8D](https:\u002F\u002Fdoc.hutool.cn\u002Fpages\u002Fpoi\u002F#%E4%BB%8B%E7%BB%8D)\n找依赖\n[https:\u002F\u002Fmvnrepository.com\u002F](https:\u002F\u002Fmvnrepository.com\u002F)\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>org.apache.poi\u003C\u002FgroupId>\n    \u003CartifactId>poi-ooxml\u003C\u002FartifactId>\n    \u003Cversion>5.2.3\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n如何给导出的 excel 表头设置中文？\n只需要在实体类的属性上面加一个注解 @Alias(\"中文\")\n\n## 部分数据批量导出\n\n为什么会翻车？\n因为没写查询条件\n![image.png](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2023\u002Fpng\u002F751015\u002F1694005706434-2599b135-82ff-40da-b03d-52058bc7b682.png#averageHue=%232e2d2d&clientId=u8c832e63-f1e0-4&from=paste&height=148&id=u24800d37&originHeight=185&originWidth=1149&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=25987&status=done&style=none&taskId=u1d4947b8-baa2-49ad-86cb-c6356f26714&title=&width=919.2)\n\n```java\n@GetMapping(\"\u002Fexport\")\npublic void exportData(@RequestParam(required = false) String username,\n                       @RequestParam(required = false) String name,\n                       HttpServletResponse response) throws IOException {\n    ExcelWriter writer = ExcelUtil.getWriter(true);\n    \u002F\u002F 第一种全部导出\n    List\u003CUser> list = new ArrayList\u003C>();\n    QueryWrapper\u003CUser> queryWrapper = new QueryWrapper\u003C>();\n    queryWrapper.like(StrUtil.isNotBlank(username), \"username\", username);\n    queryWrapper.like(StrUtil.isNotBlank(name), \"name\", name);\n    list = userService.list(queryWrapper);   \u002F\u002F 查询出当前User表的所有数据\n\n    writer.write(list, true);\n\n    response.setContentType(\"application\u002Fvnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8\");\n    response.setHeader(\"Content-Disposition\", \"attachment;filename=\" + URLEncoder.encode(\"用户信息表\", \"UTF-8\") + \".xlsx\");\n    ServletOutputStream outputStream = response.getOutputStream();\n    writer.flush(outputStream, true);\n    writer.close();\n    outputStream.flush();\n    outputStream.close();\n}\n```\n\n**三种情况的导出完整的代码**\n\n```java\n@GetMapping(\"\u002Fexport\")\npublic void exportData(@RequestParam(required = false) String username,\n                       @RequestParam(required = false) String name,\n                       @RequestParam(required = false) String ids,  \u002F\u002F   1,2,3,4,5\n                       HttpServletResponse response) throws IOException {\n    ExcelWriter writer = ExcelUtil.getWriter(true);\n\n    List\u003CUser> list;\n    QueryWrapper\u003CUser> queryWrapper = new QueryWrapper\u003C>();\n    if (StrUtil.isNotBlank(ids)) {     \u002F\u002F [\"1\", \"2\", \"3\"]   => [1,2,3]\n        List\u003CInteger> idsArr1 = Arrays.stream(ids.split(\",\")).map(Integer::valueOf).collect(Collectors.toList());\n        queryWrapper.in(\"id\", idsArr1);\n    } else {\n        \u002F\u002F 第一种全部导出或者条件导出\n        queryWrapper.like(StrUtil.isNotBlank(username), \"username\", username);\n        queryWrapper.like(StrUtil.isNotBlank(name), \"name\", name);\n    }\n    list = userService.list(queryWrapper);   \u002F\u002F 查询出当前User表的所有数据\n    writer.write(list, true);\n\n    response.setContentType(\"application\u002Fvnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8\");\n    response.setHeader(\"Content-Disposition\", \"attachment;filename=\" + URLEncoder.encode(\"用户信息表\", \"UTF-8\") + \".xlsx\");\n    ServletOutputStream outputStream = response.getOutputStream();\n    writer.flush(outputStream, true);\n    writer.close();\n    outputStream.flush();\n    outputStream.close();\n}\n```\n\n## 批量导入\n\n```java\nInputStream inputStream = file.getInputStream();\nExcelReader reader = ExcelUtil.getReader(inputStream);\nList\u003CAddress> list = reader.readAll();\n```\n\n导入数据出错了：\n![image.png](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2023\u002Fpng\u002F751015\u002F1694007365215-1e98bdc9-c5ad-4be6-8679-b2096b649f0b.png#averageHue=%23fefcfb&clientId=u8c832e63-f1e0-4&from=paste&height=102&id=uc345f3b7&originHeight=128&originWidth=575&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8760&status=done&style=none&taskId=ua3a47bd4-4994-49b3-9cfc-112727abbf2&title=&width=460)\n出现这个错误的原因是什么？\n![image.png](https:\u002F\u002Fcdn.nlark.com\u002Fyuque\u002F0\u002F2023\u002Fpng\u002F751015\u002F1694007387179-ee666ae9-dd37-4afc-8378-0bd78912c736.png#averageHue=%23352f2e&clientId=u8c832e63-f1e0-4&from=paste&height=393&id=u675d9c16&originHeight=491&originWidth=1436&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=147435&status=done&style=none&taskId=ue878b6b1-da77-4ea1-a9d4-2ced5e3317a&title=&width=1148.8)\n因为 user 表导入的数据的用户名重复了\n\n**导入完整的代码**\n\n```java\n@PostMapping(\"\u002Fimport\")\npublic Result importData(MultipartFile file) throws IOException {\n    ExcelReader reader = ExcelUtil.getReader(file.getInputStream());\n    List\u003CUser> userList = reader.readAll(User.class);\n    \u002F\u002F 写入数据到数据库\n    try {\n        userService.saveBatch(userList);\n    } catch (Exception e) {\n        e.printStackTrace();\n        return Result.error(\"数据批量导入错误\");\n    }\n    return Result.success();\n}\n```\n\n**前端 Vue 的导入和导出代码**\n\n```vue\nhandleImport(res, file, fileList) {\n  if (res.code === '200') {\n    this.$message.success(\"操作成功\")\n    this.load(1)\n  } else {\n    this.$message.error(res.msg)\n  }\n},\nexportData() {   \u002F\u002F 批量导出数据\n  if (!this.ids.length) {   \u002F\u002F 没有选择行的时候，全部导出  或者根据我的搜索条件导出\n    window.open('http:\u002F\u002Flocalhost:9090\u002Fuser\u002Fexport?token=' + this.user.token + \"&username=\"\n        + this.username + \"&name=\" + this.name)\n  } else {      \u002F\u002F [1,2,3] => '1,2,3'\n    let idStr = this.ids.join(',')\n    window.open('http:\u002F\u002Flocalhost:9090\u002Fuser\u002Fexport?token=' + this.user.token + '&ids=' + idStr)\n  }\n},\n```\n","coding",1,1684,72,"2024-04-16 02:32:26","2026-05-03 22:49:02","【青哥带小白做毕设2024】完整教程资料汇总","qingge-graduation-project-2024",{"project":18,"items":19},{"id":6,"title":15,"slug":16},[20,28,35,42,49,56,63,69,76,83,90,97,104,111,118,125,132,139,140,147,154,161,168],{"id":21,"uuid":22,"project_id":6,"title":23,"type":9,"status":10,"public_enabled":10,"views":24,"sort":25,"created_at":26,"updated_at":27,"project_title":15,"project_slug":16},33,"R1oMCsCX","00. 从0开始带小白做SpringBoot+Vue+uniapp微信小程序实战项目",12130,55,"2025-04-08 11:28:17","2026-05-07 15:33:28.189425+00",{"id":29,"uuid":30,"project_id":6,"title":31,"type":9,"status":10,"public_enabled":10,"views":32,"sort":33,"created_at":34,"updated_at":14,"project_title":15,"project_slug":16},34,"s3u3u8W7","01. 网页布局技巧",3326,56,"2025-04-08 11:28:13",{"id":36,"uuid":37,"project_id":6,"title":38,"type":9,"status":10,"public_enabled":10,"views":39,"sort":40,"created_at":41,"updated_at":14,"project_title":15,"project_slug":16},35,"21zUHQYS","02. JavaScript入门",2017,57,"2025-04-08 11:27:55",{"id":43,"uuid":44,"project_id":6,"title":45,"type":9,"status":10,"public_enabled":10,"views":46,"sort":47,"created_at":48,"updated_at":14,"project_title":15,"project_slug":16},36,"4XVgY9Ti","03. Vue脚手架搭建",3719,58,"2025-04-08 11:27:46",{"id":50,"uuid":51,"project_id":6,"title":52,"type":9,"status":10,"public_enabled":10,"views":53,"sort":54,"created_at":55,"updated_at":14,"project_title":15,"project_slug":16},37,"S8vLLLvk","04. Git速成，推送代码到云端",1585,59,"2025-04-08 11:27:41",{"id":57,"uuid":58,"project_id":6,"title":59,"type":9,"status":10,"public_enabled":10,"views":60,"sort":61,"created_at":62,"updated_at":14,"project_title":15,"project_slug":16},38,"9EbwnGDp","05. 网页布局神器ElementUI速成",2670,60,"2025-04-08 11:27:37",{"id":6,"uuid":64,"project_id":6,"title":65,"type":9,"status":10,"public_enabled":10,"views":66,"sort":67,"created_at":68,"updated_at":14,"project_title":15,"project_slug":16},"tmzahWer","06. Vue管理系统速成",3744,61,"2025-04-08 11:27:32",{"id":70,"uuid":71,"project_id":6,"title":72,"type":9,"status":10,"public_enabled":10,"views":73,"sort":74,"created_at":75,"updated_at":14,"project_title":15,"project_slug":16},40,"2agqAUQK","07. SpringBoot速成",3654,62,"2025-04-08 11:27:27",{"id":77,"uuid":78,"project_id":6,"title":79,"type":9,"status":10,"public_enabled":10,"views":80,"sort":81,"created_at":82,"updated_at":14,"project_title":15,"project_slug":16},41,"SXPAzgy7","08. Http扫盲，让小白也能听懂",2337,63,"2025-04-08 11:27:20",{"id":84,"uuid":85,"project_id":6,"title":86,"type":9,"status":10,"public_enabled":10,"views":87,"sort":88,"created_at":89,"updated_at":14,"project_title":15,"project_slug":16},42,"ostBIxAV","09. SpringBoot集成Mybatis实现增删改查",4190,64,"2025-04-08 11:27:13",{"id":91,"uuid":92,"project_id":6,"title":93,"type":9,"status":10,"public_enabled":10,"views":94,"sort":95,"created_at":96,"updated_at":14,"project_title":15,"project_slug":16},43,"6Sv7afpa","10. Vue封装前后端数据交互工具",3716,65,"2024-04-16 02:33:13",{"id":98,"uuid":99,"project_id":6,"title":100,"type":9,"status":10,"public_enabled":10,"views":101,"sort":102,"created_at":103,"updated_at":14,"project_title":15,"project_slug":16},44,"d53BPIQs","11. Vue登录（含验证码）、注册页面开发",4867,66,"2024-04-16 02:33:08",{"id":105,"uuid":106,"project_id":6,"title":107,"type":9,"status":10,"public_enabled":10,"views":108,"sort":109,"created_at":110,"updated_at":14,"project_title":15,"project_slug":16},45,"m033ng06","12. SpringBoot集成JWT token实现权限验证",3243,67,"2024-04-16 02:33:00",{"id":112,"uuid":113,"project_id":6,"title":114,"type":9,"status":10,"public_enabled":10,"views":115,"sort":116,"created_at":117,"updated_at":14,"project_title":15,"project_slug":16},46,"7xzyVD06","13. SpringBoot+Vue实现单文件、多文件上传和下载",2784,68,"2024-04-16 02:32:52",{"id":119,"uuid":120,"project_id":6,"title":121,"type":9,"status":10,"public_enabled":10,"views":122,"sort":123,"created_at":124,"updated_at":14,"project_title":15,"project_slug":16},47,"BdOLUenp","14. 多角色登录（Vue-Router路由守卫）",2318,69,"2024-04-16 02:32:39",{"id":126,"uuid":127,"project_id":6,"title":128,"type":9,"status":10,"public_enabled":10,"views":129,"sort":130,"created_at":131,"updated_at":14,"project_title":15,"project_slug":16},48,"2Wkx3igg","15. Vue个人信息修改、修改密码、重置密码",2092,70,"2024-04-16 02:32:33",{"id":133,"uuid":134,"project_id":6,"title":135,"type":9,"status":10,"public_enabled":10,"views":136,"sort":137,"created_at":138,"updated_at":14,"project_title":15,"project_slug":16},49,"BDvVa4By","16. SpringBoot+Vue管理系统实现增删改查",2598,71,"2024-04-16 02:32:29",{"id":4,"uuid":5,"project_id":6,"title":7,"type":9,"status":10,"public_enabled":10,"views":11,"sort":12,"created_at":13,"updated_at":14,"project_title":15,"project_slug":16},{"id":141,"uuid":142,"project_id":6,"title":143,"type":9,"status":10,"public_enabled":10,"views":144,"sort":145,"created_at":146,"updated_at":14,"project_title":15,"project_slug":16},51,"FvW9oHgj","18. SpringBoot+Vue项目部署上线",2845,73,"2024-04-16 02:32:22",{"id":148,"uuid":149,"project_id":6,"title":150,"type":9,"status":10,"public_enabled":10,"views":151,"sort":152,"created_at":153,"updated_at":14,"project_title":15,"project_slug":16},52,"xyqrxxiR","19. SpringBoot+Vue集成富文本编辑器",1499,74,"2024-04-16 02:32:18",{"id":155,"uuid":156,"project_id":6,"title":157,"type":9,"status":10,"public_enabled":10,"views":158,"sort":159,"created_at":160,"updated_at":14,"project_title":15,"project_slug":16},53,"XAaCXz8W","20. SpringBoot+Vue集成系统公告",1043,75,"2024-04-16 02:32:14",{"id":162,"uuid":163,"project_id":6,"title":164,"type":9,"status":10,"public_enabled":10,"views":165,"sort":166,"created_at":167,"updated_at":14,"project_title":15,"project_slug":16},54,"2havlmaC","21. SpringBoot+Vue集成AOP系统日志",1159,76,"2024-04-16 02:32:11",{"id":25,"uuid":169,"project_id":6,"title":170,"type":9,"status":10,"public_enabled":10,"views":171,"sort":172,"created_at":173,"updated_at":14,"project_title":15,"project_slug":16},"ObvLqJdX","22. SpringBoot+Vue实现Echarts数据报表（柱状图、饼图、折线图）",1688,99,"2024-04-16 02:30:25"]