ExportUtils.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package com.kingdee.shr.customer.gtiit.util;
  2. import java.sql.Date;
  3. import java.sql.SQLException;
  4. import java.util.LinkedHashMap;
  5. import java.util.List;
  6. import java.util.stream.Collectors;
  7. import javax.servlet.http.HttpServletResponse;
  8. import org.apache.log4j.Logger;
  9. import org.apache.poi.xssf.usermodel.XSSFCell;
  10. import org.apache.poi.xssf.usermodel.XSSFCellStyle;
  11. import org.apache.poi.xssf.usermodel.XSSFRow;
  12. import org.apache.poi.xssf.usermodel.XSSFSheet;
  13. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  14. import org.apache.poi.ss.usermodel.DataFormat;
  15. import java.io.IOException;
  16. import java.io.OutputStream;
  17. import java.io.UnsupportedEncodingException;
  18. import java.net.URLEncoder;
  19. import com.kingdee.jdbc.rowset.IRowSet;
  20. /**
  21. *
  22. * @author lang
  23. * 导出工具类
  24. */
  25. public class ExportUtils {
  26. private static Logger logger = Logger.getLogger("com.kingdee.shr.customer.gtiit.util.ExportUtils");
  27. /**
  28. *
  29. * @param response
  30. * response
  31. * @param resource
  32. * 需要导出的数据源
  33. * @param fileName
  34. * 导出文件名称
  35. * @param selectFieldsTypeMap
  36. * 存放查询字段对应导出类型和导出样式 key selectField 导出字段 value
  37. * fieldType_cellStyleMap key 导出查询字段 value 导出类型_导出样式 导出样式 key
  38. * DateType 日期格式 value "yyyy-mm-dd" key NumberType 数字 value '0.0_
  39. * '->保留一位小数 '0_ '->整数 key StringType 文本 value @
  40. * @throws SQLException
  41. */
  42. public static void exportData(HttpServletResponse response, Object resource, String fileName,
  43. LinkedHashMap<String, String> selectFieldsTypeMap) throws SQLException {
  44. // 创建新的Excel 工作簿
  45. // Excel2003版本(包含2003)以前使用HSSFWorkbook类,扩展名为.xls
  46. // Excel2007版本(包含2007)以后使用XSSFWorkbook类,扩展名为.xlsx
  47. XSSFWorkbook workBook = new XSSFWorkbook();
  48. // 在Excel工作簿中创建新的工作表,名为"Sheet1"
  49. XSSFSheet sheet = workBook.createSheet("Sheet1");
  50. DataFormat format =workBook.createDataFormat();
  51. // 设置数字格式为整数,不保留小数 (_ )空格是必须要切勿格式
  52. if (resource != null) {
  53. if (resource instanceof IRowSet) {
  54. IRowSet rs = (IRowSet) resource;
  55. // 列数
  56. int numColumns = selectFieldsTypeMap.entrySet().size();
  57. // 创建多行多列的数据
  58. int i = 0;
  59. // 创建标题
  60. XSSFRow titleRow = sheet.createRow(i);
  61. List<String> keyList = selectFieldsTypeMap.keySet().stream().collect(Collectors.toList());
  62. if (i == 0) {
  63. for (int j = 0; j < numColumns; j++) {
  64. // 创建列
  65. XSSFCell cell = titleRow.createCell(j);
  66. cell.setCellValue(keyList.get(j));
  67. }
  68. }
  69. i++;
  70. // 创建数据
  71. while (rs.next()) {
  72. try {
  73. XSSFRow dateRow = sheet.createRow(i);
  74. for (int j = 0; j < numColumns; j++) {
  75. XSSFCellStyle style = workBook.createCellStyle();
  76. // 创建列
  77. XSSFCell cell = dateRow.createCell(j);
  78. // 由于开发与测试环境的数据库类型与不一致 导致无法从数据库表读取相关字段类型判断 且有相关计算字段
  79. // 所以采用参数判断
  80. String column = keyList.get(j);
  81. String fieldTypeAndcellStyleType = selectFieldsTypeMap.get(column);
  82. int indexOf = fieldTypeAndcellStyleType.indexOf("_");
  83. // 字段属性类型
  84. String fieldType = fieldTypeAndcellStyleType.substring(0, indexOf);
  85. // 样式类型
  86. String cellStyleType = fieldTypeAndcellStyleType.substring(indexOf + 1, fieldTypeAndcellStyleType.length());
  87. if ("Date".equals(fieldType)) {
  88. // 日期
  89. Date date = rs.getDate(column);
  90. style.setDataFormat(format.getFormat(cellStyleType));
  91. cell.setCellStyle(style);
  92. cell.setCellValue(date);
  93. } else if ("Number".equals(fieldType)) {
  94. // 数值 (小数和整数)
  95. style.setDataFormat(format.getFormat(String.format(cellStyleType, " ")));
  96. String value = rs.getString(column);
  97. cell.setCellStyle(style);
  98. if (cellStyleType.contains(".")) {
  99. // 小数
  100. cell.setCellValue(Double.parseDouble(value));
  101. } else {
  102. cell.setCellValue(Integer.parseInt(value));
  103. }
  104. } else if ("String".equals(fieldType)) {
  105. // 文本类型
  106. // style.setDataFormat(format.getFormat(cellStyleType));
  107. // cell.setCellStyle(style);
  108. cell.setCellValue(rs.getString(column));
  109. }
  110. }
  111. i++;
  112. } catch (Exception e) {
  113. System.out.println();
  114. logger.info("Excel file was created Error!" + e.getMessage());
  115. }
  116. }
  117. try {
  118. setResponseHeader(response, fileName);
  119. OutputStream os = response.getOutputStream();
  120. workBook.write(os);
  121. workBook.close();
  122. os.flush();
  123. os.close();
  124. logger.info("Excel file was created successfully!");
  125. } catch (IOException e) {
  126. logger.info("Error while writing to file " + e.getMessage());
  127. e.printStackTrace();
  128. }
  129. }
  130. }
  131. }
  132. public static void setResponseHeader(HttpServletResponse response, String fileName) {
  133. try {
  134. try {
  135. fileName = URLEncoder.encode(fileName, "UTF-8");
  136. } catch (UnsupportedEncodingException e) {
  137. e.printStackTrace();
  138. }
  139. response.setContentType("application/octet-stream;charset=UTF-8");
  140. response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
  141. response.addHeader("Pargam", "no-cache");
  142. response.addHeader("Cache-Control", "no-cache");
  143. } catch (Exception ex) {
  144. ex.printStackTrace();
  145. }
  146. }
  147. }