Java poi导出excel 将模板覆盖了

发布于 2021-12-08 21:30:49 字数 16389 浏览 909 评论 11

这是模板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("[|]", "rn");
                        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;
    }
 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

千笙结 2021-12-10 05:03:15

POI所有东西都要用代码精确控制,jxls适合做有规律性的表格,你这种情况用jxls会简单很多

高跟鞋的旋律 2021-12-10 05:03:12

这个做导出excel好用?

落墨 2021-12-10 05:03:08

如果是用模板的话,肯定比POI好用

泪冰清 2021-12-10 05:02:54

jxl的功能没有poi的强吧

冷弦 2021-12-10 05:02:39

已经解决了,先后移尾部,再导入数据就行了

终陌 2021-12-10 05:02:39

用jxls吧

掩饰不了的爱 2021-12-10 05:01:08

判断输出的数据如果大于模板的数据网格部分的行数就动态插入一行数据网格,这样就好了

明月松间行 2021-12-10 04:51:40

回复
谢谢了 但是以后的模板如果后面都有内容 那都要写在代码里面吗 这很费时间啊

输什么也不输骨气 2021-12-10 04:47:57

回复
@大河向东流啊 : 你觉得麻烦的话 你可以把表尾抽出来 导出数据处理完后把表尾数据加上去再写到文件里 业务就是这样 也不是很麻烦吧 因为一般都只定义表头 少有定义表尾的 你就把表尾理解成导出内容就好了

眼泪淡了忧伤 2021-12-10 04:43:26

回复
@大河向东流啊 : 已经解决,我是把要导入的数据取出来,然后先将尾部后移导入数据的行数,之后再导入数据就OK了

冷清清 2021-12-09 08:43:46

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文