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内在架构也有关系,着实走了许多冤枉路。
从高中时计算机老师就将微软公司做向下兼容毋庸置疑,因此也就有了这种惯性思维,结果才进了这个坑。
以后考虑问题需要放弃之前固有成见,灵活测试问题,避免走入误区。