ExcelUtils2.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package com.poteviohealth.cgp.statistics.utils;
  2. import com.alibaba.excel.EasyExcel;
  3. import com.alibaba.excel.ExcelWriter;
  4. import com.alibaba.excel.event.SyncReadListener;
  5. import com.alibaba.excel.write.metadata.WriteSheet;
  6. import com.google.common.collect.Lists;
  7. import lombok.SneakyThrows;
  8. import org.apache.commons.io.IOUtils;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import org.springframework.context.ResourceLoaderAware;
  12. import org.springframework.context.annotation.Lazy;
  13. import org.springframework.core.io.Resource;
  14. import org.springframework.core.io.ResourceLoader;
  15. import org.springframework.stereotype.Component;
  16. import org.springframework.web.multipart.MultipartFile;
  17. import javax.servlet.http.HttpServletResponse;
  18. import java.io.IOException;
  19. import java.io.InputStream;
  20. import java.io.OutputStream;
  21. import java.net.URLEncoder;
  22. import java.util.Collections;
  23. import java.util.List;
  24. import java.util.Map;
  25. @Lazy(false)
  26. @Component
  27. public class ExcelUtils2 implements ResourceLoaderAware {
  28. private static Logger logger = LoggerFactory.getLogger(ExcelUtils2.class);
  29. /**
  30. * excel文件的导出下载
  31. *
  32. * @param templateLocation excel模板文件位置,格式参见org.springframework.core.io.ResourceLoader#getResource方法注释
  33. * @param data excel模板需要的单项数据
  34. * @param list excel模板需要的列表数据
  35. * @param filename 给浏览器端下载的文件名
  36. * @param resp 响应类
  37. * @see ResourceLoader#getResource(String)
  38. */
  39. public static void easyDownload(String templateLocation, Map<String, Object> data, List<?> list, String filename,
  40. HttpServletResponse resp) {
  41. Resource template = resourceLoader.getResource(templateLocation);
  42. resp.setHeader("Content-Type", "application/vnd.ms-excel; charset=utf-8");
  43. try {
  44. resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
  45. } catch (Exception e) {
  46. throw new RuntimeException(e);
  47. }
  48. long begin = System.currentTimeMillis();
  49. try {
  50. InputStream is = template.getInputStream();
  51. OutputStream outputStream = resp.getOutputStream();
  52. ExcelWriter excelWriter = EasyExcel.write(outputStream).withTemplate(is).build();
  53. is.close();
  54. WriteSheet writeSheet = EasyExcel.writerSheet().build();
  55. // 直接写入数据
  56. long t4 = System.currentTimeMillis();
  57. if (list.size()<=5000){
  58. excelWriter.fill(list, writeSheet);
  59. }else {
  60. List<? extends List<?>> newList = Lists.partition(list, 5000);
  61. for (List<?> objects : newList) {
  62. excelWriter.fill(objects, writeSheet);
  63. }
  64. }
  65. if (!data.isEmpty()) {
  66. excelWriter.fill(data, writeSheet);
  67. }
  68. long t5 = System.currentTimeMillis();
  69. excelWriter.finish();
  70. outputStream.flush();
  71. logger.info("excelWriter time:" + (t5- t4));
  72. } catch (IOException e) {
  73. e.printStackTrace();
  74. throw new RuntimeException(e);
  75. } finally {
  76. try {
  77. resp.getOutputStream().close();
  78. } catch (IOException e) {
  79. e.printStackTrace();
  80. }
  81. }
  82. logger.info("export time:" + (System.currentTimeMillis() - begin));
  83. }
  84. /**
  85. * 实体模型导出
  86. * @param response 响应类
  87. * @param modelClass 实体类型
  88. * @param fileName 文件名
  89. * @param sheetName sheet名
  90. * @param dataList 数据
  91. */
  92. @SneakyThrows
  93. public static void easyDownload(HttpServletResponse response, Class<?> modelClass, String fileName, String sheetName, List<?> dataList) {
  94. response.setContentType("application/vnd.ms-excel");
  95. response.setCharacterEncoding("utf-8");
  96. response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
  97. EasyExcel.write(response.getOutputStream(), modelClass).sheet(sheetName).doWrite(dataList);
  98. }
  99. public static <T> List<T> easyImport(MultipartFile file, Integer head, Class<T> modelClass){
  100. InputStream io = null;
  101. try {
  102. io = file.getInputStream();
  103. SyncReadListener listener = new SyncReadListener();
  104. EasyExcel.read(io, modelClass, listener).sheet().headRowNumber(head).doRead();
  105. return (List<T>)listener.getList();
  106. }catch (IOException e){
  107. return Collections.emptyList();
  108. }
  109. finally {
  110. IOUtils.closeQuietly(io);
  111. }
  112. }
  113. private static ResourceLoader resourceLoader;
  114. @Override
  115. public void setResourceLoader(ResourceLoader resourceLoader) {
  116. setResourceLoader0(resourceLoader);
  117. }
  118. private static void setResourceLoader0(ResourceLoader resourceLoader) {
  119. ExcelUtils2.resourceLoader = resourceLoader;
  120. }
  121. ExcelUtils2() {
  122. }
  123. }