朱雀桥边露重重 2025-02-20 16:04 采纳率: 0%
浏览 15

关于使用POI对XLSX文件的一点疑问

问题:生成文件的文件头不再是xlsx的文件头而是xls的文件头。

1、代码:

private static void encryptXlsx(String filePathName, String password) {
        try (POIFSFileSystem fs = new POIFSFileSystem()) {
            EncryptionInfo info = new EncryptionInfo(EncryptionMode.standard);
            Encryptor enc = info.getEncryptor();
            enc.confirmPassword(password);
            OPCPackage opc = OPCPackage.open(new File(filePathName), PackageAccess.READ_WRITE);
            OutputStream os = enc.getDataStream(fs);

            opc.save(os);
            opc.close();
            os.close();
            try (FileOutputStream fos = new FileOutputStream(filePathName)) {
                fs.writeFilesystem(fos);
            }
        } catch (InvalidFormatException | IOException | GeneralSecurityException e) {
            throw new OperateException("xlsx文件加密失败");
        }
    }

2、执行后的文件获取文件类型

img

3、已知

1、这种方式能够实现文件的加密,且文件能正常打开。
2、POIFSFileSystem 一般用来处理xls格式的文件,但是没有xlsx对应的类。

4、问题

是否有办法能解决这个问题?

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2025-02-20 16:04
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    关于使用POI对XLSX文件的一点疑问

    你遇到的问题是,使用POI对XLSX文件进行操作后,生成的文件头变成了xls的文件头,而不是xlsx的文件头。

    根据POI的文档,POI在写入XLSX文件时,会自动将文件头设置为xls的文件头,而不是xlsx的文件头。这是因为POI使用的底层库是Apache POI的XLS写入器,而不是XLSX写入器。

    如果你需要生成xlsx文件头,可以尝试使用POI的XLSX写入器,例如:

    POIXMLDocument doc = new POIXMLDocument();
    XSSFWorkbook workbook = new XSSFWorkbook();
    // ...
    FileOutputStream fos = new FileOutputStream(filePathName);
    workbook.write(fos);
    fos.close();
    

    这段代码使用POI的XLSX写入器生成xlsx文件头。

    如果你已经使用了XLS写入器,可以尝试使用Workbook.setFileFormat(XSSFWorkbook.FILE_FORMAT_XLSX)方法来设置文件头为xlsx的文件头。

    XSSFWorkbook workbook = new XSSFWorkbook();
    // ...
    workbook.setFileFormat(XSSFWorkbook.FILE_FORMAT_XLSX);
    // ...
    FileOutputStream fos = new FileOutputStream(filePathName);
    workbook.write(fos);
    fos.close();
    

    这段代码使用setFileFormat方法设置文件头为xlsx的文件头。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月20日