Самый простой способ сравнить два файла Excel в Java?

Я пишу тест JUnit для некоторого кода, который создает файл Excel (который является двоичным). У меня есть другой файл Excel, который содержит мой ожидаемый результат. Какой самый простой способ сравнить фактический файл с ожидаемым файлом?

конечно, я мог бы написать код сам, но мне было интересно, есть ли существующий метод в доверенной сторонней библиотеке (например, Spring или Apache Commons), который уже делает это.

10 ответов


вы можете использовать мой проект простой-excel который предоставляет кучу Hamcrest Matchers для выполнения этой работы.

когда вы делаете что-то вроде следующего,

assertThat(actual, WorkbookMatcher.sameWorkbook(expected));

, вы увидите, например,

java.lang.AssertionError:
Expected: entire workbook to be equal
     but: cell at "C14" contained <"bananas"> expected <nothing>,
          cell at "C15" contained <"1,850,000 EUR"> expected <"1,850,000.00 EUR">,
          cell at "D16" contained <nothing> expected <"Tue Sep 04 06:30:00">
    at org.hamcrest.MatcherAssert.assertThat(MatcherAssert.java:20)

таким образом, вы можете запустить его из своих автоматических тестов и получить значимую обратную связь во время разработки.

Вы можете прочитать больше об этом в эта статья на моем сайте


вот что я закончил делать (с тяжелым подъемом, выполняемым д. Банкрофт):

/**
 * Compares the data in the two Excel files represented by the given input
 * streams, closing them on completion
 * 
 * @param expected can't be <code>null</code>
 * @param actual can't be <code>null</code>
 * @throws Exception
 */
private void compareExcelFiles(InputStream expected, InputStream actual)
  throws Exception
{
  try {
    Assertion.assertEquals(new XlsDataSet(expected), new XlsDataSet(actual));
  }
  finally {
    IOUtils.closeQuietly(expected);
    IOUtils.closeQuietly(actual);
  }
}

это сравнивает данные в двух файлах, без риска ложных негативов из любых нерелевантных метаданных, которые могут отличаться. Надеюсь, это кому-то поможет.


простое сравнение файлов можно легко сделать, используя некоторые контрольные суммы (например, MD5) или просто читать оба файла.

однако, поскольку файлы Excel содержат множество метаданных, файлы, вероятно, никогда не будут идентичными байт за байтом, как отметил Джеймс Берджесс. Так что для теста вам понадобится другое сравнение.

Я бы рекомендовал как - то создать "каноническую" форму из файла Excel, т. е. прочитать сгенерированный файл Excel и преобразовать его в более простой формат (CSV или что-то подобное), который будет сохранять только информацию, которую вы хотите проверить. Затем вы можете использовать" каноническую форму " для сравнения с ожидаемым результатом (также в канонической форме, конечно).

Apache POI может быть полезно для чтения файла.

BTW: чтение всего файла, чтобы проверить его correctnes, как правило, не будет содержать модульного теста. Это интеграционный тест...


Мне нужно сделать что-то подобное и уже с помощью библиотека POI Apache в моем проекте для создания файлов Excel. Поэтому я решил использовать включенный ExcelExtractor интерфейс для экспорта книги в виде строки текста и утверждал, что строки равны. Существуют реализации для обоих HSSF для .в XLS а также XSSF для .XLSX-файл.

свалка в строку:

XSSFWorkbook xssfWorkbookA = ...;
String workbookA = new XSSFExcelExtractor(xssfWorkbookA).getText();

ExcelExtractor имеет некоторые варианты должны быть включены в строку дампа. Я нашел его полезным дефолтов, включая имена листов. Кроме того, он включает текстовое содержимое ячеек.


вы можете использовать javaxdelta, чтобы проверить, совпадают ли два файла. Он доступен отсюда:

http://javaxdelta.sourceforge.net/


самый простой способ, который я нахожу, - использовать Tika. Я использую его так:

private void compareXlsx(File expected, File result) throws IOException, TikaException {
     Tika tika = new Tika();
     String expectedText = tika.parseToString(expected);
     String resultText = tika.parseToString(result);
     assertEquals(expectedText, resultText);
}


<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers</artifactId>
    <version>1.13</version>
    <scope>test</scope>
</dependency>

только что узнал, что есть что-то в commons-io's пакета fileutils. Спасибо за другие ответы.


пожалуйста, взгляните на сайт для сравнения двоичных файлов, http://www.velocityreviews.com/forums/t123770-re-java-code-for-determining-binary-file-equality.html

Тигр


вы можете использовать За Пределами Сравнения 3, который может быть запущен из командной строки и поддерживает различные способы для сравнения файлов Excel, в том числе:

  • сравнение листов Excel в качестве таблиц базы данных
  • проверка всего текстового контента
  • проверка текстового контента с форматированием

может быть... сравнить MD5 дайджесты каждого файла? Я уверен, что есть много способов сделать это. Вы можете просто открыть оба файла и сравнить каждый байт.

EDIT: Джеймс заявил, как формат XLS может иметь различия в метаданных. Возможно, вам следует использовать тот же интерфейс, который вы использовали для создания файлов xls, чтобы открыть их и сравнить значения от ячейки к ячейке?