poi导出,设计导出excel样式,动态合并表头

1、前台组织数据

 $("input[name='import']").click(function(){
                    if($("#tableData tr").length>6){
                        //获取表头数据的长度
                        var columnNumber = $("#tableData tr:eq(6) td").length;
                          //定义表格表头
                          var columnName="";
                          for(var ii=0;ii<columnNumber;ii++){
                              columnName+=$("#tableData tr:eq(3) td:eq("+ii+")").text()+",";
                          }
                          //定义数据
                          var dataList="";
                          for(var dd=6;dd<$("#tableData tr").length;dd++){
                              for(var ss=0;ss<columnNumber;ss++){
                                  //判空处理
                                  if($("#tableData tr:eq("+dd+") td:eq("+ss+")").text()==""||$("#tableData tr:eq("+dd+") td:eq("+ss+")").text()==null){
                                      $("#tableData tr:eq("+dd+") td:eq("+ss+")").text("-");
                                  }
                                  //最后一条数据分隔标志:#@#
                                  if(ss==columnNumber-1){
                                      //各个居民以“#@#”隔开                              
                                      dataList+=$("#tableData tr:eq("+dd+") td:eq("+ss+")").text()+"#@#";
                                  }else{
                                      //各个居民对应的数据以“@#@”隔开
                                      dataList+=$("#tableData tr:eq("+dd+") td:eq("+ss+")").text()+"@#@";
                                  }
                              }
                          }
                          //数据总数(总行数)
                          var dataNumber = $("#tableData tr").length-6;
                          //获取总数量
                        jp.post("${ctx}/satistics/socialAssistanceInformation/import",{dataNum:dataNumber,number:columnNumber,title:columnName.substring(0,columnName.length-1),dat:dataList.substring(0,dataList.length-3),dqNumber:dqNum,fdqNumber:fdqNum},function(data){
                                if(data.success){
                                    jp.success(data.msg);
                                }else{
                                    alert(data.msg);    
                                };                        
                        });
                    }else{
                        jp.error("无数据,请先查询数据!");
                    }
              })

2、方法调用时将数据处理

 public AjaxJson importFile(HttpServletRequest request,HttpServletResponse response, RedirectAttributes redirectAttributes) throws Exception {
        AjaxJson j = new AjaxJson();
        String sheetName = "社会救助信息台账";
        String titleName = "全区困难群众社会救助信息统计台帐";
        String fileName = "社会救助信息台账";
        
        String dataNumber = request.getParameter("dataNum");//总数据行
        String columnNumbers = request.getParameter("number");//总数据列
        String columnNames = request.getParameter("title");//表头信息
        String dataLists = request.getParameter("dat");//总数据
        
        int dqNumber =  Integer.parseInt(request.getParameter("dqNumber"));//定期数量
        int fdqNumber =  Integer.parseInt(request.getParameter("fdqNumber"));//非定期数量
        
        //下载路径
        String downloadPath=Global.getConfig("downloadPath");
        
        //定义数据总数量(总行数)
        int dataNum= Integer.parseInt(dataNumber);
        //定义列数量(纵列数)
        int columnNumber = Integer.parseInt(columnNumbers);
        //定义列宽
        //int[] columnWidth = { 10, 20, 30 };
        //表头
        String[] columnName = columnNames.split(",");//前台传来由逗号隔开的字符串,转换为数组
        //数据
        //定义所有人数据的数组
        String[][] dataAll = new String[dataNum][columnNumber];
        //定义个人数据数组
        String [] data = null; 
            data=dataLists.split("#@#");
        for(int i=0;i<data.length;i++) {
            dataAll[i]=data[i].split("@#@");
        }
        String[][] dataList = dataAll;
        //导出结果
         j = ExportNoResponse(sheetName, titleName,dqNumber,fdqNumber,fileName,
                columnNumber, columnName, dataList,downloadPath);
        return j;
    }

3、重写poi 导出方法

/**

*sheetName  标签名

*titleName     总表头名

*dqNumber   定期救助占几列

*fdqNumber  非定期救助占几列

*fileName      导出时文件名

*columnNumber  数据总列数

*columnName 直接表头数组

*dataList          数据数组(数组中放数组;即外层数组行数据和内层数组列数据)

*downloadPath   下载路径

**/

