Как узнать, что делает poi поврежденным в файле xlsx / xlsm - PullRequest
0 голосов
/ 07 января 2019

У меня проблема с тем, что Apache POI "повредил" файл xlsm / xlsx, просто прочитав и записав его (например, с помощью следующего кода)

public class Snippet {
    public static void main(String[] args) throws Exception {

        String str1 = "c:/tmp/spreadsheet.xlsm";
        String str2 = "c:/tmp/spreadsheet_poi.xlsm";

        // open file
        XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(new File(str1)));

        // save file
        FileOutputStream out = new FileOutputStream(str2);
        wb.write(out);
        wb.close();
        out.close();

    }
}

Как только вы откроете файл spreadsheet_poi.xlsm в Excel, вы получите сообщение об ошибке, подобное следующему

"Мы обнаружили проблему с некоторым контентом в xxx. Хотите, чтобы мы попытались восстановить столько, сколько мы можем ..."?

Если вы скажете «да», вы получите журнал, который может выглядеть следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <logFileName>error145040_01.xml</logFileName>
    <summary>Errors were detected in file 'C:\tmp\spreadsheet_poi.xlsm'</summary>
    <repairedParts>
        <repairedPart>Repaired Part: /xl/worksheets/sheet4.xml part with XML error.  Load error. Line 2, column 0.</repairedPart>
        <repairedPart>Repaired Part: /xl/worksheets/sheet5.xml part with XML error.  Load error. Line 2, column 0.</repairedPart>
        <repairedPart>Repaired Part: /xl/worksheets/sheet8.xml part with XML error.  Load error. Line 2, column 0.</repairedPart>
    </repairedParts>
</recoveryLog>

Каков наилучший подход для более детальной отладки проблемы (например, выяснить, что заставляет poi «портить» файл?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Мой профессор сказал: «Как математик находит льва в пустыне?» - «Сначала рассекает пустыню на две половины, выясняет, где находится лев, а затем повторяет ее, пока лев не будет пойман».

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

0 голосов
/ 07 января 2019

В конце концов я обнаружил, что лучший способ отладки - это две вещи

  1. откройте соответствующую книгу (например, с помощью 7zip и отформатируйте соответствующие листы с помощью редактора xml (например, Notepad ++> Плагины> Инструменты XML> Pretty print (только XML - с разрывами строк)). После сохранения файлов и обновления файла xlsm вы получим "реальные" номера строк в журнале ошибок Excel
  2. , если действительные номера строк еще не помогли сравнить листовые xml-файлы исходного xlsx-файла и файла, сохраненного в poi. Вы заметите, что есть различия в отношении атрибутов, а также порядок отличается. Для правильного сравнения я использовал Beyond Compare с «Дополнительными форматами файлов» (см. https://weblogs.asp.net/lorenh/comparing-xml-files-with-beyond-compare-3-brilliant для получения дополнительной информации). Возможно есть другой инструмент сравнения, который одинаково хорош.

В моем случае проблема заключалась в том, что poi каким-то образом изменил настройку измерения с

<dimension ref="A1:XFD147"/>

до

<dimension ref="A1:XFE147"/>

(с XFE, являющимся несуществующим столбцом). Я исправил это, удалив много пустых столбцов в исходном файле xlsx.

...