Java POI (3)—— Excel单元格复制过程中公式不生效的问题

这篇具有很好参考价值的文章主要介绍了Java POI (3)—— Excel单元格复制过程中公式不生效的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、出现问题的原因

在实现Excel中单元格的复制功能实现上,之前的代码是这样写的

/**
     * copyCellValue() 方法用于将源单元格的值复制到目标单元格中。
     * @param sourceCell 是源单元格对象
     * @param destCell 是目标单元格对象
     */
    public static void copyCellValue(Cell sourceCell, Cell destCell) {
        // 如果 sourceCell 和 destCell 中任意一个为 null,则不进行操作,方法直接返回。
        if (sourceCell == null || destCell == null) {
            return;
        }
        // 首先,将源单元格的单元格样式克隆到目标单元格上,然后再将源单元格的值赋给目标单元格。
        CellStyle sourceStyle = sourceCell.getCellStyle();
        CellStyle destinationStyle = destCell.getSheet().getWorkbook().createCellStyle();
        destinationStyle.cloneStyleFrom(sourceStyle);
        destCell.setCellStyle(destinationStyle);
        // 如果源单元格的数据类型为字符串类型,则复制字符串值;如果为布尔类型,则复制布尔值;如果为公式类型,则复制公式字符串;如果为数字类型,则复制数字值。
        if (sourceCell.getCellTypeEnum().equals(CellType.STRING)) {

            destCell.setCellValue(sourceCell.getStringCellValue());

        } else if (sourceCell.getCellTypeEnum().equals(CellType.BOOLEAN)) {

            destCell.setCellValue(sourceCell.getBooleanCellValue());

        } else if (sourceCell.getCellTypeEnum().equals(CellType.FORMULA)) {

            destCell.setCellValue(sourceCell.getCellFormula());

        } else if (sourceCell.getCellTypeEnum().equals(CellType.NUMERIC)) {
            if (DateUtil.isCellDateFormatted(sourceCell)) {
                destCell.setCellValue(sourceCell.getDateCellValue());
            } else {
                destCell.setCellValue(sourceCell.getNumericCellValue());
            }
            // 如果源单元格是空的,则在目标单元格中写入一个空串("")。
        } else if (sourceCell.getCellTypeEnum().equals(CellType.BLANK)) {
            destCell.setCellValue("");
        }
    }

这样写在进行大部分数据类型复制的过程的都没有问题,但除了公式类型的数据不能成功复制,网上有一些博主的做法是直接将

 if (DateUtil.isCellDateFormatted(sourceCell)) {
                destCell.setCellValue(sourceCell.getDateCellValue());
            } else {
                destCell.setCellValue(sourceCell.getNumericCellValue());
            }

复制到公式的类型下,当然这样也可以成功的将源单元格中的数据复制过来,而且复制过来的数据类型是相同的,但是这里有一个问题,就是当某个单元格是依赖这个复制过来的单元格时(比如有公式依赖关系),这种情况下就会出现,这个依赖的单元格的值就不能自动生成。

Java POI (3)—— Excel单元格复制过程中公式不生效的问题,编程,开发,excel,java,开发语言,intellij-idea,idea

 拿图说话吧,就是当从别的表复制110.73这个值过来后,下面的0这个数字根据公式关系就应该立刻发生改变,但结果是,按照映射关系,指定的单元格的值复制成功了,但是先关联的单元格的值并没有发生改变。

根本原因就是,仅仅只复制了内容没有复制样式,在这里体现出来的就是,公式没有复制过来

Java POI (3)—— Excel单元格复制过程中公式不生效的问题,编程,开发,excel,java,开发语言,intellij-idea,idea

 二、解决问题

尝试方法1、

将 destCell.setCellValue(sourceCell.getCellFormula());

该成 destCell.setCellFormula(sourceCell.getCellFormula());

结果失败,公式转换不过去,计算出的结果通通为 0

Java POI (3)—— Excel单元格复制过程中公式不生效的问题,编程,开发,excel,java,开发语言,intellij-idea,idea

尝试方法2、

经过查阅资料发现要在生成文件前加个一行代码,命令公式生效

Java POI (3)—— Excel单元格复制过程中公式不生效的问题,编程,开发,excel,java,开发语言,intellij-idea,idea

 于是我将  destinationWorkbook.setForceFormulaRecalculation(true);// 执行公式

分别和这两个  

destCell.setCellValue(sourceCell.getCellFormula()); destCell.setCellFormula(sourceCell.getCellFormula());

进行组合并再尝试运行,发现还是不行。甚至直接解析不了了

Java POI (3)—— Excel单元格复制过程中公式不生效的问题,编程,开发,excel,java,开发语言,intellij-idea,idea

 尝试方法3、

正确尝试!!!!!!

destCell.setCellFormula(String.valueOf(sourceCell.getNumericCellValue()));

其实,解决问题的思路很简单,在经历之前的尝试后发现,只有把公式作为 NUMERIC 类型读进来才会有效果,但这样就不能用 setCellFormula 方法了,所以进行转换了一下,再结合

