Apache POI 3.16 создает недопустимые файлы при запуске внутри Matlab - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь использовать Apache POI 3.16 из Matlab R2019b в macOS 10.14 для программного создания файлов Excel. Я могу заставить его работать, но файлы, которые он создает, недопустимы: некоторые элементы XML внутри файлов OO XML внутри файла .xlsx не имеют своих атрибутов xmlns, а Excel это не нравится , Кто-нибудь знает, почему в мире это происходит?

Боюсь, я застрял на POI 3.16 или старше из-за конфликтов зависимостей с другими JAR-файлами, поставляемыми с Matlab.

Я загрузил POI зависит от моего динамического c javaclasspath в Matlab:

>> javaclasspath -dynamic

        DYNAMIC JAVA PATH

    /Users/janke/local/repos/janklab/lib/java-ext/postgresql-42.2.9.jar                         
    /Users/janke/local/repos/janklab/lib/java/swingexplorer-1.6.0/swexpl.jar                    
    /Users/janke/local/repos/janklab/lib/java/swingexplorer-1.6.0/swag.jar                      
    /Users/janke/local/repos/janklab/lib/java/poi-3.16-dependencies/xmlbeans-2.6.0.jar          
    /Users/janke/local/repos/janklab/lib/java/poi-3.16-dependencies/curvesapi-1.04.jar          
    /Users/janke/local/repos/janklab/lib/java/poi-3.16-dependencies/commons-logging-1.2.jar     
    /Users/janke/local/repos/janklab/lib/java/poi-3.16-dependencies/commons-collections4-4.1.jar
    /Users/janke/local/repos/janklab/lib/java/poi-3.16-dependencies/commons-codec-1.10.jar      
    /Users/janke/local/repos/janklab/lib/java/poi-3.16/poi-scratchpad-3.16.jar                  
    /Users/janke/local/repos/janklab/lib/java/poi-3.16/poi-ooxml-schemas-3.16.jar               
    /Users/janke/local/repos/janklab/lib/java/poi-3.16/poi-ooxml-3.16.jar                       
    /Users/janke/local/repos/janklab/lib/java/poi-3.16/poi-excelant-3.16.jar                    
    /Users/janke/local/repos/janklab/lib/java/poi-3.16/poi-examples-3.16.jar                    
    /Users/janke/local/repos/janklab/lib/java/poi-3.16/poi-3.16.jar  

Вот моя маленькая тестовая программа Matlab:

function createHelloWorldXls

wkbk = org.apache.poi.xssf.usermodel.XSSFWorkbook;
sheet = wkbk.createSheet("Hello");
row = sheet.createRow(0);
cell = row.createCell(0);
cell.setCellValue("Hello, World!");
ostr = java.io.FileOutputStream("HelloFromMatlab.xlsx");
wkbk.write(ostr);
ostr.close;

Когда я пытаюсь открыть HelloFromMatlab.xlsx в Excel 16.33 , Я получаю следующую ошибку:

Alert

Excel не может открыть файл 'HelloFromMatlab.xlsx', поскольку формат файла или расширение файла недопустимы. Убедитесь, что файл не был поврежден и что расширение файла соответствует формату файла.

Вот эквивалентная программа, которую я написал простым Java и выполнял с тем же Apache POI 3.16 библиотека:

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class HelloWorldExcel {

    public static void createHelloWorldExcelFile() throws IOException {
        Workbook wkbk = new XSSFWorkbook();
        Sheet sheet = wkbk.createSheet("Hello");
        Row row = sheet.createRow(0);
        Cell cell = row.createCell(0);
        cell.setCellValue("Hello, World!");
        OutputStream out = new FileOutputStream("Hello.xlsx");
        wkbk.write(out);
        out.close();
    }

    public static void main(String[] argv) {
        try {
            createHelloWorldExcelFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Это работает.

Если я распаковываю два файла и сравниваю их, я вижу, что в некоторых элементах, созданных из Matlab, отсутствуют xmlns атрибуты пространства имен:

diff -r Hello HelloFromMatlab
diff -r Hello/[Content_Types].xml HelloFromMatlab/[Content_Types].xml
2,4c2,3
< <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
[...]
> <Types>
[...]
< <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
[...]
> <Relationships>
[...]
< <Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
[...]
> <Relationships>

Если я вручную отредактирую файл .xlsx, добавив эти xmlns атрибуты пространства имен, то он сработает, и Excel с радостью откроет его.

Какого черта?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...