Java poi导出excel 将模板覆盖了

大河向东流啊 发布于 2017/09/19 17:14
阅读 877
收藏 1

这是模板excel:

 

但是导出数据之后就变成这样了:

求高手解决。

 

导出excel的方法如下:

public static Sheet export(Workbook workbook, ExportConfiguration exportConfiguration, ExportDataVo exportDataVo, int sheetIndex, int startIndex, int lIndex, String sheetName) throws Exception {
        Sheet sheet = workbook.cloneSheet(0);
        workbook.setSheetOrder(sheet.getSheetName(), sheetIndex);
        int list_data_row = exportConfiguration.getList_data_row();
        Boolean summry_bold = exportConfiguration.getSummry_bold();
        int add_row_mode = exportConfiguration.getAdd_row_mode();
        List dataList = exportDataVo.getDataList();
        Integer multiple = exportConfiguration.getMultiple();
        Integer space = exportConfiguration.getSpace();
        
        workbook.setSheetName(sheetIndex, sheetName);
        writeSheetHead(exportDataVo, sheet);
        Object summryBean = null;
        boolean unadd = true;
        Font summryFont = null;
        
        int count=0;
        if(dataList !=null){
            for (int i=0, rowIndex=list_data_row; i<dataList.size(); i++, rowIndex++) {
                Object object = dataList.get(i);
                
                if (rowIndex > list_data_row && add_row_mode == 2) {
                    sheet.shiftRows(rowIndex, rowIndex+2, 1, true, false);
                }
                Row row = sheet.getRow(rowIndex);
                if (row == null) {
                    sheet.shiftRows(rowIndex, dataList.size(), 1);
                    row = sheet.createRow(rowIndex);
                    if (rowIndex > list_data_row) {
                        row.setHeightInPoints(sheet.getRow(list_data_row).getHeightInPoints());
                    }
                }
                Field[] fieldArr = object.getClass().getDeclaredFields();
                for (Field field : fieldArr) {
                    ExportColumn exportIndex = field.getAnnotation(ExportColumn.class);
                    if (exportIndex == null) {
                        continue;
                    }
                    String fieldName = field.getName();
                    int columnIndex = exportIndex.index();
                    int lastIndex = exportIndex.lastIndex();
                    boolean lastRow = exportIndex.lastRow();
                    String summry = exportIndex.summry();
                    boolean hasEnter = exportIndex.hasEnter();
                    CellStyle cellStyle = sheet.getRow(list_data_row).getCell(columnIndex).getCellStyle();
                    if (summryFont == null) {
                        summryFont = workbook.createFont();
                        Font oldFont = workbook.getFontAt(cellStyle.getFontIndex());
                        summryFont.setFontName(oldFont.getFontName());
                        summryFont.setFontHeightInPoints(oldFont.getFontHeightInPoints());
                        summryFont.setBold(true);
                    }
                    AbstractExportModel abstractExportModel = (AbstractExportModel) object;
                    boolean isSummryRow = abstractExportModel.isSummryRow();
                    if(StringUtils.isNotBlank(summry) && rowIndex == list_data_row) {
                        summryBean = summryBean == null ? object.getClass().newInstance() : summryBean;
                        BeanUtils.setProperty(summryBean, fieldName, summry);
                        BeanUtils.setProperty(summryBean, "summryRow", true);
                    } 
                    String value = BeanUtils.getProperty(object, fieldName);
                   
                    if (isSummryRow && StringUtils.isNotBlank(value) && value.contains("%s")) {
                        value = String.format(value, TextUtil.toChineseNum(sheetIndex));
                    }
                    boolean isTotal = exportIndex.isTotal();
                    if (isTotal && !isSummryRow) {
                        if (rowIndex == list_data_row && summryBean == null) {
                            summryBean = object.getClass().newInstance();
                            BeanUtils.setProperty(summryBean, "summryRow", true);
                        }
                        if (StringUtils.isNotBlank(value)) {
                            addationTotalValue(summryBean, fieldName, value);
                        }
                    }
                    Cell cell = row.getCell(columnIndex);
                    if(cell == null) {
                        cell = row.createCell(columnIndex);
                    }
                    
                    if (lastIndex > -1 && !ExcelUtil.isMerge(sheet, rowIndex, columnIndex)) {
                        CellRangeAddress cra = new CellRangeAddress(rowIndex, rowIndex, columnIndex, lastIndex);
                        sheet.addMergedRegion(cra);
                        setRegionStyle(cellStyle, cra, sheet);
                    } else {
                        cell.setCellStyle(cellStyle);
                    }
                    if (lastRow&&count-i==0) {
                        count=0;
                        for (int j=0; j<dataList.size(); j++) {
                            Object obj = dataList.get(j);
                            String fieldName1 = fieldName;
                            String value2 = BeanUtils.getProperty(obj, fieldName1);
                            if(value.equals(value2)){
                                count++;
                            }
                        }
                        if(count>1){
                            CellRangeAddress cra =new CellRangeAddress(rowIndex, rowIndex+count-1, 0, 0);
                            sheet.addMergedRegion(cra);
                            setRegionStyle(cellStyle, cra, sheet);
                            count=count+i;
                        }else{
                            count=i+1;
                        }
                    } else {
                        cell.setCellStyle(cellStyle);
                    }
                    addSummryStyle(isSummryRow, workbook, summry_bold, cell, summryFont);
                    
                    if (hasEnter && StringUtils.isNotBlank(value)) {
                        int length = TextUtil.count(value, "[|]");
                        if (value.endsWith("|")) {
                            length --;
                        }
                        value = value.replaceAll("[|]", "\r\n");
                        if (length > 1) {
                            cell.getCellStyle().setWrapText(true);
                        }
                    } 
                    setCellValue(object, fieldName, value, cell);
                }
                
                if (i == dataList.size() -1 && summryBean != null && unadd) {
                    dataList.add(summryBean);
                    unadd = false;
                }
                //
            }
        }
        
        if(multiple != null && multiple ==2){
            int lastIndex = sheet.getLastRowNum();
            int rowCount = lastIndex + 1;
            float hp = sheet.getRow(lastIndex).getHeightInPoints();
            for(int i=1; i<space; i++){
                sheet.createRow(lastIndex+i).setHeightInPoints(hp);
            }
            int offset = lastIndex + space + 1;
            for(int i=0; i<rowCount; i++){
                sheet.createRow(offset + i);
            }
            
            //合并区域创建
            mergerRegion(sheet, offset);
            
            //复制内容
            for(int i=0; i<rowCount; i++){
                copyRow(workbook, sheet, sheet.getRow(i), sheet.getRow(offset+i), true);
            }
        }
        
        return sheet;
    }
 

