Java-код для сравнения листов Excel не работает для больших файлов - PullRequest
0 голосов
/ 19 сентября 2019

Недавно я выполнил проект в java для сравнения таблиц Excel в 2 разных папках и сгенерировал результат в итоговой папке, созданной в каталогах исходных папок.Весь код работал нормально, за исключением файлов, которые имеют более 10000 строк.это просто создание пустого листа вместо сравниваемых несовпадений для больших файлов.вот код, который я использовал Пожалуйста, помогите мне.

    package com.validation.comparators;
    import java.util.ArrayList;
    import java.util.List;
    import org.apache.commons.lang3.StringUtils;
    import org.bson.Document;
    /**
      * The utility class SheetComparator
   */
    public class SheetComparator {
    private SheetComparator() {
    // The utility class
}

/**
 * Compares the document equivalent of two sheets
 * 
 * @param document1
 *            The document 1
 * @param document2
 *            The document 2
 * @return The compared output
 */
@SuppressWarnings("unchecked")
public static Document compare(Document document1, Document document2) {

    List<String> headers = (List<String>) document1.get("headers");
    List<Document> sheet1Rows = (List<Document>) document1.get("data");
    List<Document> sheet2Rows = (List<Document>) document2.get("data");
    List<Document> temp;
    List<Document> comparedOutput = new ArrayList<>();

    if (sheet1Rows.size() < sheet2Rows.size()) {
        temp = sheet1Rows;
        sheet1Rows = sheet2Rows;
        sheet2Rows = temp;
    }

    int length = sheet1Rows.size();
    int length2 = sheet2Rows.size();

    for (int i = 0; i < length2; i++) {
        Document sheet1Row = sheet1Rows.get(i);
        Document sheet2Row = sheet2Rows.get(i);
        Document comparedRow = new Document("row number",
                new Document("value", sheet1Row.getString("row number")).append("color", "WHITE"));
        Boolean completeMatch = true;

        for (String header : headers) {
            Boolean isNull = false;
            String value1 = sheet1Row.getString(header).trim();
            String value2 = sheet2Row.getString(header).trim();

            if (StringUtils.isAnyBlank(value1, value2)) {
                completeMatch = false;
                isNull = true;
            } else if (!StringUtils.equals(value1, value2)) {
                completeMatch = false;
            }

            if (isNull) {
                comparedRow.append(header, new Document("value", StringUtils.isBlank(value1) ? value2 : value1)
                        .append("color", "RED"));
            } else {
                comparedRow.append(header, new Document("value", value1).append("color", "WHITE"));
            }
        }

        if (!completeMatch) {
            comparedOutput.add(comparedRow);
        }
    }

    for (int i = length2; i < length; i++) {
        Document row = sheet1Rows.get(i);
        Document comparedRow = new Document();

        for (String header : headers) {
            String value = row.getString(header);
            comparedRow.put(header, new Document("value", value).append("color", "RED"));
        }

        comparedRow.append("row number",
                new Document("value", row.getString("row number")).append("color", "WHITE"));
        comparedOutput.add(comparedRow);
    }

    headers.add(0, "row number");
    return new Document("data", comparedOutput).append("headers", headers);
}
}

1 Ответ

0 голосов
/ 19 сентября 2019

Попробуйте, установите высокий уровень памяти jvm (java).Проблема в том, что вы должны прочитать всю иерархию объектов DOM.

В противном случае вам нужно только последовательно читать документы, по листам, по строкам, по ячейкам.Поэтому вместо того, чтобы иметь некоторый объект DOM в памяти, вы могли бы:

  • Записать последовательный поток (как текстовый документ) документов в файл.
  • Преобразовать оба Excels в текст.
  • Чтение двух потоков и создание различий для каждого токена.
  • Возможно, вы можете сразу написать отчет о разнице.
...