使用poi导出excel合并表头

朱雀 2020-10-14 12:17 1133阅读 0赞

一、js代码

  1. $("body").on("click", "#btn_print", function () {
  2. assessRankQueryPrint();
  3. });
  4. function assessRankQueryPrint(){
  5. var value_columns1 = ["考核年度","被考核人员","单位","岗位","专职","第一季度","第一季度","第二季度","第二季度","第三季度","第三季度","第四季度","第四季度","备注"];
  6. var key_columns2 = ["year_","name_user","name_org","name_postduty","label","info01","info02","info04","info05","info07","info08","info10","info11","remarks"];
  7. var value_columns2 = ["考核年度","被考核人员","单位","岗位","专职","考核得分","本周期岗位排名","考核得分","本周期岗位排名","考核得分","本周期岗位排名","考核得分","本周期岗位排名","备注"];
  8. var url = "jee/VAssessQuarterRankQueryC/exportExecl?key_columns2="+key_columns2+"&value_columns1="+value_columns1+"&value_columns2="+value_columns2;
  9. window.location.href= url;
  10. }

二、后台代码

(1)controller

  1. @RequestMapping(value="jee/VAssessQuarterRankQueryC")
  2. @Controller
  3. public class VAssessQuarterRankQueryController extends BaseEntityController<VAssessQuarterRankQuery>{
  4. public VAssessQuarterRankQueryController(){
  5. super(VAssessQuarterRankQuery.class);
  6. }
  7. @Resource
  8. private VAssessQuarterRankQueryService vAssessQuarterRankQueryService;
  9. @ResponseBody
  10. @SystemControllerLog(description="考核结果排名查询--导出功能")
  11. @RequestMapping(value="exportExecl")
  12. public ReturnDatas exportExecl(String[] key_columns2,String[] value_columns1,String[] value_columns2,HttpServletResponse response){
  13. ReturnDatas returnDatas = ReturnDatas.getSuccessReturnDatas();
  14. try {
  15. response.setCharacterEncoding("UTF-8");
  16. response.setContentType("application/msexcle");
  17. response.setHeader("content-disposition", "attachment;filename=test.xlsx");
  18. HSSFWorkbook workbook = vAssessQuarterRankQueryService.exportExecl(key_columns2,value_columns1,value_columns2);
  19. //写入Excel文件
  20. OutputStream outputStream = response.getOutputStream();
  21. workbook.write(outputStream);
  22. outputStream.close();
  23. returnDatas.setStatus(ReturnDatas.SUCCESS);
  24. return returnDatas;
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. LogUtil.error("考核结果排名查询--导出功能异常:"+e.getMessage(),e);
  28. returnDatas.setStatus(ReturnDatas.ERROR);
  29. returnDatas.setMessage("考核结果排名查询--导出功能异常。");
  30. }
  31. return returnDatas;
  32. }
  33. }

