openxml 生成文件后,word打开失败,文件损坏问题解决办法。

时间:2024-02-25 16:56:12

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

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

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