java - 如何从excel中获取名称框?

标签 java excel apache-poi

我正在逐个单元格比较 2 个 excel 文件,当我发现差异时,我将其打印为示例 DIFF 单元格值:Sch HI (1 of 4)!K40 => '6.0' v/s '5.0' 单元格位置旧值和新值(value)

所以我需要打印框名而不是单元格位置

 @Override
    public void reportDiffCell(CellPos c1, CellPos c2) {
        sheets.add(c1.getSheetName());
        rows.add(c1.getRow());
        cols.add(c1.getColumn());
        results.add("DIFF Cell values at: " + c1.getCellPosition() + " => '" + c1.getCellValue()
                + "' v/s '" + c2.getCellValue() + "'");
    }

enter image description here

最佳答案

从电子表格中收集范围名称的示例,以便可以比较它们以获得“差异”报告...

例如,这是一个包含两个命名范围的电子表格:

Name     : animals
Refers to: Sheet1!$C$3:$D$4,Sheet1!$C$5

Name     : birds
Refers to: Sheet1!$B$8:$B$9

named ranges

以下代码将范围名称和引用填充到 map 中:
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.usermodel.Name;

...

public Map<String, String> compare(String fileName) {

    Map<String, String> namesMap = new HashMap();

    File file = new File(fileName);
    try (InputStream is = new FileInputStream(file)) {
        Workbook wb = WorkbookFactory.create(is);
        List<? extends Name> names = wb.getAllNames();

        names.forEach((name) -> {
            namesMap.put(name.getNameName(), name.getRefersToFormula());
        });

    } catch (FileNotFoundException ex) {
        // handler
    } catch (IOException ex) {
        // handler
    }

    return namesMap;
}

现在您可以对两个 Excel 文件中的每一个重复此操作,然后比较两个映射对象中的键和值(不同的范围名称;相同的名称但不同的单元格范围)。

更新 :上面的示例是使用 Open JDK 13 编写的。使用了以下 POI 依赖项(假设是 Maven):
<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>4.1.2</version>
    </dependency>
    <dependency> 
        <groupId>org.apache.poi</groupId> 
        <artifactId>poi-ooxml</artifactId> 
        <version>4.1.2</version>
    </dependency> 
</dependencies>

关于java - 如何从excel中获取名称框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60854134/

相关文章:

java - 无法将 Android Studio 与 Maven 存储库同步

JAVA 访问对象数组内的项目

oracle - 由于系统错误 193 : (Oracle in instant client_11_2, C :\. ..\SQORA32.dll),无法加载 VBA ODBC Oracle 指定的驱动程序

java - 如何使用 POI 获取 Excel 中列的最大长度

java - 使用 selenium Web 驱动程序获取 NoClassDefFoundError

java - 设置轴标题并向栏中添加值

java - 如何从 Grails 应用程序使用 JNI native 库

java - Spring 环境中的多个@ConfigurationProperties validator bean

excel - VBA IF公式不起作用?

java - 使用 `Replace()` 方法不会替换 Apache POI 中的文本