【探讨】Java POI 处理 Excel 中的名称管理器

这篇具有很好参考价值的文章主要介绍了【探讨】Java POI 处理 Excel 中的名称管理器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近遇到了一些导表的问题。原本的导表工具导不了使用名称管理器的Excel。
首先我们有两个Sheet。B1用的是名称管理器中的AAA, 而B2用的对应的公式。
【探讨】Java POI 处理 Excel 中的名称管理器,java,excel
【探讨】Java POI 处理 Excel 中的名称管理器,java,excel
第二个sheet,名为Test2:
【探讨】Java POI 处理 Excel 中的名称管理器,java,excel

这是一段简化的代码:

public class Main {
    public static void main(String[] args) {
        var inputFile = new File("src/main/java/poi/test.xlsx");
        var dataFormatter = new DataFormatter();
        try (var wb = new XSSFWorkbook(new FileInputStream(inputFile))) {
            wb.setForceFormulaRecalculation(true);
            var sheet = wb.getSheet("Test");
            var formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
            for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) {
                var row = sheet.getRow(i);
                var list = new ArrayList<String>();
                for (var cell : row) {
                    list.add(format(dataFormatter, formulaEvaluator, cell));
                }
                System.out.println(String.join(", ", list));
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

    public static String format(DataFormatter dataFormatter, XSSFFormulaEvaluator formulaEvaluator, Cell cell) {
        return dataFormatter.formatCellValue(cell, formulaEvaluator);
    }
}

控制台的输出为:

1, #N/A
2, b

这意味着无法解析这个命名统计后的值。

为啥公式可以执行。但是从名称管理器拿不到?是否可以通过拿名称对应的公式来计算出相应的结果?

通过修改formatter:

    public static String format(DataFormatter dataFormatter, XSSFFormulaEvaluator formulaEvaluator, Cell cell) {
        if (cell.getCellType() == CellType.FORMULA) {
            System.out.println("Formula: " + cell.getCellFormula());
            System.out.println("RichString: " + cell.getRichStringCellValue().getString());
            System.out.println("Cache result type: " + cell.getCachedFormulaResultType());
        }
        return dataFormatter.formatCellValue(cell, formulaEvaluator);
    }

我们可以得到输出:

Formula: AAA
RichString: a
Cache result type: STRING
1, #N/A
---------------------------------------
Formula: VLOOKUP(A2,Test2!$A$1:$B$5,2)
RichString: b
Cache result type: STRING
2, b
---------------------------------------

这么看来RichString可以拿到我们想要的值。
但是当我把Sheet2中对应的值改为数字:
【探讨】Java POI 处理 Excel 中的名称管理器,java,excel

得到的一个保存的结果:

Formula: AAA
Exception in thread "main" java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC formula cell
	at org.apache.poi.xssf.usermodel.XSSFCell.typeMismatch(XSSFCell.java:946)
	at org.apache.poi.xssf.usermodel.XSSFCell.getRichStringCellValue(XSSFCell.java:330)
	at org.apache.poi.xssf.usermodel.XSSFCell.getRichStringCellValue(XSSFCell.java:77)
	at poi.Main.format(Main.java:43)
	at poi.Main.main(Main.java:29)

这里我想拿到一个可以区分是Name还是Formula的属性。但是我看了下从cell的方法好像没办法拿到。

一个解决方案

package poi;

import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        var inputFile = new File("src/main/java/poi/test.xlsx");
        var dataFormatter = new DataFormatter();
        try (var wb = new XSSFWorkbook(new FileInputStream(inputFile))) {
            wb.setForceFormulaRecalculation(true);
            var sheet = wb.getSheet("Test");
            var formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator();
            for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) {
                var row = sheet.getRow(i);
                var list = new ArrayList<String>();
                for (var cell : row) {
                    list.add(format(dataFormatter, formulaEvaluator, cell));
                }
                System.out.println(String.join(", ", list));
                System.out.println("---------------------------------------");
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

    public static String format(DataFormatter dataFormatter, XSSFFormulaEvaluator formulaEvaluator, Cell cell) {
        if (cell.getCellType() == CellType.FORMULA) {
            System.out.println("Formula: " + cell.getCellFormula());
            System.out.println("Cache result type: " + cell.getCachedFormulaResultType());
            if (cell.getCachedFormulaResultType() == CellType.STRING) {
                return cell.getRichStringCellValue().getString();
            } else {
                return String.valueOf(cell.getNumericCellValue());
            }
        }
        return dataFormatter.formatCellValue(cell, formulaEvaluator);
    }
}

执行后得到结果:

Formula: AAA
Cache result type: NUMERIC
1, 1.0
---------------------------------------
Formula: VLOOKUP(A2,Test2!$A$1:$B$5,2)
Cache result type: NUMERIC
2, 2.0
---------------------------------------

这样结果勉强可以用,但是感觉上这段代码是有BUG的,但是对POI的了解不是太透,本文相当于抛砖引玉,如果有懂的可以探讨下。文章来源地址https://www.toymoban.com/news/detail-613897.html

到了这里,关于【探讨】Java POI 处理 Excel 中的名称管理器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • java poi导入Excel、导出excel

    java poi导入Excel、导出excel ReadPatientExcelUtil PoiUtils FileUtils

    2024年02月15日
    浏览(28)
  • JAVA操作Excel之POI

    POI提供API给JAVA程序对Microsoft Office格式档案读和写的功能 基本功能如下: HSSF – 提供读写Excel格式(03)xls文件 XSSF – 提供读写Excel OOXML格式(07)xlsx文件 HWPF – 提供读写Word格式 HSLF – 提供读写PowerPoint格式 HDGF – 提供读写Visio格式 【注】03版本最多65535行,07版本的没有限制

    2024年02月06日
    浏览(26)
  • Java使用POI导出Excel

    在项目开发中往往需要使用到Excel的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后使用POI写到Excel上。 操作Excel目前比较流行的就是 Apache POI 和阿里巴巴的 easyExcel ! 废话不多说,开始撸起来!!! POI官网;https://poi.apache.org/ POI官网API:https://poi.

    2024年02月04日
    浏览(32)
  • Java Poi导出Excel表格详解

    一、导出下面的表格 二、流程详解         1、导出excel需要先将数据准备好         2、创建工作傅对象SXSSFWorkbook         3、使用工作傅对象创建sheet对象(工作页)         4、使用sheet对象创建行对象row(行对象)         5、使用row对象创建cell对象(单元格

    2024年02月10日
    浏览(37)
  • Java Excel Poi 字体颜色设置

    要设置单元格的字体颜色,可以使用 Apache POI 中的  CellStyle  和  Font  类。下面是一个示例代码,演示如何设置单元格字体颜色: 这段代码创建了一个带颜色的单元格,字体颜色设置为红色。你可以根据需要将  IndexedColors  中的颜色调整为你想要的其他颜色。最后,代码将

    2024年02月03日
    浏览(30)
  • Apache POI | Java操作Excel文件

    目录 1、介绍 2、代码示例 2.1、将数据写入Excel文件 2.2、读取Excel文件中的数据 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Python人工智能开发和前端开发。 🦅主页:@逐梦苍穹 📕您的一

    2024年02月20日
    浏览(41)
  • 使用POI实现JAVA操作Excel文件

    https://poi.apache.org/components/index.html xls最大支持65536行、256列 xlsx最大支持1048576行、16384列 poi 操作xls poi-ooml操作xlsx 优点:过程中写入缓存,不操作磁盘,最后再一次性导入磁盘,速度快+ 缺点:但是只能写入65535条数据,超过就会报异常 优点:可以写较大数据量(超过655135条)

    2024年02月14日
    浏览(34)
  • JAVA:POI设置EXCEL单元格格式

    目录 1.Maven引入 2.单元格样式设置  3.单元格值设置 3.1.设置单元格为文本格式 3.2.设置单元格为日期格式 3.3.设置单元格数值格式 3.4.设置单元格为货币格式 3.5.设置单元格为百分比格式 3.6.设置单元格为中文大写格式 3.7.设置单元格为科学计数法格式 本文将介绍POI Excel for Jav

    2024年02月16日
    浏览(32)
  • java poi实现Excel多级表头导出

    最近碰到一个导出,比较繁琐,也查询了许多博客,在其中一篇博客的基础上修改,实现了最终想要的效果。话不多说,直接上效果图 1.主代码: 2.合并单元格 3.设置表头单元格的宽度 4.填充数据(注:我这里的数据格式是ListMapString, Object类型,可以根据自己的实际情况来封

    2024年02月03日
    浏览(35)
  • java解析excel,poi和easyExcel

    做项目遇到上传excel并解析excel内容组装成结构话json,网上查了很多方法,做了poi和easyExcel两个方法的对比 两者都可以解析excel文件,但是两个也有不同: 一、poi 官方说明:https://poi.apache.org/components/index.html A、03版excel和07版excel: 1)03版excel最多65536行,最大列数是256列,

    2023年04月22日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包