zoukankan      html  css  js  c++  java
  • openxml 生成文件后,word2016打开失败,文件损坏问题解决办法。

    1、bug描述

    大概是今年年初,服务器上没有人更新过的word生成服务突然生成的文件,客户打不开了。

    2、排查错误

    由于是openxml生成文件印发的,所以第一时间查看了服务器升级补丁,是否与生成文件冲突,此种做法未果

    后来考虑到word模板是不是损坏了,以至于openxml读取模板文件后再save,导致文件损坏,此种办法无法解决问题

    后来我发现生成的文件居然word2013能够成功打开,而客户安装word2016就是打不开,另外wps也能打开,而且另存word之后,word2016能够正常打开。

    因此我怀疑是openxml类库版本太低了,于是下载了最新版本的sdk,结果费半天劲部署后,仍然不行。

    3、解决问题

    最后,我将精力聚焦在文件格式上,也尝试了大量的save方式无果。

    突然我在检测word文件时,发现word居然是2007版本的。

    于是我琢磨会不会2016打开2007有问题呢?如果将2007升级到2013会不会好些,于是着手写setting配置

    代码如下

            private static void AddSettingsToMainDocumentPart(MainDocumentPart part)
            {
                DocumentSettingsPart settingsPart = part.DocumentSettingsPart;
                if (settingsPart == null)
                    settingsPart = part.AddNewPart<DocumentSettingsPart>();
                settingsPart.Settings = new Settings(
                    new Compatibility(
                        new CompatibilitySetting()
                        {
                            Name = new EnumValue<CompatSettingNameValues>
                                (CompatSettingNameValues.CompatibilityMode),
                            Val = new StringValue("14"),
                            Uri = new StringValue("http://schemas.microsoft.com/office/word")
                        }
                    )
                );
                settingsPart.Settings.Save();
            }

    加入到save前执行

    //强制加入文件配置
    AddSettingsToMainDocumentPart(wordprocessingDocument.MainDocumentPart);

    wordprocessingDocument.MainDocumentPart.Document.Save();
    wordprocessingDocument.Dispose();

    编译后,生成文件,问题解决。

    4、感想

    不得不说,这是彻头彻尾的不想下兼容案例,当然可能与openxml内在架构也有关系,着实走了许多冤枉路。

    从高中时计算机老师就将微软公司做向下兼容毋庸置疑,因此也就有了这种惯性思维,结果才进了这个坑。

    以后考虑问题需要放弃之前固有成见,灵活测试问题,避免走入误区。

  • 相关阅读:
    如何在Eclipse中彻底修改一个项目名称
    用JS在html页面实现打印功能
    关于git提交、还原使用
    maven package:Max maven Unsupported major.minor version 51.0
    Tomcat 启动报错:javax.naming.NamingException: No naming context bound to this class loader
    maven web 项目中启动报错java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener
    tripwire检查文件完整性
    设置mysql表名不区分大小写
    mysql-零基础安装
    nginx-0基础安装篇
  • 原文地址:https://www.cnblogs.com/zcm123/p/14059584.html
Copyright © 2011-2022 走看看