首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenXml sdk损坏的文档

OpenXml sdk损坏的文档
EN

Stack Overflow用户
提问于 2021-05-02 02:46:20
回答 1查看 28关注 0票数 1

我正在使用开放的xml sdk替换占位符,在stackoverflow帖子的帮助下,我找到了如何替换占位符的方法。更改这些占位符似乎是可行的,我可以在更改后的xml中检查这些占位符,但由于某些原因,文档似乎无论如何都已损坏。

我尝试过的:

更改我的docx zo ip解压并手动替换一些文本,然后返回到zip -> docx也损坏。

我的代码:

代码语言:javascript
运行
复制
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);


        }

简单的文本替换起作用了:差异检查:

有人知道为什么我的文档最后会损坏吗?

将.net 5.0与blazor前端配合使用

EN

Stack Overflow用户

回答已采纳

发布于 2021-05-02 16:11:25

您永远不会关闭或释放stream

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

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67349796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档