ExcelUtils2.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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. List<? extends List<?>> newList = Lists.partition(list, 5000);
  58. for (List<?> objects : newList) {
  59. excelWriter.fill(objects, writeSheet);
  60. }
  61. if (!data.isEmpty()) {
  62. excelWriter.fill(data, writeSheet);
  63. }
  64. long t5 = System.currentTimeMillis();
  65. excelWriter.finish();
  66. outputStream.flush();
  67. logger.info("size==="+is.available());
  68. logger.info("excelWriter time:" + (t5- t4));
  69. } catch (IOException e) {
  70. e.printStackTrace();
  71. throw new RuntimeException(e);
  72. } finally {
  73. try {
  74. resp.getOutputStream().close();
  75. } catch (IOException e) {
  76. e.printStackTrace();
  77. }
  78. }
  79. logger.info("export time:" + (System.currentTimeMillis() - begin));
  80. }
  81. /**
  82. * 实体模型导出
  83. * @param response 响应类
  84. * @param modelClass 实体类型
  85. * @param fileName 文件名
  86. * @param sheetName sheet名
  87. * @param dataList 数据
  88. */
  89. @SneakyThrows
  90. public static void easyDownload(HttpServletResponse response, Class<?> modelClass, String fileName, String sheetName, List<?> dataList) {
  91. response.setContentType("application/vnd.ms-excel");
  92. response.setCharacterEncoding("utf-8");
  93. response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
  94. EasyExcel.write(response.getOutputStream(), modelClass).sheet(sheetName).doWrite(dataList);
  95. }
  96. public static <T> List<T> easyImport(MultipartFile file, Integer head, Class<T> modelClass){
  97. InputStream io = null;
  98. try {
  99. io = file.getInputStream();
  100. SyncReadListener listener = new SyncReadListener();
  101. EasyExcel.read(io, modelClass, listener).sheet().headRowNumber(head).doRead();
  102. return (List<T>)listener.getList();
  103. }catch (IOException e){
  104. return Collections.emptyList();
  105. }
  106. finally {
  107. IOUtils.closeQuietly(io);
  108. }
  109. }
  110. private static ResourceLoader resourceLoader;
  111. @Override
  112. public void setResourceLoader(ResourceLoader resourceLoader) {
  113. setResourceLoader0(resourceLoader);
  114. }
  115. private static void setResourceLoader0(ResourceLoader resourceLoader) {
  116. ExcelUtils2.resourceLoader = resourceLoader;
  117. }
  118. ExcelUtils2() {
  119. }
  120. }