微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OpenXml sdk 损坏的文件

如何解决OpenXml sdk 损坏的文件

我正在使用 open xml sdk 来替换占位符,在 stackoverflow 帖子的许多帮助下,我找到了如何替换占位符的方法。更改这些占位符似乎有效,我可以检查更改后的 xml,但由于某种原因,无论如何该文档似乎已损坏。

我尝试了什么:

更改我的 docx zo ip 提取并手动替换一些文本并返回到 zip -> docx 也已损坏。

我的代码

public void GenerateInvoice(Templateviewmodel viewmodel)
        {
            //step,copy file -> read document return body -> change body -> save body -> convert to pdf
            
            
            //read document
            var wordReader = new DocumentReader();
            //var result = wordReader.Reader(@"D:/apps/DeigonAccountancy/DeigonAccountancy/Deigon.Frontend.Blazor/Files/invoiceTemplate.docx",@"D:/apps/DeigonAccountancy/DeigonAccountancy/Deigon.Frontend.Blazor/Files/" + (viewmodel.Client.FirstName + "-" + viewmodel.Client.LastName) + ".docx");
            
            if (!File.Exists(@"D:/apps/DeigonAccountancy/DeigonAccountancy/Deigon.Frontend.Blazor/Files/invoiceTemplate.docx"))
            {
                throw new FileNotFoundException("tbesta ni kloot");
            }

            File.copy(@"D:/apps/DeigonAccountancy/DeigonAccountancy/Deigon.Frontend.Blazor/Files/invoiceTemplate.docx",@"D:/apps/DeigonAccountancy/DeigonAccountancy/Deigon.Frontend.Blazor/Files/" + (viewmodel.Client.FirstName + "-" + viewmodel.Client.LastName) + ".docx",false);

            var stream = File.Open(@"D:/apps/DeigonAccountancy/DeigonAccountancy/Deigon.Frontend.Blazor/Files/" + (viewmodel.Client.FirstName + "-" + viewmodel.Client.LastName) + ".docx",FileMode.Open);
            
            List<string> innerTexts = new List<string>();
            using (WordprocessingDocument wordDocument = WordprocessingDocument.Open(stream,true))
            {
                //replace item
                var elements = wordDocument.MainDocumentPart.Document.Body.Descendants<SdtElement>().ToList();

                foreach (var item in elements)
                {
                    switch (item.InnerText)
                    {
                        case nameof(TemplateOptions.UserDivision):
                            //replace alias
                            //var alias = item.Descendants<SdtAlias>().FirstOrDefault();
                            //alias.Val.Value = viewmodel.Category.Name;

                            //replace child element
                            //var run = item.Descendants<SdtContentRun>().FirstOrDefault();

                            //run.Parent.ReplaceChild(new Run(new Text(viewmodel.Category.Name)),run);

                            //var innerRun = run.Descendants<Run>().FirstOrDefault();
                            //var text = run.Descendants<Text>().FirstOrDefault();
                            //text.Text = viewmodel.Category.Name;


                            var runs = wordDocument.MainDocumentPart.Document.Body.Descendants<Run>().FirstOrDefault();

                            var text = runs.Descendants<Text>().FirstOrDefault();
                            text.Text =  text.Text.Replace("DEIGON","TEST");
                            
                            break;

                        case nameof(TemplateOptions.ClientAddress):
                            break;

                        case nameof(TemplateOptions.ClientCompany):
                            break;

                        case nameof(TemplateOptions.ClientVat):
                            break;

                        case nameof(TemplateOptions.HourlyRate):
                            break;

                        case nameof(TemplateOptions.InvoiceComments):
                            break;

                        case nameof(TemplateOptions.InvoiceDate):
                            break;

                        case nameof(TemplateOptions.InvoiceHours):
                            break;

                        case nameof(TemplateOptions.InvoiceId):
                            break;

                        case nameof(TemplateOptions.InvoicePrice):
                            break;

                        case nameof(TemplateOptions.InvoicetotalExclusive):
                            break;

                        case nameof(TemplateOptions.InvoicetotalInclusive):
                            break;

                        case nameof(TemplateOptions.InvoicetotalVat):

                            break;

                        case nameof(TemplateOptions.UserBIC):
                            break;

                        case nameof(TemplateOptions.UserIBAN):
                            break;

                        case nameof(TemplateOptions.UserRightsPolicy):
                            break;

                        default:
                            break;

                    }
                }

                wordDocument.Save();
            }            

            //wordReader.SaveChanges(@"D:/apps/DeigonAccountancy/DeigonAccountancy/Deigon.Frontend.Blazor/Files/" + (viewmodel.Client.FirstName + "-" + viewmodel.Client.LastName) + ".docx",result);


        }

简单的文本替换有效: 差异检查:

Photo

有谁知道为什么我的文档最后损坏了?

使用 .net 5.0 和 blazor 前端

解决方法

您永远不会关闭或处理 stream

最简单的解决方案是使用 WordprocessingDocument.Open(<fileName>,...) 重载并消除流。否则,给流自己的 using() { } 块..

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。