public AjaxJson ExportNoResponse(String sheetName, String titleName,int dqNumber,int fdqNumber,
            String fileName, int columnNumber,String[] columnName, String[][] dataList,String downloadPath) throws Exception {
        AjaxJson aj = new AjaxJson();
        if (columnNumber == columnName.length) {
            // 第一步,创建一个webbook,对应一个Excel文件
            HSSFWorkbook wb = new HSSFWorkbook();
            // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
            HSSFSheet sheet = wb.createSheet(sheetName);
            //sheet.setDefaultColumnWidth(15); //统一设置列宽
            //自定义列宽
            for (int i = 0; i < columnNumber; i++) 
            {
                for (int j = 0; j <= i; j++) 
                {
                    if (i == j) {
                        if(i==5||i==4||i==6||i==10) {
                            sheet.setColumnWidth(i, 22 * 256);
                        }else if(i==8){
                            sheet.setColumnWidth(i, 35 * 256);
                        }else if(i==2||i==1||i==11){
                            sheet.setColumnWidth(i, 15 * 256);
                        }else {
                            sheet.setColumnWidth(i, 10 * 256); // 单独设置每列的宽
                        }
                    }
                }
            }
            
            // 创建第0行 也就是标题
            HSSFRow row1 = sheet.createRow((int) 0);
            row1.setHeightInPoints(50);// 设备标题的高度
            // 第三步创建标题的单元格样式style2以及字体样式headerFont1
            HSSFCellStyle style2 = wb.createCellStyle();
            style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            style2.setFillForegroundColor(HSSFColor.LIGHT_TURQUOISE.index);
            style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
            HSSFFont headerFont1 = (HSSFFont) wb.createFont(); // 创建字体样式
            headerFont1.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 字体加粗
            headerFont1.setFontName("黑体"); // 设置字体类型
            headerFont1.setFontHeightInPoints((short) 15); // 设置字体大小
            style2.setFont(headerFont1); // 为标题样式设置字体样式
 
            HSSFCell cell1 = row1.createCell(0);// 创建标题第一列
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0,
                    columnNumber - 1)); // 合并第0到第17列
            cell1.setCellValue(titleName); // 设置值标题
            cell1.setCellStyle(style2); // 设置标题样式
            
            //________________________第2行
            // 创建第3行 也就是标题
            HSSFRow rowb = sheet.createRow((int) 1);
            rowb.setHeightInPoints(30);// 设备标题的高度
            // 第三步创建标题的单元格样式styleb以及字体样式headerFontb
            HSSFCellStyle styleb = wb.createCellStyle();
            styleb.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            styleb.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
            
            HSSFFont headerFontb = (HSSFFont) wb.createFont(); // 创建字体样式
            headerFontb.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 字体加粗
            headerFontb.setFontName("黑体"); // 设置字体类型
            headerFontb.setFontHeightInPoints((short) 12); // 设置字体大小
            styleb.setFont(headerFontb); // 为标题样式设置字体样式
            
            HSSFCell cellb3 = rowb.createCell(3);    // 创建标题第3列
            sheet.addMergedRegion(new CellRangeAddress(1, 1, 3,6)); // 合并第3到6列
            cellb3.setCellValue("户主基本情况"); // 设置值标题
            cellb3.setCellStyle(styleb); // 设置标题样式
            
            HSSFCell cellb9 = rowb.createCell(9);    // 创建标题第9列
            sheet.addMergedRegion(new CellRangeAddress(1, 1, 9,13)); // 合并第9到13列
            cellb9.setCellValue("家庭成员基本情况"); // 设置值标题
            cellb9.setCellStyle(styleb); // 设置标题样式
            
            HSSFCell cellb14= rowb.createCell(14);    // 创建救助类型列
            sheet.addMergedRegion(new CellRangeAddress(1, 1, 14,14+dqNumber+fdqNumber-1)); 
            cellb14.setCellValue("享受社会救助情况(金额)"); // 设置值标题
            cellb14.setCellStyle(styleb); // 设置标题样式
            
            HSSFCell celljz= rowb.createCell(14+dqNumber+fdqNumber);    // 创建标题第9列
            sheet.addMergedRegion(new CellRangeAddress(1, 1, 14+dqNumber+fdqNumber,14+dqNumber+fdqNumber+4-1)); // 合并第9到13列
            celljz.setCellValue("人员类别"); // 设置值标题
            celljz.setCellStyle(styleb); // 设置标题样式
            
            HSSFCell celltsry= rowb.createCell(14+dqNumber+fdqNumber+4);    // 创建标题第9列
            sheet.addMergedRegion(new CellRangeAddress(1, 1, 14+dqNumber+fdqNumber+4,14+dqNumber+fdqNumber+4+7-1)); // 合并第9到13列
            celltsry.setCellValue("家庭成员中特殊人员情况"); // 设置值标题
            celltsry.setCellStyle(styleb); // 设置标题样式

        //_____________________第3行            
            // 创建第2行
            HSSFRow rowa = sheet.createRow((int) 2);
            rowa.setHeightInPoints(30);// 设备标题的高度
            
            HSSFCell cellhz = rowa.createCell(3);
            sheet.addMergedRegion(new CellRangeAddress(1, 2, 3,6)); 
            cellhz.setCellStyle(styleb);
            
            //定期定量救助类型
            if(dqNumber>0) {
                HSSFCell celldq = rowa.createCell(14);
                sheet.addMergedRegion(new CellRangeAddress(2, 2, 14,14+dqNumber-1)); 
                celldq.setCellValue("定期定量类救助"); // 设置值标题
                celldq.setCellStyle(styleb);
            }
            
            if(fdqNumber>0) {
                //非定期定量救助类型
                HSSFCell cellfdq = rowa.createCell(14+dqNumber);// 创建标题第9列
                sheet.addMergedRegion(new CellRangeAddress(2, 2, 14+dqNumber,14+dqNumber+fdqNumber-1)); 
                cellfdq.setCellValue("非定期定量类救助"); // 设置值标题
                cellfdq.setCellStyle(styleb);
            }
            
            HSSFCell cellcy = rowa.createCell(9);    // 创建标题第9列
            sheet.addMergedRegion(new CellRangeAddress(1, 2, 9,13)); 
            cellcy.setCellStyle(styleb);
            
            HSSFCell cellrylb= rowa.createCell(14+dqNumber+fdqNumber);    
            sheet.addMergedRegion(new CellRangeAddress(1, 2, 14+dqNumber+fdqNumber,14+dqNumber+fdqNumber+4-1)); // 合并第9到13列
            cellrylb.setCellStyle(styleb);
            
            HSSFCell celltsqk= rowa.createCell(14+dqNumber+fdqNumber+4);    // 创建标题第9列
            sheet.addMergedRegion(new CellRangeAddress(1, 2, 14+dqNumber+fdqNumber+4,14+dqNumber+fdqNumber+4+7-1)); // 合并第9到13列
            celltsqk.setCellStyle(styleb);
            
            HSSFCell cellfirst= rowa.createCell(0);
            sheet.addMergedRegion(new CellRangeAddress(1, 2, 0,0)); 
            HSSFCell cellsecond= rowa.createCell(1);
            sheet.addMergedRegion(new CellRangeAddress(1, 2, 1,1)); 
            HSSFCell cellthird= rowa.createCell(2);
            sheet.addMergedRegion(new CellRangeAddress(1, 2, 2,2)); 
            HSSFCell celleight= rowa.createCell(7);
            sheet.addMergedRegion(new CellRangeAddress(1, 2, 7,7)); 
            HSSFCell cellnine= rowa.createCell(8);
            sheet.addMergedRegion(new CellRangeAddress(1, 2, 8,8)); 
            HSSFCell celllast= rowa.createCell(columnNumber-1);
            sheet.addMergedRegion(new CellRangeAddress(1, 2, columnNumber-1,columnNumber-1)); 
            HSSFCell celllastago= rowa.createCell(columnNumber-2);
            sheet.addMergedRegion(new CellRangeAddress(1, 2, columnNumber-2,columnNumber-2)); 
            
            // 创建表头
            HSSFRow row = sheet.createRow((int) 3);
            row.setHeightInPoints(37);// 设置表头高度
 
            // 第四步,创建表头单元格样式 以及表头的字体样式
            HSSFCellStyle style = wb.createCellStyle();
            style.setWrapText(true);// 设置自动换行
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
            style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 创建一个居中格式
 
            /*style.setBottomBorderColor(HSSFColor.BLACK.index);
            style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
            style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
            style.setBorderRight(HSSFCellStyle.BORDER_THIN);
            style.setBorderTop(HSSFCellStyle.BORDER_THIN);*/
 
            HSSFFont headerFont = (HSSFFont) wb.createFont(); // 创建字体样式
            headerFont.setFontName("黑体"); // 设置字体类型
            headerFont.setFontHeightInPoints((short) 10); // 设置字体大小
            style.setFont(headerFont); // 为标题样式设置字体样式
 
            // 第四.一步,创建表头的列
            for (int i = 0; i < columnNumber; i++) 
            {
                HSSFCell cell = row.createCell(i);
                cell.setCellValue(columnName[i]);
                cell.setCellStyle(style);
            }
            
            
            // 第五步,创建单元格,并设置值
            for (int i = 0; i < dataList.length; i++) 
            {
                row = sheet.createRow((int) i + 4);
                //设置数据行固定行高
                row.setHeightInPoints(25);
                // 为数据内容设置特点新单元格样式1 自动换行 上下居中
                HSSFCellStyle zidonghuanhang = wb.createCellStyle();
                zidonghuanhang.setWrapText(true);// 设置自动换行
                // 为数据内容设置特点新单元格样式2 自动换行 上下居中左右也居中
                HSSFCellStyle zidonghuanhang2 = wb.createCellStyle();
                zidonghuanhang2.setWrapText(true);// 设置自动换行
                zidonghuanhang2
                        .setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 创建一个上下居中格式
                zidonghuanhang2.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
 
                HSSFCell datacell = null;
                for (int j = 0; j < columnNumber; j++) 
                {
                    datacell = row.createCell(j);
                    datacell.setCellValue(dataList[i][j]);
                    datacell.setCellStyle(zidonghuanhang2);
                }
            }
            
            HSSFRow rowLast = sheet.createRow(4+dataList.length);
            rowLast.setHeightInPoints(25);// 设备标题的高度
            HSSFCellStyle styleLastRow = wb.createCellStyle();
            styleLastRow.setAlignment(HSSFCellStyle.ALIGN_RIGHT);     //居右
            styleLastRow.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 创建一个居中格式
            HSSFFont lastRowFont = (HSSFFont) wb.createFont(); // 创建字体样式
            lastRowFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 字体加粗
            styleLastRow.setFont(lastRowFont); // 为标题样式设置字体样式
            
            HSSFCell cellLast = rowLast.createCell(0);
            sheet.addMergedRegion(new CellRangeAddress(4+dataList.length, 4+dataList.length, 0,columnNumber-1)); 
            cellLast.setCellValue("制表人:  "+UserUtils.getUser().getName()+"  制表时间: "+DateUtils.getDateTime()+"  ");
            cellLast.setCellStyle(styleLastRow);
            
            // 第六步,将文件存到指定位置
                String curTime = DateUtils.getDate("-yyyyMMddHHmmss");
            try {
                FileOutputStream fout = new FileOutputStream(downloadPath+fileName+curTime+".xlsx");
                wb.write(fout);
                aj.setSuccess(true);
                aj.setMsg("导出" + fileName + "成功!");
                fout.close();
            } catch (Exception e) {
                //捕捉异常信息
                e.printStackTrace();
                aj.setSuccess(false);
                aj.setMsg("导出" + fileName + "失败! \n失败原因:"+e.getMessage());
            }
        } else {
            aj.setSuccess(false);
            aj.setMsg("列数目长度名称三个数组长度要一致");
        }
        return aj;
    }

猜你喜欢

转载自blog.csdn.net/Mrlon123/article/details/81391652