destinationWorkbook.setForceFormulaRecalculation(true);// 执行公式

就可以得到正确结果了。

Java POI (3)—— Excel单元格复制过程中公式不生效的问题,编程,开发,excel,java,开发语言,intellij-idea,idea

 文章来源地址https://www.toymoban.com/news/detail-520264.html

到了这里,关于Java POI (3)—— Excel单元格复制过程中公式不生效的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java poi导出excel单元格设置自定义背景颜色(任意颜色)

    一、思考过程(看代码的移步第二点) 现有方法 现有资料多为使用 IndexedColors 设置颜色, 但是IndexedColors能设置的颜色有限 ,而需求中所要颜色都是花里胡哨的,需要真正的自定义; 而颜色的本质是rgb ,所以只要我们能自己设置rgb的值就能获取任意想要的颜色了; 源码分

    2023年04月10日
    浏览(44)
  • java poi excel 设置单元格富文本 粗体无效解决办法

    //富文本样式(一个单元格含有的多种样式格式)设置粗体无效解决办法 //设置RichTextString 的时候,给 font 设置 setBold(true) ; setItalic(true) 粗体 斜体 ,发现在office有效果,在wps 看不到加粗斜体效果。 //原因是而程序生成的加粗是b val=\\\"true\\\"/电脑的生成的xlsx的加粗是b/,所以解决

    2024年02月15日
    浏览(45)
  • java poi 获取excel中的图片(包含wps中嵌入单元格图片)

    项目中有excel导入功能,并且需要导入excel中的图片;模板如图: 已知office中插入的图片为浮动形式;如图: wps中可以插入浮动图片,也可以插入嵌入单元格图片;如图: 并且在wps嵌入单元格形式的图片可以看到使用的是公式;如图:  问题来了,如何获取图片  并且将图片与单元格进行对

    2024年02月07日
    浏览(54)
  • Java使用poi导出excel针对不同数据列配置设置不同单元格格式(适用于通用导出excel数据)

    公司大部分业务都是查询相关的业务, 所以建了一个项目专门做数据查询, 数据中转等抽象通用的业务, 有一天给我安排了一个功能, 做excel导出, 配置好查询sql和表头字段映射后即可导出excel, 无需修改代码 后来因为导出数据要求保留几位小数或者转换成百分比等设置单元格格

    2024年02月07日
    浏览(55)
  • excel单元格多行文本的excel 提取 公式

    第一行: =TRIM(MID(SUBSTITUTE(A$1,CHAR(10),REPT(\\\" \\\",160)),ROW(A1)*160-159,160)) 第9行: =TRIM(MID(SUBSTITUTE(A$1,CHAR(10),REPT(\\\" \\\",160)),ROW(A9)*160-159,160)) Excel如何提取某一单元格的多行内容中的某一行。? - 知乎

    2024年02月07日
    浏览(39)
  • POI实现导出复杂Excel(动态行,复杂单元格,水印,Excel转换为PDF)。

      一、POI 表格框架 1.POI : POI提供API给Java程序对Microsoft Office格式档案读和写的功能 2.HSSF:Horrible SpreadSheet Format,为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型” 3.POI 文档结构类  HSSFWorkbook 文档对象,HSSFSheet  页,HSSFRow 行,HSSFCell 单

    2024年02月06日
    浏览(43)
  • Excel 拆分单元格数据(公式拆分、智能填充、分列)

    将姓名工号拆分成 姓名 和 工号 在 B2 单元格输入 在 C2 单元格输入 然后 ctrl + d 向下填充即可 在 B2 单元格输入 李金秀,然后选中 B3 单元格,按 ctrl + e 进行智能填充 在 C2 单元格输入 1001,然后选中 C3 单元格,按 ctrl + e 进行智能填充 全选要拆分的数据,然后按流程走

    2024年02月07日
    浏览(48)
  • 若依框架自定义导出Excel多sheet页+合并单元格(Poi)

    先看效果:     在用若依框架是发现自带的导出功能中并不能导出多个sheet和合并单元格,所以我在这里做了修改希望可以帮到你,用到的点个赞呗! 我们先一步步来 整个程序的思路为先返回下载地址,然后根据下载地址去下载excel 首先是我们需要excel的下载地址,这里我们

    2024年02月03日
    浏览(47)
  • [office] Excel中进行复制粘贴公式时数值不变化的解决方法 #笔记#媒体

    Excel中进行复制粘贴公式时数值不变化的解决方法 excel表中复制粘贴公式时数值不变化解决方法终结版,如何解决在计算的过程中,设置好了公式,希望复制公式粘贴到下面的很多单元格中,今天,小编就教大家在Excel中进行复制粘贴公式时数值不变化的解决方法。 Excel中进行

    2024年02月21日
    浏览(102)
  • Java读取Excel 单元格包含换行问题

    针对用户上传的Excel数据,或者本地读取的Excel数据。单元格中包含了换行,导致读取的数据被进行了切片。 正常读取如下图所示。 目前是把数据读取出来的cell转成字符串后,然后替换掉换行符即可。 换行符使用 n 进行替换。 代码如下: 读取结果:

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包