Я пытаюсь использовать 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 с радостью откроет его.
Какого черта?