【问题标题】:How to identify and write an excel file with .xls extension which has .xlsx content如何识别和编写扩展名为 .xls 且内容为 .xlsx 的 excel 文件
【发布时间】:2018-11-25 05:13:53
【问题描述】:

我正在将内容从一个 DMS(文件网)迁移到另一个(Webcenter 内容), 在这个过程中,我在 Filenet 中遇到了一个扩展名为 .xls(内容类型为 application/vnd.ms-excel)的 excel 文件。

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

问题是当我下载并打开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();    

}

谢谢, 拉胡尔·杜帕拉

【问题讨论】:

  • 我刚刚google了一下,发现Apache POI library可以用java打开MS Office文档。您可以尝试使用该库打开文件,如果它对您大喊大叫,您就知道该文件是错误的

标签: java xlsx xls webcenter


【解决方案1】:

由于 .xslx 是 zip 格式,前两个字节(魔术 cookie)应该是“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;
    }
}

【讨论】:

  • 非常感谢 Joop Eggen,我试过了,它确实让我恢复了真实。但是在将 WCC.xls 文件写为 WCC.xlsx(基于 isXlsx)后,该文件没有完全打开,它的编辑器说它已损坏并且无法打开,我尝试找到它返回给我的 FN1.xls 文件的 MIME 类型“ application/octet-stream”作为 MIME 类型,假设文件为二进制数据,我应该在写入文件时做任何额外的事情,而不仅仅是更改扩展名。提取 MIME 的代码感谢 Rahul D
  • 您可以将原始 .xls 文件(我希望您保留一份副本)重命名为 .zip 以查看它。 Mime 类型application/octet-stream 只是“二进制数据”(八位字节=字节)的另一个绰号。所以你有一个有效的 .xls 可通过 Excel 打开,它是 zip 格式,但 .xlsx 不可读 - 很奇怪。检查拉链,也许有一些线索。
  • 问题已解决,我正在重新读取导致数据丢失的同一流,但我现在也可以看到 .xlsx 文件的内容。谢谢你帮助乔普·埃根
猜你喜欢
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 2021-08-28
  • 2015-05-26
  • 1970-01-01
相关资源
最近更新 更多