Как я могу получить имя от Excel? - PullRequest
1 голос
/ 25 марта 2020

Я сравниваю 2 файла Excel по ячейкам за ячейкой, и когда я обнаружил разницу, я распечатываю ее в качестве примера. Значения ячеек DIFF: 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() + "'");
    }

enter image description here

Ответы [ 2 ]

2 голосов
/ 26 марта 2020

Пример сбора имен диапазонов из электронной таблицы, чтобы их можно было сравнить для отчета "diff" ...

Например, вот электронная таблица с двумя именованными диапазонами:

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

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

named ranges

Следующий код заполняет имена диапазонов и ссылки на карту:

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>
0 голосов
/ 25 марта 2020

Вы можете добавить функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...