(2)service

  1. @Service("vAssessQuarterRankQueryService")
  2. public class VAssessQuarterRankQueryServiceImpl implements VAssessQuarterRankQueryService {
  3. private List<VAssessQuarterRankQuery> list;
  4. @Resource
  5. private IbaseInfoService baseInfoService;
  6. /**
  7. *
  8. * @Description 考核结果排名查询--查询操作
  9. * @param rows
  10. * @param page
  11. * @param sort
  12. * @param order
  13. * @param key
  14. * @param year_
  15. * @param id_postduty
  16. * @param label
  17. * @return PageResult
  18. * @throws Exception
  19. *
  20. */
  21. @Override
  22. public PageResult listAllVAssessQuarterRankQuery(int rows, int page, String sort, String order, String key, String year_, String id_postduty, String label) throws Exception {
  23. List<Object> ls_param = new ArrayList<Object>();
  24. String hql = "select u from VAssessQuarterRankQuery u where (del_flag is null or del_flag != '1')";
  25. String hqlCount = "select count(*) from VAssessQuarterRankQuery u where (del_flag is null or del_flag != '1')";
  26. if (StringUtils.isBlank(key)) {
  27. key = "";
  28. }
  29. if (StringUtils.isNotBlank(key)) {
  30. hql += " and ( instr(type,?) > 0 or instr(updateuser,?)>0 or instr(updatetime,?)>0 )";
  31. hqlCount += " and ( instr(type,?) > 0 or instr(updateuser,?)>0 or instr(updatetime,?)>0 )";
  32. ls_param.add(key);
  33. ls_param.add(key);
  34. ls_param.add(key);
  35. }
  36. if (StringUtils.isNotBlank(year_)) {
  37. year_ = year_.substring(0,4);
  38. hql += " and year_ = ?";
  39. hqlCount += " and year_ = ?";
  40. ls_param.add(year_);
  41. }
  42. if (StringUtils.isNotBlank(label)) {
  43. hql += " and soleduty_type = ?";
  44. hqlCount += " and soleduty_type = ?";
  45. ls_param.add(label);
  46. }
  47. if (StringUtils.isNotBlank(id_postduty)) {
  48. hql += " and id_postduty = ?";
  49. hqlCount += " and id_postduty = ?";
  50. ls_param.add(id_postduty);
  51. }
  52. if (StringUtils.isNotBlank(sort) && StringUtils.isNotBlank(order)) {
  53. hql += " order by " + sort + " " + order;
  54. }
  55. list = baseInfoService.listQueryByHql(hql, ls_param, rows, page);
  56. Object total = baseInfoService.getObjectByHql(hqlCount, ls_param);
  57. PageResult result = new PageResult();
  58. if (list != null) {
  59. result.setRows(list);
  60. if (total != null) {
  61. result.setTotal(Integer.parseInt(total.toString()));
  62. } else {
  63. result.setTotal(0);
  64. }
  65. }
  66. return result;
  67. }
  68. /**
  69. *
  70. * @Description 考核结果排名查询--导出功能
  71. * @param key_columns
  72. * @param value_columns
  73. * @return HSSFWorkbook
  74. * @throws Exception
  75. *
  76. */
  77. @Override
  78. public HSSFWorkbook exportExecl(String[] key_columns1,String[] value_columns1,String[] value_columns2) throws Exception {
  79. List<List<String>> list1 = new ArrayList<>(); //所有单元格数据
  80. List<String> list4 = new ArrayList<>(); //需要排名的字段
  81. list4.add("info02");
  82. list4.add("info05");
  83. list4.add("info08");
  84. list4.add("info11");
  85. for (VAssessQuarterRankQuery v : list) {
  86. List<String> list2 = new ArrayList<>(); //每一行数据
  87. for (int i = 0; i < key_columns1.length; i++) {
  88. String field = ExportUtil.getFiled(v, key_columns1[i]);
  89. if(list4.contains(key_columns1[i])){
  90. String filed = key_columns1[i].replace("info", "");
  91. String total_person = "0";
  92. if(filed.matches("\\d+")) {//判断能否转为数字
  93. int f = Integer.parseInt(filed);
  94. String info = "info";
  95. if(f<10){
  96. info += 0;
  97. }
  98. total_person = ExportUtil.getFiled(v, info+(f+1));
  99. }
  100. if(StringUtils.isBlank(field)||"0".equals(field)) {
  101. list2.add("--/--");
  102. }else if("0".equals(total_person)) {
  103. list2.add("--/--");
  104. }else {
  105. list2.add(field+"/"+total_person);
  106. }
  107. }else {
  108. list2.add(field);
  109. }
  110. }
  111. list1.add(list2);
  112. }
  113. List<Integer[]> list3 = new ArrayList<>(); //要合并的行和列
  114. Integer[] array1 = {0, 1, 0, 0};
  115. Integer[] array2 = {0, 1, 1, 1};
  116. Integer[] array3 = {0, 1, 2, 2};
  117. Integer[] array4 = {0, 1, 3, 3};
  118. Integer[] array5 = {0, 1, 4, 4};
  119. Integer[] array6 = {0, 0, 5, 6};
  120. Integer[] array7 = {0, 0, 7, 8};
  121. Integer[] array8 = {0, 0, 9, 10};
  122. Integer[] array9 = {0, 0, 11, 12};
  123. Integer[] array10 = {0, 1, 13, 13};
  124. list3.add(array1);
  125. list3.add(array2);
  126. list3.add(array3);
  127. list3.add(array4);
  128. list3.add(array5);
  129. list3.add(array6);
  130. list3.add(array7);
  131. list3.add(array8);
  132. list3.add(array9);
  133. list3.add(array10);
  134. return ExportUtil.exportCell("季度考核成绩排名",key_columns1,value_columns1,value_columns2,list1,list3);
  135. }
  136. }

