ExcelController.java 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package com.boot.security.server.controller;
  2. import java.util.ArrayList;
  3. import java.util.Collections;
  4. import java.util.List;
  5. import java.util.Map;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.apache.commons.codec.digest.DigestUtils;
  8. import org.slf4j.Logger;
  9. import org.slf4j.LoggerFactory;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.jdbc.core.JdbcTemplate;
  12. import org.springframework.security.access.prepost.PreAuthorize;
  13. import org.springframework.util.CollectionUtils;
  14. import org.springframework.web.bind.annotation.PostMapping;
  15. import org.springframework.web.bind.annotation.RequestMapping;
  16. import org.springframework.web.bind.annotation.RestController;
  17. import com.boot.security.server.annotation.LogAnnotation;
  18. import com.boot.security.server.utils.ExcelUtil;
  19. import io.swagger.annotations.Api;
  20. import io.swagger.annotations.ApiOperation;
  21. @Api(tags = "excel下载")
  22. @RestController
  23. @RequestMapping("/excels")
  24. public class ExcelController {
  25. private static final Logger log = LoggerFactory.getLogger("adminLogger");
  26. @Autowired
  27. private JdbcTemplate jdbcTemplate;
  28. @ApiOperation("校验sql,并返回sql返回的数量")
  29. @PostMapping("/sql-count")
  30. public Integer checkSql(String sql) {
  31. log.info(sql);
  32. sql = getAndCheckSql(sql);
  33. Integer count = 0;
  34. try {
  35. count = jdbcTemplate.queryForObject("select count(1) from (" + sql + ") t", Integer.class);
  36. } catch (Exception e) {
  37. throw new IllegalArgumentException(e.getMessage());
  38. }
  39. return count;
  40. }
  41. private String getAndCheckSql(String sql) {
  42. sql = sql.trim().toLowerCase();
  43. if (sql.endsWith(";") || sql.endsWith(";")) {
  44. sql = sql.substring(0, sql.length() - 1);
  45. }
  46. if (!sql.startsWith("select")) {
  47. throw new IllegalArgumentException("仅支持select语句");
  48. }
  49. return sql;
  50. }
  51. @LogAnnotation
  52. @ApiOperation("根据sql导出excel")
  53. @PostMapping
  54. @PreAuthorize("hasAuthority('excel:down')")
  55. public void downloadExcel(String sql, String fileName, HttpServletResponse response) {
  56. sql = getAndCheckSql(sql);
  57. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  58. if (!CollectionUtils.isEmpty(list)) {
  59. Map<String, Object> map = list.get(0);
  60. String[] headers = new String[map.size()];
  61. int i = 0;
  62. for (String key : map.keySet()) {
  63. headers[i++] = key;
  64. }
  65. List<Object[]> datas = new ArrayList<>(list.size());
  66. for (Map<String, Object> m : list) {
  67. Object[] objects = new Object[headers.length];
  68. for (int j = 0; j < headers.length; j++) {
  69. objects[j] = m.get(headers[j]);
  70. }
  71. datas.add(objects);
  72. }
  73. ExcelUtil.excelExport(
  74. fileName == null || fileName.trim().length() <= 0 ? DigestUtils.md5Hex(sql) : fileName, headers,
  75. datas, response);
  76. }
  77. }
  78. @LogAnnotation
  79. @ApiOperation("根据sql在页面显示结果")
  80. @PostMapping("/show-datas")
  81. @PreAuthorize("hasAuthority('excel:show:datas')")
  82. public List<Object[]> showData(String sql) {
  83. sql = getAndCheckSql(sql);
  84. List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);
  85. if (!CollectionUtils.isEmpty(list)) {
  86. Map<String, Object> map = list.get(0);
  87. String[] headers = new String[map.size()];
  88. int i = 0;
  89. for (String key : map.keySet()) {
  90. headers[i++] = key;
  91. }
  92. List<Object[]> datas = new ArrayList<>(list.size());
  93. datas.add(headers);
  94. for (Map<String, Object> m : list) {
  95. Object[] objects = new Object[headers.length];
  96. for (int j = 0; j < headers.length; j++) {
  97. objects[j] = m.get(headers[j]);
  98. }
  99. datas.add(objects);
  100. }
  101. return datas;
  102. }
  103. return Collections.emptyList();
  104. }
  105. }