DocumentFormat.OpenXml 使用 MergeField 时版本 2.8 不工作
DocumentFormat.OpenXml Version 2.8 not working when using MergeField
我正在尝试用数据库中的文本替换 mergeField。我以前用 2.5 版做过这个,它工作得很好(.Net 框架 4)。我尝试通过将它与 .Net 标准一起使用来对 .Net Core 做同样的事情,但它给出了问题。我尝试调试并发现它没有找到插入到文档中的 mergeFields。所以我复制,清除文件并粘贴它然后它工作了。之后我尝试对其进行编辑,但更改没有反映出来。我再次尝试复制和粘贴,它是获取的相同合并字段。这很奇怪。这是一个代码片段。请帮忙
using (WordprocessingDocument _document = WordprocessingDocument.Open(filePath, true))
{
_document.ChangeDocumentType(WordprocessingDocumentType.Document);
_document.GetMergeFields("ref_no").ReplaceWithText(refNo);
_document.MainDocumentPart.Document.Save();
mergeFields = _document.MainDocumentPart.RootElement.Descendants<FieldCode>().ToList();
for (int i = 0; i < request.Data.Count; i++)
{
if (request.Data[i].ControlTypeId == (int)FormControlTypeEnum.DATE)
{
_document.GetMergeFields("v" + request.Data[i].Index.ToString().Trim()).ReplaceWithText(DateTime.Parse(request.Data[i].Data).ToShortDateString());
_document.MainDocumentPart.Document.Save();
}
else if (request.Data[i].ControlTypeId == (int)FormControlTypeEnum.MONEY)
{
_document.GetMergeFields( request.Data[i].Index.ToString().Trim()).ReplaceWithText(string.Format(formatter, "{0:c}", double.Parse(request.Data[i].Data)));
_document.MainDocumentPart.Document.Save();
}
else
{
_document.GetMergeFields(request.Data[i].Index.ToString().Trim()).ReplaceWithText(request.Data[i].Data);
_document.MainDocumentPart.Document.Save();
}
}
////document.GetMergeFields(newDoc.jsonFields[i].controlName).ReplaceWithText(newDoc.jsonFields[i].data);
////document.MainDocumentPart.Document.Save();
}
public static IEnumerable<FieldCode> GetMergeFields(this WordprocessingDocument doc, string mergeFieldName = null)
{
if (doc == null)
return null;
List<FieldCode> mergeFields = doc.MainDocumentPart.RootElement.Descendants<FieldCode>().ToList();
foreach (var header in doc.MainDocumentPart.HeaderParts)
{
mergeFields.AddRange(header.RootElement.Descendants<FieldCode>());
}
foreach (var footer in doc.MainDocumentPart.FooterParts)
{
mergeFields.AddRange(footer.RootElement.Descendants<FieldCode>());
}
if (!string.IsNullOrWhiteSpace(mergeFieldName) && mergeFields != null && mergeFields.Count() > 0)
return mergeFields.WhereNameIs(mergeFieldName);
return mergeFields;
}
我必须降级到较低版本的库才能正常工作
我正在尝试用数据库中的文本替换 mergeField。我以前用 2.5 版做过这个,它工作得很好(.Net 框架 4)。我尝试通过将它与 .Net 标准一起使用来对 .Net Core 做同样的事情,但它给出了问题。我尝试调试并发现它没有找到插入到文档中的 mergeFields。所以我复制,清除文件并粘贴它然后它工作了。之后我尝试对其进行编辑,但更改没有反映出来。我再次尝试复制和粘贴,它是获取的相同合并字段。这很奇怪。这是一个代码片段。请帮忙
using (WordprocessingDocument _document = WordprocessingDocument.Open(filePath, true))
{
_document.ChangeDocumentType(WordprocessingDocumentType.Document);
_document.GetMergeFields("ref_no").ReplaceWithText(refNo);
_document.MainDocumentPart.Document.Save();
mergeFields = _document.MainDocumentPart.RootElement.Descendants<FieldCode>().ToList();
for (int i = 0; i < request.Data.Count; i++)
{
if (request.Data[i].ControlTypeId == (int)FormControlTypeEnum.DATE)
{
_document.GetMergeFields("v" + request.Data[i].Index.ToString().Trim()).ReplaceWithText(DateTime.Parse(request.Data[i].Data).ToShortDateString());
_document.MainDocumentPart.Document.Save();
}
else if (request.Data[i].ControlTypeId == (int)FormControlTypeEnum.MONEY)
{
_document.GetMergeFields( request.Data[i].Index.ToString().Trim()).ReplaceWithText(string.Format(formatter, "{0:c}", double.Parse(request.Data[i].Data)));
_document.MainDocumentPart.Document.Save();
}
else
{
_document.GetMergeFields(request.Data[i].Index.ToString().Trim()).ReplaceWithText(request.Data[i].Data);
_document.MainDocumentPart.Document.Save();
}
}
////document.GetMergeFields(newDoc.jsonFields[i].controlName).ReplaceWithText(newDoc.jsonFields[i].data);
////document.MainDocumentPart.Document.Save();
}
public static IEnumerable<FieldCode> GetMergeFields(this WordprocessingDocument doc, string mergeFieldName = null)
{
if (doc == null)
return null;
List<FieldCode> mergeFields = doc.MainDocumentPart.RootElement.Descendants<FieldCode>().ToList();
foreach (var header in doc.MainDocumentPart.HeaderParts)
{
mergeFields.AddRange(header.RootElement.Descendants<FieldCode>());
}
foreach (var footer in doc.MainDocumentPart.FooterParts)
{
mergeFields.AddRange(footer.RootElement.Descendants<FieldCode>());
}
if (!string.IsNullOrWhiteSpace(mergeFieldName) && mergeFields != null && mergeFields.Count() > 0)
return mergeFields.WhereNameIs(mergeFieldName);
return mergeFields;
}
我必须降级到较低版本的库才能正常工作