NewExportUtils.java 7.0 KB

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