poi操作excel,复制sheet,复制行,复制单元格,复制style

这篇博客讲述了在Java中使用Apache POI操作Excel时,如何复制Sheet、行以及单元格的同时保留样式。作者在解决复制过程中遇到的问题,如避免创建重复的Style导致错误,提出了在相同或不同Workbook中复制Style的解决方案,并分享了未测试的初步代码,最终在升级POI版本后成功解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

缘起

最近写一个程序,需要操作excel,遂稍微深入了解下poi从操作,

在需要复制一个sheet的时候,找到三份资料

问题

如果在copy一个cell的时候,需要把样式也copy过去,怎么办,会怎样呢?

如果像第三份资料中所做,会创建太多的style,而这些style又是重复的 ,毫无意义,数据多了还报错

如果像第二份资料中所做,前提是同一个workbook,也不存在copy style 的问题,只不过是不同的cell引用相同的style而已

如果像第一份资料所做,他自己都注释掉了,因为报错

如何解决

思路

  • 相同的book中,不需要copy
  • 不同的book中,styleTable应该不一致,copy的时候,在目标book中创建,最后返回两个book中的style index的映射关系

代码

暂时没测试过,写出来就迫不及待要分享了。

import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Workbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 提供常用excel操作<br>
 *     <ul>
 *         <li></li>
 *     </ul>
 */
public class ExcelOperationUtil {
    private static Logger logger = LoggerFactory.getLogger(ExcelOperationUtil.class);
    
    /**
     * 把一个excel中的styleTable复制到另一个excel中
     * @return StyleMapping 两个文件中styleTable的映射关系
     * @see StyleMapping
     */
    public static StyleMapping copyCellStyle(Workbook srcBook, Workbook desBook){
        if (null == srcBook || null == desBook) {
            throw new ExcelExecption("源excel 或 目标excel 不存在");
        }
        if (srcBook.equals(desBook)) {
            throw new ExcelExecption("不要使用此方法在同一个文件中copy style");
        }

        logger.debug("src中style number:{}, des中style number:{}", srcBook.getNumCellStyles(), desBook.getNumCellStyles());
        short[] src2des = new short[srcBook.getNumCellStyles()];
        short[] des2src = new short[desBook.getNumCellStyles() + srcBook.getNumCellStyles()];

        for(short i=0;i<srcBook.getNumCellStyles();i++){
            //建立双向映射
            CellStyle srcStyle = srcBook.getCellStyleAt(i);
            CellStyle desStyle = desBook.createCellStyle();
            src2des[srcStyle.getIndex()] = desStyle.getIndex();
            des2src[desStyle.getIndex()] = srcStyle.getIndex();

            //复制样式
            desStyle.cloneStyleFrom(srcStyle);
        }

        return new StyleMapping(des2src, src2des);
    }

    /**
     * 存放两个excel文件中的styleTable的映射关系,以便于在复制表格时,在目标文件中获取到对应的样式
     */
    public static class StyleMapping {
        /**
         *
         */
        private short[] des2srcIndexMapping;
        /**
         *
         */
        private short[] src2desIndexMapping;

        /**
         * 不允许其他类创建此类型对象
         */
        private StyleMapping() {
        }

        private StyleMapping(short[] des2srcIndexMapping, short[] src2desIndexMapping) {
            this.des2srcIndexMapping = des2srcIndexMapping;
            this.src2desIndexMapping = src2desIndexMapping;
        }

        public short srcIndex(short desIndex) {
            if (desIndex < 0 ||
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值