如何识别和写入具有 .xlsx 内容且具有 .xls 扩展名的 excel 文件

How to identify and write an excel file with .xls extension which has .xlsx content

我正在将内容从一个 DMS(Filenet) 迁移到另一个 (Webcenter Content), 在此过程中,我在 Filenet.

中遇到了一个扩展名为 .xls(内容类型为 application/vnd.ms-excel)的 excel 文件

我得到了文件的 InputStream 并在将其推送到 Webcenter Content 之前将其写入(文件 IO 操作)到一个临时位置。

问题是当我下载并打开 excel 文件 F1.xls 的 Filenet 版本时,它提示我文件格式和扩展名不匹配,但仍然打开文件并显示内容。

但是我推送到 Webcenter Content (WCC.xls) 的版本的行为方式不同。

它提示相同的消息,但在忽略提示后它显示垃圾字符,如果我将 WCC.xls 的扩展名更改为 WCC.xlsx,它显示正常。

我能做些什么来在运行时识别这些东西,我们将不胜感激任何帮助。

这是从我本地截取的代码

        InputStream initialStream;
        try {
            initialStream = new FileInputStream(
                      new File("C:\Users\xxxxxx\Desktop\Utils\YYYYY\FN1.xls"));

        FileOutputStream oStream = null;

            oStream =  new FileOutputStream("C:\Users\xxxxxx\Desktop\Utils\YYYYY\WCC1.xls");      
        FilenetConnectionUtil fCU = new FilenetConnectionUtil();
        fCU. writeFileToTempLocation("xx","xx",initialStream,oStream);
        oStream.flush();
        oStream.close();

    }    catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

/* Write Method*/
public void writeFileToTempLocation(String filename, String filepath, InputStream inStream,FileOutputStream oStream) throws IOException {

//  FileOutputStream oStream = new FileOutputStream(filepath);
    byte[] buffer = new byte[1024];
    int n;
    if(inStream != null) {
        while ((n = inStream.read(buffer)) != -1) {
            oStream.write(buffer);
        }
    }

    oStream.flush();    

}

谢谢, 拉胡尔·丹帕拉

由于 .xslx 是 zip 格式,前两个字节(魔术饼干)应该是 "PK".

Path path = Paths.get(
        "C:\Users\xxxxxx\Desktop\Utils\YYYYY\FN1.xls"));
// Or: Path path = file.toPath();

boolean isXlsx(Path path) {
    try (InputStream in = Files.newInputStream(path)) {
        byte[] magicCookie = new byte[2];
        return in.read(magicCookie) == 2
            && magicCookie[0] == 'P'
            && magicCookie[1] == 'K';
    } catch (IOException) {
        return false;
    }
}