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;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Apache POI库来导出动态表头Excel文件。首先,你需要创建一个Workbook对象,然后创建一个Sheet对象。接下来,你可以使用Row和Cell对象创建行和单元格,并设置相应的值。 下面是一个示例代码,演示如何使用Apache POI导出具有动态表头Excel文件: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; import java.util.List; public class ExcelExporter { public static void main(String[] args) { List<String> headers = Arrays.asList("Header 1", "Header 2", "Header 3"); // 动态表头 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Sheet1"); // 创建表头行 Row headerRow = sheet.createRow(0); for (int i = 0; i < headers.size(); i++) { Cell headerCell = headerRow.createCell(i); headerCell.setCellValue(headers.get(i)); } // 创建数据行 // 假设有两行数据 List<List<String>> data = Arrays.asList( Arrays.asList("Data 1", "Data 2", "Data 3"), Arrays.asList("Data 4", "Data 5", "Data 6") ); int rowIndex = 1; // 数据行索引从1开始 for (List<String> rowData : data) { Row dataRow = sheet.createRow(rowIndex++); for (int i = 0; i < rowData.size(); i++) { Cell dataCell = dataRow.createCell(i); dataCell.setCellValue(rowData.get(i)); } } // 保存Excel文件 try (FileOutputStream outputStream = new FileOutputStream("output.xlsx")) { workbook.write(outputStream); System.out.println("Excel导出成功!"); } catch (IOException e) { e.printStackTrace(); } } } ``` 在上面的示例中,我们使用了XSSFWorkbook类来创建一个Excel文件,并创建了一个名为"Sheet1"的工作表。然后,我们根据动态表头创建了表头行,并使用循环创建了数据行。最后,我们将工作簿写入输出流,并保存为名为"output.xlsx"的文件。 你可以根据自己的需求修改表头和数据,然后使用上述代码来导出具有动态表头Excel文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值