HSSFWorkbook xssfWorkbook = new HSSFWorkbook(); //创建工作表对象
         Sheet sheet = xssfWorkbook.createSheet(); //创建工作表
         HSSFCellStyle columnTopStyle = this.getColumnTopStyle(xssfWorkbook);// 获取列头样式对象
         columnTopStyle.setWrapText(true);
         HSSFCellStyle cellStyle = xssfWorkbook.createCellStyle();//新建单元格样式
       
         //边框
         cellStyle.setBorderBottom(BorderStyle.THIN);; //下边框  
         cellStyle.setBorderLeft(BorderStyle.THIN);//左边框  
         cellStyle.setBorderTop(BorderStyle.THIN);//上边框  
         cellStyle.setBorderRight(BorderStyle.THIN);//右边框
         HSSFCellStyle style = this.getStyle(xssfWorkbook); // 获取单元格样式对象
         
         sheet.addMergedRegion(new CellRangeAddress(1, 3, 0, 0));//0--8
         sheet.addMergedRegion(new CellRangeAddress(1, 3, 1, 1));//9--14
         sheet.addMergedRegion(new CellRangeAddress(1, 3, 2, 2));//15--20
         
         
         
         Row bthead = sheet.createRow(1);
         
         cyly.add("当月合计");
         
         Row bt = sheet.createRow(2);// 产生表格标题行
         
         Cell cellhead2 = bt.createCell(0);
         cellhead2.setCellStyle(cellStyle); //style为带边框的样式 上面有定义
         cellhead2.setCellValue("");
         
         Cell createCell = bt.createCell(1);
         createCell.setCellStyle(cellStyle); //style为带边框的样式 上面有定义
         createCell.setCellValue("");
         
    	 
         Row bt3 = sheet.createRow(3);
         Cell cellhead3 = bt3.createCell(0);
         cellhead3.setCellStyle(cellStyle); //style为带边框的样式 上面有定义
         cellhead3.setCellValue("");
         
         
         Cell createCell2 = bt3.createCell(1);
         createCell2.setCellStyle(cellStyle); //style为带边框的样式 上面有定义
         createCell2.setCellValue("");
         
         
         
         int t1 = 0;
         int t2 = 0;
         int t3 = 0;
         for (int i = 0; i < cyly.size(); i++) {
        	 
        	 t1 = (i+1)*3;
        	 t2 = (i+1)*3+1;
        	 t3 = (i+2)*3-1;
        	 
        	 sheet.addMergedRegion(new CellRangeAddress(2, 2, t1,t3 ));
        	 Cell cell = bt.createCell(t1);
        	 cell.setCellType(CellType.STRING); // 设置列头单元格的数据类型
        	 cell.setCellStyle(columnTopStyle); // 设置列头单元格样式
        	 HSSFRichTextString text = new HSSFRichTextString(cyly.get(i));
        	 cell.setCellValue(text);
        	 
        	 
        	 Cell createCell3 = bt.createCell(t2);
        	 createCell3.setCellStyle(cellStyle); //style为带边框的样式 上面有定义
        	 createCell3.setCellValue("");
        	 
        	 
        	 Cell createCell4 = bt.createCell(t3);
        	 createCell4.setCellStyle(cellStyle); //style为带边框的样式 上面有定义
        	 createCell4.setCellValue("");
        	 
        	 
        	 Cell cellSl = bt3.createCell(t1);
        	 cellSl.setCellType(CellType.STRING); // 设置列头单元格的数据类型
        	 cellSl.setCellStyle(columnTopStyle); // 设置列头单元格样式
        	 HSSFRichTextString textSl = new HSSFRichTextString("专利预审服务受理(件)");
        	 cellSl.setCellValue(textSl);
        	 
        	 
        	 Cell cellHg = bt3.createCell(t2);
        	 cellHg.setCellType(CellType.STRING); // 设置列头单元格的数据类型
        	 cellHg.setCellStyle(columnTopStyle); // 设置列头单元格样式
        	 HSSFRichTextString textHg = new HSSFRichTextString("专利预审合格量(件)");
        	 cellHg.setCellValue(textHg);
        	 
        	 
        	 Cell cellSq = bt3.createCell(t3);
        	 cellSq.setCellType(CellType.STRING); // 设置列头单元格的数据类型
        	 cellSq.setCellStyle(columnTopStyle); // 设置列头单元格样式
        	 HSSFRichTextString textSq = new HSSFRichTextString("专利授权量(件)");
        	 cellSq.setCellValue(textSq);
         }
         
         //t3表示预审服务量的最后一列
         sheet.addMergedRegion(new CellRangeAddress(1, 1, 3, t3));
         sheet.addMergedRegion(new CellRangeAddress(1, 1, t3+1, t3+2));
         for (int n = 0; n < rowName.length; n++) {
        	 
        	 Cell cellRowName = null;
        	 if(n==4) {
        		 cellRowName = bthead.createCell(t3+1);
        	 }else {
        		 cellRowName = bthead.createCell(n); // 创建列头对应个数的单元格
        	 }
        	 
             cellRowName.setCellType(CellType.STRING); // 设置列头单元格的数据类型   
             cellRowName.setCellStyle(columnTopStyle); // 设置列头单元格样式
             HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
             cellRowName.setCellValue(text); // 设置列头单元格的值
         }
         
         
         
         
         Cell createCell3 = bthead.createCell(t3+2);
         createCell3.setCellStyle(cellStyle); //style为带边框的样式 上面有定义
         createCell3.setCellValue("");
         
         Cell createCell4 = bt3.createCell(t3+2);
         createCell4.setCellStyle(cellStyle); //style为带边框的样式 上面有定义
         createCell4.setCellValue("");
          
         //标题
         sheet.addMergedRegion(new CellRangeAddress(0,0,0,t3+2));  //36  
         Row head = sheet.createRow(0);
         head.setHeight((short) 750);	//设置表格标题的高度
         Cell cellhead = head.createCell(0);
         cellhead.setCellType(CellType.STRING); // 设置列头单元格的数据类型   
         cellhead.setCellStyle(columnTopStyle);
         HSSFRichTextString texthead = new HSSFRichTextString(title);
         cellhead.setCellValue(texthead);
         
         for (int j = 1; j <= t3+2; j++) {
        	 cellhead = head.createCell(j);
        	 cellhead.setCellStyle(cellStyle); //style为带边框的样式 上面有定义
        	 cellhead.setCellValue("");
         }
         
         
         
         //预审周期
         sheet.addMergedRegion(new CellRangeAddress(2, 3, t3+1, t3+1));
         sheet.addMergedRegion(new CellRangeAddress(2, 3, t3+2, t3+2));
         Cell cell = bt.createCell(t3+1);
         cell.setCellType(CellType.STRING); // 设置列头单元格的数据类型
    	 cell.setCellStyle(columnTopStyle); // 设置列头单元格样式
    	 HSSFRichTextString text = new HSSFRichTextString("当月平均预审周期(天)");
    	 cell.setCellValue(text);
         
    	 Cell cell2 = bt.createCell(t3+2);
         cell2.setCellType(CellType.STRING); // 设置列头单元格的数据类型
    	 cell2.setCellStyle(columnTopStyle); // 设置列头单元格样式
    	 HSSFRichTextString text2 = new HSSFRichTextString("预审周期超7个工作日案件量(件)");
    	 cell2.setCellValue(text2);
    	 
    	 Row btXj = null;
    	 int n = 0;
    	 int m = 0;
    	 for (int j = 0; j < dataList.size(); j++) {
    		 n = (j+1)*4;
    		 m = (j+2)*4-1;
    		 
    		 sheet.addMergedRegion(new CellRangeAddress(n, m, 0, 0));
    		 sheet.addMergedRegion(new CellRangeAddress(n, m, t3+1, t3+1));
    		 Row btFm = sheet.createRow(n);
    		 Cell cellMot = btFm.createCell(0);
    		 cellMot.setCellType(CellType.STRING); // 设置列头单元格的数据类型
    		 cellMot.setCellStyle(columnTopStyle); // 设置列头单元格样式
    		 
    		 //当月平均预审周期(天)	
    		 Cell cellAvg = btFm.createCell(t3+1);
    		 cellAvg.setCellType(CellType.STRING); // 设置列头单元格的数据类型
    		 cellAvg.setCellStyle(columnTopStyle); // 设置列头单元格样式
    		 HSSFRichTextString textAvg = new HSSFRichTextString(dataList.get(j).getAvg());
    		 cellAvg.setCellValue(textAvg);
    		 
    		 
    		 HSSFRichTextString textMot = null;
    		 String[] start = startM.split("-");
 			 String[] end = endM.split("-");
 			 if(start[0].equals(end[0])) {
 				String mc = dataList.get(j).getMc();
 				textMot = new HSSFRichTextString(mc.split("年")[1]);
 			 }else {
 				textMot = new HSSFRichTextString(dataList.get(j).getMc());
 			 }
    		 
    		 cellMot.setCellValue(textMot);
    		 
    		 
    		 Cell cellFm = btFm.createCell(1);
    		 cellFm.setCellType(CellType.STRING); // 设置列头单元格的数据类型
    		 cellFm.setCellStyle(columnTopStyle); // 设置列头单元格样式
    		 HSSFRichTextString textFm = new HSSFRichTextString("发明");
    		 cellFm.setCellValue(textFm);
    		 
    		 
    		 Row btSyxx = sheet.createRow(n+1);
    		 Cell cellSyxx = btSyxx.createCell(1);
    		 cellSyxx.setCellType(CellType.STRING); // 设置列头单元格的数据类型
    		 cellSyxx.setCellStyle(columnTopStyle); // 设置列头单元格样式
    		 HSSFRichTextString textSyxx = new HSSFRichTextString("实用新型");
    		 cellSyxx.setCellValue(textSyxx);
    		 
    		 
    		 Row btWg = sheet.createRow(n+2);
    		 Cell cellWg = btWg.createCell(1);
    		 cellWg.setCellType(CellType.STRING); // 设置列头单元格的数据类型
    		 cellWg.setCellStyle(columnTopStyle); // 设置列头单元格样式
    		 HSSFRichTextString textWg = new HSSFRichTextString("外观设计");
    		 cellWg.setCellValue(textWg);
    		 
    		 
    		 btXj = sheet.createRow(n+3);
    		 Cell cellXj = btXj.createCell(1);
    		 cellXj.setCellType(CellType.STRING); // 设置列头单元格的数据类型
    		 cellXj.setCellStyle(columnTopStyle); // 设置列头单元格样式
    		 HSSFRichTextString textXj = new HSSFRichTextString("小计");
    		 cellXj.setCellValue(textXj);
    		 
    		 
    		 List<IppcYsMonthWorkTjTwoResponse> data = dataList.get(j).getData();
    		 for (int i = 0; i < data.size(); i++) {
    			 List<String> list = data.get(i).getData();
    			 
    			 for (int k = 0; k < list.size(); k++) {
					if(i==0) {
						Cell cellFmNum = btFm.createCell(2+k);
						cellFmNum.setCellType(CellType.STRING); // 设置列头单元格的数据类型
						cellFmNum.setCellStyle(columnTopStyle); // 设置列头单元格样式
						HSSFRichTextString textFmNum = new HSSFRichTextString(list.get(k));
						cellFmNum.setCellValue(textFmNum);
					}else if(i==1) {
						Cell cellSyxxNum = btSyxx.createCell(2+k);
						cellSyxxNum.setCellType(CellType.STRING); // 设置列头单元格的数据类型
						cellSyxxNum.setCellStyle(columnTopStyle); // 设置列头单元格样式
						HSSFRichTextString textSyxxNum = new HSSFRichTextString(list.get(k));
						cellSyxxNum.setCellValue(textSyxxNum);
					}else if(i==2) {
						Cell cellWgNum = btWg.createCell(2+k);
						cellWgNum.setCellType(CellType.STRING); // 设置列头单元格的数据类型
						cellWgNum.setCellStyle(columnTopStyle); // 设置列头单元格样式
						HSSFRichTextString textWgNum = new HSSFRichTextString(list.get(k));
						cellWgNum.setCellValue(textWgNum);
					}else if(i==3) {
						Cell cellXjNum = btXj.createCell(2+k);
						cellXjNum.setCellType(CellType.STRING); // 设置列头单元格的数据类型
						cellXjNum.setCellStyle(columnTopStyle); // 设置列头单元格样式
						HSSFRichTextString textXjNum = new HSSFRichTextString(list.get(k));
						cellXjNum.setCellValue(textXjNum);
					}
    			 }
    			 
    			//预审周期超7个工作日案件量(件)
    			 if(i==0) {
        			 Cell cellOver7 = btFm.createCell(t3+2);
            		 cellOver7.setCellType(CellType.STRING); // 设置列头单元格的数据类型
            		 cellOver7.setCellStyle(columnTopStyle); // 设置列头单元格样式
            		 HSSFRichTextString textOver7 = new HSSFRichTextString(data.get(i).getOver7());
            		 cellOver7.setCellValue(textOver7);
    			 }else if(i==1) {
            		 Cell cellOver7Syxxs = btSyxx.createCell(t3+2);
            		 cellOver7Syxxs.setCellType(CellType.STRING); // 设置列头单元格的数据类型
            		 cellOver7Syxxs.setCellStyle(columnTopStyle); // 设置列头单元格样式
            		 HSSFRichTextString textOver7Syxxs = new HSSFRichTextString(data.get(i).getOver7());
            		 cellOver7Syxxs.setCellValue(textOver7Syxxs);
    			 }else if(i==2) {
            		 Cell cellOver7Wgs = btWg.createCell(t3+2);
            		 cellOver7Wgs.setCellType(CellType.STRING); // 设置列头单元格的数据类型
            		 cellOver7Wgs.setCellStyle(columnTopStyle); // 设置列头单元格样式
            		 HSSFRichTextString textOver7Wgs = new HSSFRichTextString(data.get(i).getOver7());
            		 cellOver7Wgs.setCellValue(textOver7Wgs);
    			 }else if(i==3) {
            		 Cell cellOver7Xjs = btXj.createCell(t3+2);
            		 cellOver7Xjs.setCellType(CellType.STRING); // 设置列头单元格的数据类型
            		 cellOver7Xjs.setCellStyle(columnTopStyle); // 设置列头单元格样式
            		 HSSFRichTextString textOver7Xjs = new HSSFRichTextString(data.get(i).getOver7());
            		 cellOver7Xjs.setCellValue(textOver7Xjs);
    			 }
    		 }
    	 
    	 }
    	 
    	 
    	 Cell createCell5 = btXj.createCell(0);
    	 createCell5.setCellStyle(cellStyle); //style为带边框的样式 上面有定义
    	 createCell5.setCellValue("");
    	 
         
    	 Cell createCell6 = btXj.createCell(t3+1);
    	 createCell6.setCellStyle(cellStyle); //style为带边框的样式 上面有定义
    	 createCell6.setCellValue("");
    	 
    	 
    	 
    	 // 设置字体
         HSSFFont font = xssfWorkbook.createFont();
         // 设置字体大小
         font.setFontHeightInPoints((short) 11);
         // 字体加粗
         font.setBold(true);
         // 设置字体名字
         font.setFontName("Courier New");
    	 
    	 
    	 HSSFCellStyle styles = xssfWorkbook.createCellStyle();
    	 styles.setAlignment(HorizontalAlignment.LEFT);
    	 styles.setFont(font);
    	 sheet.addMergedRegion(new CellRangeAddress(m+1, m+1, 0, 12));
    	 Row createRow = sheet.createRow(m+1);
    	 Cell createCell7 = createRow.createCell(0);
    	 createCell7.setCellType(CellType.STRING); // 设置列头单元格的数据类型
    	 createCell7.setCellStyle(styles); // 设置列头单元格样式
		 HSSFRichTextString textJS = new HSSFRichTextString("xxxxxxxxxxxxxxxxxxx");
		 createCell7.setCellValue(textJS);
    	 
		 
		 sheet.addMergedRegion(new CellRangeAddress(m+2, m+2, 0, 12));
		 Row createRow2 = sheet.createRow(m+2);
		 Cell createCell8 = createRow2.createCell(0);
		 createCell8.setCellType(CellType.STRING); // 设置列头单元格的数据类型
		 createCell8.setCellStyle(styles); // 设置列头单元格样式
		 HSSFRichTextString textSL = new HSSFRichTextString("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
		 createCell8.setCellValue(textSL);
		 
		 
		 sheet.addMergedRegion(new CellRangeAddress(m+3, m+3, 0, 12));
		 Row createRow3 = sheet.createRow(m+3);
		 Cell createCell9 = createRow3.createCell(0);
		 createCell9.setCellType(CellType.STRING); // 设置列头单元格的数据类型
		 createCell9.setCellStyle(styles); // 设置列头单元格样式
		 HSSFRichTextString textHG = new HSSFRichTextString("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
		 createCell9.setCellValue(textHG);
		 
		 
		 sheet.addMergedRegion(new CellRangeAddress(m+4, m+4, 0, 12));
		 Row createRow4 = sheet.createRow(m+4);
		 Cell createCell10 = createRow4.createCell(0);
		 createCell10.setCellType(CellType.STRING); // 设置列头单元格的数据类型
		 createCell10.setCellStyle(styles); // 设置列头单元格样式
		 HSSFRichTextString textSQ = new HSSFRichTextString("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
		 createCell10.setCellValue(textSQ);
		 
		 
		 sheet.addMergedRegion(new CellRangeAddress(m+5, m+5, 0, 12));
		 Row createRow5 = sheet.createRow(m+5);
		 Cell createCell11 = createRow5.createCell(0);
		 createCell11.setCellType(CellType.STRING); // 设置列头单元格的数据类型
		 createCell11.setCellStyle(styles); // 设置列头单元格样式
		 HSSFRichTextString textZQ = new HSSFRichTextString("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
		 createCell11.setCellValue(textZQ);
		 
		 
		 
    	 
    	 sheet.createFreezePane(0, 4, 0, 4);//冻结
    	 
    	 for (int j = 3; j <= t3+2; j++) {
    		 sheet.setColumnWidth(j, 10*256);
    	 }
    	 
    	 sheet.setDefaultColumnWidth(10);
           
         
         xssfWorkbook.write(out);
效果图

java与前端 java与前端实现动态表头_excel

核心代码

其中最核心的代码如下:

HSSFWorkbook xssfWorkbook = new HSSFWorkbook(); //创建工作表对象
Sheet sheet = xssfWorkbook.createSheet(); //创建工作表

HSSFCellStyle styles = xssfWorkbook.createCellStyle();
styles.setAlignment(HorizontalAlignment.LEFT);
styles.setFont(font);


//通过下面这两行就可以锁定到具体的单元格了,之后就可以对其进行设置字体、样式等。
Row createRow5 = sheet.createRow(m+5);//创建行,其中参数为要创建的行数,从0开始算
Cell createCell11 = createRow5.createCell(0);//创建列,其中参数为要创建的列数,从0开始算


createCell11.setCellType(CellType.STRING); // 设置列头单元格的数据类型
createCell11.setCellStyle(styles); // 设置列头单元格样式
HSSFRichTextString textZQ = new HSSFRichTextString("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
createCell11.setCellValue(textZQ);//向单元格中存值

大体思路就是通过sheet对象创建对应的行,再通过行创建对应的列,然后就可以存值了。

如果想设置样式,可以通过createCellStyle()先获取样式对象,之后就可以通过该对象设置想要的样式。如上面的styles.setAlignment(HorizontalAlignment.LEFT);styles.setFont(font);。其中font是字体。

想要的样式创建好后,就可以通过createCell11.setCellStyle(styles);方法来设置对应的样式了。

其中还有冻结createFreezePane()、合并单元格sheet.addMergedRegion(new CellRangeAddress(m+5, m+5, 0, 12));等方法可以通过官方文档或者查阅资料来获得。