Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从excel中获取名称框?_Java_Excel_Apache Poi - Fatal编程技术网

Java 如何从excel中获取名称框?

Java 如何从excel中获取名称框?,java,excel,apache-poi,Java,Excel,Apache Poi,我正在逐个单元格比较两个excel文件,当我发现差异时,我将其打印为示例差异单元格值:Sch HI(第1个,共4个)!K40=>“6.0”v/s“5.0”单元格位置旧值和新值 所以我需要打印框名,而不是单元格位置 @Override public void reportDiffCell(CellPos c1, CellPos c2) { sheets.add(c1.getSheetName()); rows.add(c1.getRow());

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

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

 @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() + "'");
    }

您可以将VBA函数添加到工作簿中,并从java调用它

Function CellName(r As Range)
    On Error Resume Next
    CellName = r.Name.Name
    If Err Then CellName = r.Address(0, 0)
End Function

一个从电子表格中收集范围名称的示例,以便可以将其与“差异”报告进行比较

例如,下面是一个具有两个命名范围的电子表格:

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

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

以下代码将范围名称和引用填充到映射中:

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;
}
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.List;
导入java.util.Map;
导入java.util.HashMap;
导入org.apache.poi.ss.usermodel.工作簿;
导入org.apache.poi.ss.usermodel.WorkbookFactory;
导入org.apache.poi.ss.usermodel.Name;
...
公共映射比较(字符串文件名){
Map namesMap=newhashmap();
文件=新文件(文件名);
try(InputStream is=新文件InputStream(文件)){
工作簿wb=WorkbookFactory.create(is);

列表以查看为起点。请记住,一个单元格可以包含在多个命名区域中。因此,您最好独立于单元格引用来迭代命名区域,然后报告这些命名区域中的差异。抱歉,我没有注意到。也许一种解决方法是将上述函数放置在然后从java调用它。嘿,您使用的是哪个版本的apache?我使用的是3。9@JsNinja我的示例是使用POI 4.1.2(和OpenJDK 13)编写的。如果您使用的是POI 3.9,那么我认为有两种方法缺失/不同,例如
wb.getAllNames()
generateContiguous()
-也可能是
WorkbookFactory
。上面的代码在POI 3.17中运行正常。这是您的选项吗?实际上我改为4.1.2了,我遇到了几个错误,我也尝试了3.17,有点错误:java.lang.NoSuchMethodError:org.apache.POI.POIXMLDocumentPart.getPackageRelationship()Lorg/apache/poi/openxml4j/opc/PackageRelationship;@JsNinja-我更新了答案,以显示我的poi依赖关系,以防有所帮助。如果这不起作用,我会回来看你有什么想法吗?
<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>