Java Apache POI 3.16在Matlab中运行时会创建无效文件

Java Apache POI 3.16在Matlab中运行时会创建无效文件,java,matlab,apache-poi,Java,Matlab,Apache Poi,我试图在macOS 10.14上使用Matlab R2019b内部的ApachePOI3.16以编程方式创建Excel文件。我可以让它运行,但它创建的文件无效:.xlsx文件中的OOXML文件中的一些XML元素缺少它们的xmlns属性,Excel不喜欢这样。有人知道为什么会这样吗 由于与Matlab附带的其他JAR存在依赖性冲突,我恐怕无法使用POI 3.16或更高版本 我已将POI JAR加载到Matlab中的动态javaclasspath中: >> javaclasspath -

我试图在macOS 10.14上使用Matlab R2019b内部的ApachePOI3.16以编程方式创建Excel文件。我可以让它运行,但它创建的文件无效:
.xlsx
文件中的OOXML文件中的一些XML元素缺少它们的
xmlns
属性,Excel不喜欢这样。有人知道为什么会这样吗

由于与Matlab附带的其他JAR存在依赖性冲突,我恐怕无法使用POI 3.16或更高版本

我已将POI JAR加载到Matlab中的动态javaclasspath中:

>> 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;
当我试图在Excel 16.33中打开HelloFromMatlab.xlsx时,我得到以下错误:

警觉的

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>
diff-r Hello HellofRommatrab
diff-r Hello/[Content\u Types].xml hellofromatlab/[Content\u Types].xml
2,4c2,3
< 
[...]
> 
[...]
< 
[...]
> 
[...]
< 
[...]
> 
如果我手动编辑.xlsx文件以添加那些
xmlns
名称空间属性,那么它就会工作,Excel会很高兴地打开它


见鬼了?

ApachePOI3.16已经很老了,从那以后,已经有了一系列与XML相关的修复程序,包括针对损坏的XML运行时的解决方法。也许可以尝试升级到POI的最新版本,看看这是否解决了问题?
ApachePOI
使用
javax.xml.
org.w3c.dom.
创建
xml
。看起来您的
matlab
使用的版本与默认
JRE
使用的版本不同。注意,我没有使用
matlab
,所以这只是一个提示。@Gagravarr:很遗憾,我不能升级POI超过3.16。Matlab运行时在其JRE环境中附带了大量JAR,包括一些POI依赖项;POI 3.17及更高版本与与Matlab捆绑的依赖项jar集不兼容。(我已经联系了MathWorks支持部门,要求他们升级或删除这些JAR,但这可能需要几年时间。)@AxelRichter:Matlab R2019b附带的Java JAR列表如下:。我看不到具体表示这些包的元数据,但其中有
xmlapi.jar
xml-api-ext.jar
,以及
xercesImpl.jar
文件,它们听起来是相关的。是那些吗?(如果需要的话,它使用的是Oracle JRE 1.8.0_202-b08。)如果是这样的话,我可能可以在我的Matlab进程的Java
CLASSPATH
中覆盖它们。使用
Java JRE 8
就不需要
xml API.jar
xml-API-ext.jar
,还有
xercesImpl.jar
,因为所有
XML
相关的东西都已经包含在
JRE
中了。因此,我怀疑那些
jar
s已经过时了。请参阅:“Java 5及更低版本需要这些库,但符合规范的Java 6实现实际上并不需要这些库,因此请尝试从类路径中删除这些库。如果不可能,请尝试升级到这些jar文件的较新版本。”