POI导出设置复杂表头

先展示一下表头结构

工具类

  /*** 生成表格(用于生成复杂表头)* * @param sheetName sheet名称* @param wb 表对象* @param cellListMap 表头数据 {key=cellRowNum-1}* @param cellRowNum 表头总占用行数* @param exportData 行数据* @param rowMapper 单元格名称* @return* @throws Exception*/@SuppressWarnings({ "rawtypes", "unchecked" })public static SXSSFWorkbook createCSVUtil(String sheetName, SXSSFWorkbook wb, Map<String,List<CellModel>> cellListMap,Integer cellRowNum, List<LinkedHashMap> exportData)throws Exception {//设置表格名称SXSSFSheet sheet = (SXSSFSheet) wb.createSheet(sheetName);sheet.autoSizeColumn(1, true);XSSFCellStyle cellStyle = (XSSFCellStyle) wb.createCellStyle();//设置单元格内容水平对齐cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);//设置单元格内容垂直对齐cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);//设置自动换行cellStyle.setWrapText(true);for(int t = 0; t < cellRowNum; t++) {SXSSFRow row = (SXSSFRow) sheet.createRow(t);List<CellModel> cellNameList = cellListMap.get(String.valueOf(t));for (CellModel cellModel : cellNameList) {sheet.addMergedRegion(new CellRangeAddress(cellModel.getStartRow(),cellModel.getEndRow(), cellModel.getStartColumn(), cellModel.getEndColumn()));} for (int i = 0; i < cellNameList.size(); i++) {CellModel cellModel = cellNameList.get(i);// 遍历插入表头SXSSFCell cell = (SXSSFCell) row.createCell(cellModel.getStartColumn());cell.setCellValue(cellModel.getCellName());cell.setCellStyle(cellStyle);}}for (LinkedHashMap hashMap : exportData) {SXSSFRow rowValue = (SXSSFRow) sheet.createRow(cellRowNum);Iterator<Map.Entry> iteratorRow = hashMap.entrySet().iterator();while (iteratorRow.hasNext()) {Map.Entry entryRow = iteratorRow.next();Integer key = Integer.valueOf(entryRow.getKey().toString());String value = "";if (entryRow.getValue() != null) {value = entryRow.getValue().toString();} else {value = "";}SXSSFCell cellValue = (SXSSFCell) rowValue.createCell(key - 1);cellValue.setCellValue(value);cellValue.setCellStyle(cellStyle);}cellRowNum++;}return wb;}

辅助工具类

/*** 用于设置复杂表头* @author asus**/
public class CellModel {private String cellName;private Integer startRow;//起始行private Integer startColumn;//起始列private Integer endRow;//结束行private Integer endColumn;//结束列public String getCellName() {return cellName;}public void setCellName(String cellName) {this.cellName = cellName;}public Integer getStartRow() {return startRow;}public void setStartRow(Integer startRow) {this.startRow = startRow;}public Integer getStartColumn() {return startColumn;}public void setStartColumn(Integer startColumn) {this.startColumn = startColumn;}public Integer getEndRow() {return endRow;}public void setEndRow(Integer endRow) {this.endRow = endRow;}public Integer getEndColumn() {return endColumn;}public void setEndColumn(Integer endColumn) {this.endColumn = endColumn;}
}

表头数据信息及表格展示数据

//向指定的Excel中写入数据OutputStream out = null;//设置最大数据行数SXSSFWorkbook wb = new SXSSFWorkbook(5000);try {String tabName = "档案与资料利用情况统计表(查档目的)";Map<String,List<CellModel>> map = new HashMap<String,List<CellModel>>();// 设置数据List<CellModel> firstRow = new ArrayList<CellModel>();CellModel cellModel1 = new CellModel();//总占用3行Integer cellRow = 3;cellModel1.setCellName("查档目的");cellModel1.setStartRow(0);cellModel1.setEndRow(2);cellModel1.setStartColumn(0);cellModel1.setEndColumn(0);CellModel cellModel2 = new CellModel();cellModel2.setCellName("利用人次");cellModel2.setStartRow(0);cellModel2.setEndRow(2);cellModel2.setStartColumn(1);cellModel2.setEndColumn(1);CellModel cellModel3 = new CellModel();cellModel3.setCellName("提供档案(卷次)");cellModel3.setStartRow(0);cellModel3.setEndRow(2);cellModel3.setStartColumn(2);cellModel3.setEndColumn(2);CellModel cellModel4 = new CellModel();cellModel4.setCellName("提供档案(件)");cellModel4.setStartRow(0);cellModel4.setEndRow(2);cellModel4.setStartColumn(3);cellModel4.setEndColumn(3);CellModel cellModel5 = new CellModel();cellModel5.setCellName("提供资料(册)");cellModel5.setStartRow(0);cellModel5.setEndRow(2);cellModel5.setStartColumn(4);cellModel5.setEndColumn(4);CellModel cellModel6 = new CellModel();cellModel6.setCellName("复制(页)");cellModel6.setStartRow(0);cellModel6.setEndRow(0);cellModel6.setStartColumn(5);cellModel6.setEndColumn(9);firstRow.add(cellModel1);firstRow.add(cellModel2);firstRow.add(cellModel3);firstRow.add(cellModel4);firstRow.add(cellModel5);firstRow.add(cellModel6);map.put("0", firstRow);List<CellModel> secondRow = new ArrayList<CellModel>();CellModel cellModel7 = new CellModel();cellModel7.setCellName("合计");cellModel7.setStartRow(1);cellModel7.setEndRow(2);cellModel7.setStartColumn(5);cellModel7.setEndColumn(5);CellModel cellModel8 = new CellModel();cellModel8.setCellName("其中");cellModel8.setStartRow(1);cellModel8.setEndRow(1);cellModel8.setStartColumn(6);cellModel8.setEndColumn(9);secondRow.add(cellModel7);secondRow.add(cellModel8);map.put("1", secondRow);List<CellModel> thirdRow = new ArrayList<CellModel>();CellModel cellModel9 = new CellModel();cellModel9.setCellName("打印");cellModel9.setStartRow(2);cellModel9.setEndRow(2);cellModel9.setStartColumn(6);cellModel9.setEndColumn(6);CellModel cellModel10 = new CellModel();cellModel10.setCellName("复印");cellModel10.setStartRow(2);cellModel10.setEndRow(2);cellModel10.setStartColumn(7);cellModel10.setEndColumn(7);CellModel cellModel11 = new CellModel();cellModel11.setCellName("摘抄");cellModel11.setStartRow(2);cellModel11.setEndRow(2);cellModel11.setStartColumn(8);cellModel11.setEndColumn(8);CellModel cellModel12 = new CellModel();cellModel12.setCellName("拍摄");cellModel12.setStartRow(2);cellModel12.setEndRow(2);cellModel12.setStartColumn(9);cellModel12.setEndColumn(9);thirdRow.add(cellModel9);thirdRow.add(cellModel10);thirdRow.add(cellModel11);thirdRow.add(cellModel12);map.put("2", thirdRow);List<LinkedHashMap> exportData = new ArrayList<LinkedHashMap>();for (int i = 0; i < list.size(); i++) {WorkStatistics wk = list.get(i);LinkedHashMap<String, String> rowPut = new LinkedHashMap<String, String>();rowPut.put("1", wk.get());rowPut.put("2", wk.get());rowPut.put("3", wk.get());rowPut.put("4", wk.get());rowPut.put("5", wk.get());rowPut.put("6", wk.get());rowPut.put("7", wk.get());rowPut.put("8", wk.get());rowPut.put("9", wk.get());rowPut.put("10", wk.get());exportData.add(rowPut);}// 用于写入文件wb = ExcelUtils.createCSVUtil("查档目的",wb, map, cellRow, exportData);Date date = new Date();String sd = sdf.format(date);// 设置文件名,加上格式化的时间String excelName =tabName + sd + ".xlsx";String s_attachment = "attachment; filename=" + excelName;// 设置字符编码的格式s_attachment = new String(s_attachment.getBytes("gb2312"), "ISO8859-1");getResponse().setHeader("Content-disposition", s_attachment); // 设定输出文件头getResponse().setContentType("application/vnd.ms-excel");// 定义输出类型getResponse().setContentType("text/plain;charset=UTF-8");out = getResponse().getOutputStream();wb.write(out);out.flush();} catch (Exception e) {e.printStackTrace();} finally {if (out != null) {try {out.close();} catch (IOException e) {}}if (wb != null) {wb.dispose();}}

POI导出设置复杂表头相关推荐

  1. POI导出支持合并表头及单元格锁定的Excel

    1.开发前提 目前项目上有这样的需求,支持Excel导出后再线下调至后导入,并且有关键字及其他部分字段不支持修改,所以需要写保护,按正常的理解来讲锁定特定的列即可,但是需求中需要在Excel中添加行数 ...

  2. POI导出EXCEL设置高度和宽度

    -------------------------------------------------------------------------------SSFRow hssfRow = shee ...

  3. JAVA POI导出EXCEL设置自定义样式(线框加粗,合并指定行,合计求和,冻结行)

    前面部分是当时查询的记录: 实现Excel文件单元格合并.冻结和文件导出 Workbook wb = new HSSFWorkbook();Sheet sheet = wb.createSheet(& ...

  4. poi读取excel多层表头模板写入数据并导出

    poi读取excel多层表头模板写入数据并导出 这两天刚好写excel,写了一份自定义表头的,写了一份模板的,这里展示一份读取excel模板写入数据并导出的 //title excel的名称 head ...

  5. POI导出excel并设置单元格样式和单元格内容中文自适应

    本案例生产环境真是案例POI导出: 开发环境:idea+mybaits3+spring4+springmvc4+maven3+mysql5.7 poi依赖: <dependency>< ...

  6. JAVA导出Excel通用工具类——第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选、动态合并横向(纵向)单元格等多种复杂情况——保姆级别,真的不能再详细了,代码拿来即用)

    JAVA导出Excel通用工具--第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选.动态合并横向(纵向)单元格等多种复杂情况--保姆级别,真的不能再详细了,封装通用工具类,代码拿 ...

  7. 复杂的POI导出Excel表格(多行表头、合并单元格)

    poi导出excel有两种方式: 第一种:从无到有的创建整个excel,通过HSSFWorkbook,HSSFSheet HSSFCell, 等对象一步一步的创建出工作簿,sheet,和单元格,并添加 ...

  8. easy poi导出excel表头多语言

    原理:自定义一个注解,属性存放多个语言,运行时利用反射,根据选择的语言重新给@Excel的name属性赋值 1.自定义一个注解 @Retention(RetentionPolicy.RUNTIME) ...

  9. 使用poi导出excel生成复杂多级表头通用方法

    使用poi导出excel生成复杂多级表头通用方法 话不多说,直接上代码,需要用的的实体类如下 话不多说,直接上代码,需要用的的实体类如下 package com.test;public class U ...

最新文章

  1. 你和人工智能的对话,正在被人工收听
  2. BootstrapTable
  3. boost::mpl模块实现vector_c相关的测试程序
  4. 信号与系统 chapter9 关于信号与系统中微分方程的求解
  5. 01_jeecms建站
  6. 常见运行时异常 java 114982568
  7. 消息称Uber正洽谈出售旗下自动驾驶部门ATG给Aurora
  8. R 中同步进行的多组比较的包:npmc
  9. c语言kmeans算法具体步骤,k-均值聚类算法c语言版
  10. 看完这篇还不了解Nginx,你来找我!
  11. [Mac A]为什么国外程序员爱用 Mac?
  12. 【CF1467C】Three Bags 题解
  13. mysql secure_file_priv 属性相关的文件读写权限问题
  14. aiml php,chatbot:基于 AIML 的 PHP 聊天机器人
  15. Python数据分析之探索性分析(多因子复合分析)
  16. CRC校验中的“模2”除法运算流程图和图示
  17. 深度学习中GPU的作用
  18. 产品质量异常的正确处理流程
  19. 白加黑木马拆分HTTP协议躲避网络单包侦测
  20. Day12:股海浮沉-锦囊妙计

热门文章

  1. 大数据HDFS凭啥能存下百亿数据?
  2. c++ 箭头符号怎么打_C++语言中的标识符只能由字母、数字、下划线三种字符组成,且第一个字符_____。...
  3. (40)Verilog实现序列10111【状态机三段式】
  4. 利用jquery插件的图片剪切上传功能
  5. Unity配置文件xxx.ini
  6. 解决Python打开文件报错UnicodeDecodeError: 'gbk' codec can't decode byte
  7. NAS 详细搭建方案 - 安装Ubuntu Server
  8. 能在微信刷淘宝?淘宝可以用微信支付了?
  9. windows安装linux子系统,并装在其他系统盘的方法
  10. 石油大--2020年秋季组队训练赛第十二场----J、Greedy Termite(线段树)