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内在架构也有关系,着实走了许多冤枉路。

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

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

  • 相关阅读:
    javascript 数字格式化
    spring-cloud blogs
    rabbitmq python
    centos7下 安装mysql
    hue install
    d3 document
    elastichq 离线安装
    elasticsearch agg
    elastichq auto connect
    Go Hello World!
  • 原文地址:https://www.cnblogs.com/zcm123/p/14059584.html
Copyright © 2011-2022 走看看