(3)导出工具类

  1. public class ExportUtil {
  2. public static HSSFWorkbook exportCell(String sheetName,String[] key_columns2,String[] value_columns1,String[] value_columns2,List<List<String>> list,List<Integer[]> list3){
  3. //创建一个Excel文件
  4. HSSFWorkbook workbook = new HSSFWorkbook();
  5. //创建一个工作表
  6. HSSFSheet sheet = workbook.createSheet(sheetName);
  7. //添加表头行
  8. HSSFRow hssfRow = sheet.createRow(0);
  9. //设置单元格格式
  10. HSSFCellStyle cellStyle = workbook.createCellStyle();
  11. //设置单元格边框
  12. cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  13. cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
  14. cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
  15. cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  16. cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平居中
  17. cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); //垂直居中
  18. for (int i = 0; i < value_columns1.length; i++) {
  19. //添加表头内容
  20. HSSFCell headCell = hssfRow.createCell(i);
  21. headCell.setCellValue(value_columns1[i]);
  22. headCell.setCellStyle(cellStyle);
  23. }
  24. hssfRow = sheet.createRow(1);
  25. for (int i = 0; i < value_columns2.length; i++) {
  26. //添加表头内容
  27. HSSFCell headCell = hssfRow.createCell(i);
  28. headCell.setCellValue(value_columns2[i]);
  29. headCell.setCellStyle(cellStyle);
  30. }
  31. for (Integer[] arr : list3) {//合并表头
  32. sheet.addMergedRegion(new CellRangeAddress(arr[0], arr[1], arr[2], arr[3]));
  33. }
  34. //把数据添加到excel
  35. for (int i = 0; i < list.size(); i++) {
  36. hssfRow = sheet.createRow(i + 2);
  37. for (int j = 0; j < list.get(i).size(); j++) {
  38. //创建单元格,并设置值
  39. HSSFCell cell = hssfRow.createCell(j);
  40. cell.setCellValue(list.get(i).get(j));
  41. cell.setCellStyle(cellStyle);
  42. }
  43. }
  44. return workbook;
  45. }
  46. /**
  47. *
  48. * @Date 2018年6月15日 下午1:53:52
  49. * @Description 利用反射获取get方法
  50. * @Fcunction getFiled
  51. * @param object
  52. * @param field
  53. * @return String
  54. *
  55. */
  56. public static String getFiled(Object object, String field) {
  57. Class<? extends Object> clazz = object.getClass();
  58. PropertyDescriptor pd = null;
  59. Method getMethod = null;
  60. try {
  61. pd = new PropertyDescriptor(field, clazz);
  62. if (null != pd) {
  63. // 获取field 属性 的get方法
  64. getMethod = pd.getReadMethod();
  65. Object invoke = getMethod.invoke(object);
  66. if(invoke==null) {
  67. invoke = "";
  68. }
  69. return invoke.toString();
  70. }
  71. } catch (Exception e) {
  72. e.printStackTrace();
  73. }
  74. return "";
  75. }
  76. }

注:合并导org.apache.poi.ss.util.CellRangeAddress包,org.apache.poi.hssf.util.CellRangeAddress包已废弃;

  1. import org.apache.poi.ss.util.CellRangeAddress;

合并addMergedRegion方法四个属性分别是(开始行,结束行,开始列,结束列)

  1. sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 1));

发表评论

表情:
评论列表 (有 0 条评论,1133人围观)

还没有评论,来说两句吧...

相关阅读

    相关 使用POI导出Excel

    > 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、导入依赖 二、使用步骤 1.编写工具类

    相关 使用POI导出Excel

    > 这次是参与一个老项目的维护工作,在测试的过程中发现有一个遗留的bug,数据导出时,当列超过256时,则超出的数据无法正常导出显示。查了一些资料才知道原来项目中使用的`jxl