• Java 下载excel文件


    一、背景

    微信小程序需要导出excel文件,后端技术Java,前端使用uniapp框架,使用excel模板。

    二、excel 报表模板

    需要补充的内容是以下标记问号的,其中有个表格,内容是动态添加的

    三、Java端代码实现

    关键步骤,省略数据查询

    1. //……
    2. //上面是操作数据库的内容,就不写了
    3. String classPath = "xxx/xxxx.xls";//excel模板位置,我是放在与com同级的目录下了
    4. ClassPathResource classPathResource = new ClassPathResource(classPath);
    5. InputStream is = classPathResource.getInputStream();
    6. //1. 创建一个 workbook 对象
    7. HSSFWorkbook workbook = new HSSFWorkbook(is);
    8. HSSFSheet sheetAt = workbook.getSheetAt(0);//获取第一个sheet
    9. //因为是模板,且这几行内容固定,所以这个地方可以写死
    10. sheetAt.getRow(2).getCell(1).setCellValue(sqmc);//给第三行第二个单元格添加内容
    11. sheetAt.getRow(2).getCell(4).setCellValue(format_sbny);//给第三行第五个单元格添加内容
    12. int initRow = 4;//动态行添加是从第五行开始的,所以设置为4,因为首行是0
    13. if (ds_list.size() != 0) {//这是数据库查询到的表格内容,ds_list是一个对象数组
    14. //从第5行开始往下移动 ds_list.size()行,在第initRow + ds_list.size()结束,true:表示是否更新单元格的公式。false:表示是否复制行高。
    15. sheetAt.shiftRows(initRow, initRow + ds_list.size(), ds_list.size(), true, false);
    16. for (int i = 0; i < ds_list.rowCount(); i++) {
    17. JSONObject obj = ds_list.getRow(i);//这里的这个getRow()方法是我们项目自己封装的,不要使用,实质就是获取对象数组中的对象
    18. HSSFRow row = sheetAt.createRow(initRow);
    19. row.setHeightInPoints(30);//设置行高30磅
    20. HSSFCellStyle cellStyle = workbook.createCellStyle();//创建单元格样式
    21. cellStyle.setAlignment(HorizontalAlignment.CENTER);// 设置水平居中显示
    22. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 设置垂直居中显示
    23. // 设置边框样式
    24. cellStyle.setBorderTop(BorderStyle.THIN);
    25. cellStyle.setBorderBottom(BorderStyle.THIN);
    26. cellStyle.setBorderLeft(BorderStyle.THIN);
    27. cellStyle.setBorderRight(BorderStyle.THIN);
    28. HSSFFont cellFont = workbook.createFont(); // 创建字体
    29. cellFont.setFontHeightInPoints((short)12); // 将字体大小
    30. cellFont.setFontName("宋体"); // 设置字体为 宋体 应用到当前单元格上
    31. cellStyle.setFont(cellFont); // 字体应用到 标题样式上
    32. for (int j = 0; j < 5; j++) {
    33. row.createCell(j);
    34. HSSFCell cell = row.getCell(j);
    35. cell.setCellStyle(cellStyle);
    36. }
    37. //接下来就是赋值
    38. row.getCell(0).setCellValue(i + 1);
    39. row.getCell(1).setCellValue(obj.getString("xm", ""));
    40. row.getCell(2).setCellValue(obj.getString("sfzhm", ""));
    41. row.getCell(3).setCellValue(obj.getString("swsj", ""));
    42. row.getCell(4).setCellValue(obj.getString("bz", ""));
    43. initRow++;
    44. }
    45. }
    46. //给其他位置赋值
    47. sheetAt.getRow(initRow).getCell(1).setCellValue(qtsm);//其他说明
    48. sheetAt.getRow(initRow + 1).getCell(1).setCellValue(tbr_xm);//
    49. sheetAt.getRow(initRow + 1).getCell(4).setCellValue(tbrq);//填表日期
    50. sheetAt.getRow(initRow + 2).getCell(1).setCellValue(jbr);//经办人
    51. sheetAt.getRow(initRow + 2).getCell(4).setCellValue(sbrq);//收表日期
    52. String fileName = "xxxxxx.xls";//设置文件名
    53. // 设置响应内容类型为Excel文件
    54. response.setContentType("application/vnd.ms-excel;charset=UTF-8");
    55. // 设置响应头,告诉浏览器以附件形式下载文件,并指定文件名
    56. response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(fileName,"UTF-8"));
    57. OutputStream output = response.getOutputStream();//HttpServletResponse response
    58. try {
    59. workbook.write(output);
    60. output.flush();
    61. } catch (IOException e) {
    62. e.printStackTrace();
    63. } finally {
    64. if (output != null) {
    65. output.close();
    66. }
    67. }

    通过上述的操作,然后就可以实现下载了。

    四、其他

    如果是小程序,那么可以复制下载链接,然后在手机浏览器打开,即可实现下载功能

  • 相关阅读:
    flask蓝图url连接问题1
    什么是供应商管理?
    MATLAB算法实战应用案例精讲-【智能优化算法】黏菌算法(SMA)
    服务端技术方案应该具有哪些章节
    JAVA:实现GCD最大公约数算法(附完整源码)
    万字长文 - Python 日志记录器logging 百科全书 - 高级配置之 日志分层
    Docker安装pgAdmin4
    Spring的AOP开发-AOP简介
    Java多线程与线程池解析
    一文搞懂什么是 GNU/Linux 操作系统
  • 原文地址:https://blog.csdn.net/weixin_44431073/article/details/136400634