加载中
0
K老
K老

这是没办法的  就这样写下去覆盖了。 两个办法 一个是把被覆盖的不放在模板里  放在代码里  导出的时候按顺序写进去,不然就导出的时候 先把被覆盖的读在内存里,写完要导出的内容后再加进去

大河向东流啊
大河向东流啊
回复 @大河向东流啊 : 已经解决,我是把要导入的数据取出来,然后先将尾部后移导入数据的行数,之后再导入数据就OK了
K老
K老
回复 @大河向东流啊 : 说起大河向东流 让我想起了一首歌 “大河向东流啊,XX的鸡鸡没龟头啊” 我们以前都这么唱的 哈哈
K老
K老
回复 @大河向东流啊 : 你觉得麻烦的话 你可以把表尾抽出来 导出数据处理完后把表尾数据加上去再写到文件里 业务就是这样 也不是很麻烦吧 因为一般都只定义表头 少有定义表尾的 你就把表尾理解成导出内容就好了
大河向东流啊
大河向东流啊
回复@K老 : 谢谢了 但是以后的模板如果后面都有内容 那都要写在代码里面吗 这很费时间啊
0
C
CallMain
判断输出的数据如果大于模板的数据网格部分的行数就动态插入一行数据网格,这样就好了
大河向东流啊
大河向东流啊
已经解决了,先后移尾部,再导入数据就行了
0
夜苍狼
大河向东流啊
大河向东流啊
jxl的功能没有poi的强吧
夜苍狼
夜苍狼
如果是用模板的话,肯定比POI好用
开源中国首席罗纳尔多
开源中国首席罗纳尔多
这个做导出excel好用?
0
夜苍狼
夜苍狼
POI所有东西都要用代码精确控制,jxls适合做有规律性的表格,你这种情况用jxls会简单很多
返回顶部
顶部