2016-09-06 93 views
0

我有一種情況,用戶可以上傳包含某些屬性的佔位符的Word文檔(例如,用戶已經進入插入>快速部件>文檔屬性並選擇了MS Word一個財產)。我想支持的具體屬性是Title,Author,CompanyPublish Date如何使用OpenXML在Word文檔中設置發佈日期

TitleAuthor被設置爲包屬性,並且Company被設置爲擴展文件屬性。這些設置與下面的代碼,它工作正常:

private static void SetDocumentProperties(ReportTemplateModel model, WordprocessingDocument wordDocument) 
{ 
    //these properties always exist 
    wordDocument.PackageProperties.Title = model.Title; 
    wordDocument.PackageProperties.Creator = model.Author; 
    wordDocument.PackageProperties.Created = DateTime.Now; 
    wordDocument.PackageProperties.Modified = DateTime.Now; 

    //these properties can be null 
    if (wordDocument.ExtendedFilePropertiesPart == null) 
    { 
     wordDocument.AddNewPart<ExtendedFilePropertiesPart>(); 
    } 
    if (wordDocument.ExtendedFilePropertiesPart.Properties == null) 
    { 
     wordDocument.ExtendedFilePropertiesPart.Properties = new Properties(new Company(model.SiteName)); 
    } 
    else 
    { 
     wordDocument.ExtendedFilePropertiesPart.Properties.Company = new Company(model.SiteName); 
    } 
} 

我的問題是,我無法工作,如何將設置Publish Date屬性。我曾嘗試使用下面的代碼(它是從https://www.snip2code.com/Snippet/292005/WDSetCustomProperty改編的)將其添加爲自定義文件屬性,但這不起作用。我已經閱讀了一些關於設置自定義屬性的內容,但我很困惑它們是如何工作的。我也不確定Publish Date應該實際設置爲自定義屬性還是其他類型的屬性。

var customProps = wordDocument.CustomFilePropertiesPart; 
if (customProps == null) 
{ 
    customProps = wordDocument.AddCustomFilePropertiesPart(); 
    customProps.Properties = new DocumentFormat.OpenXml.CustomProperties.Properties(); 
} 
var properties1 = new DocumentFormat.OpenXml.CustomProperties.Properties(); 

//I have tried both of these lines, neither worked. 
//properties1.AddNamespaceDeclaration("op", "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"); 
properties1.AddNamespaceDeclaration("vt", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); 

var customDocumentProperty1 = new DocumentFormat.OpenXml.CustomProperties.CustomDocumentProperty() 
{ 
    FormatId = "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}", 
    PropertyId = 2, 
    Name = "Publish Date" 
}; 

customDocumentProperty1.Append(new DocumentFormat.OpenXml.VariantTypes.VTLPWSTR { Text = DateTime.Today.ToShortDateString() }); 

properties1.Append(customDocumentProperty1); 

part.Properties = properties1; 

Publish Date應該被設置爲什麼類型的屬性,以及什麼是正確的語法來設置它?

更新:我發現Publish Date是可以使用下面的代碼片段創建一個CoverPageProperty,但我還沒有找到如何在文檔中正確設置。

var coverPageProps = new DocumentFormat.OpenXml.Office.CoverPageProps.CoverPageProperties 
{ 
    PublishDate = new PublishDate(DateTime.Today.ToShortDateString()) 
}; 

回答

0

將下面的代碼添加到我的SetDocumentProperties方法似乎工作。我必須承認我不完全理解下面的代碼,所以任何解釋都會受到歡迎。此外,如果任何人有一個解決方案,不包括在C#中將XML編寫爲字符串,我寧願避免這種情況。

const string publishDatePartId = "publishDatePart"; 

var publishDateXmlPart = wordDocument.MainDocumentPart.AddNewPart<CustomXmlPart>("application/xml", publishDatePartId); 

var writer = new XmlTextWriter(publishDateXmlPart.GetStream(FileMode.Create), System.Text.Encoding.UTF8); 

writer.WriteRaw($"<CoverPageProperties xmlns=\"http://schemas.microsoft.com/office/2006/coverPageProps\">" + 
       $"<PublishDate>{DateTime.Today.ToShortDateString()}</PublishDate>" + 
       $"</CoverPageProperties>"); 

writer.Flush(); 

writer.Close(); 

var customXmlPropertiesPart = publishDateXmlPart.AddNewPart<CustomXmlPropertiesPart>(publishDatePartId); 

customXmlPropertiesPart.DataStoreItem = new DocumentFormat.OpenXml.CustomXmlDataProperties.DataStoreItem() 
{ 
    //I don't know what this ID is, but it seems to somehow relate to the Publish Date 
    ItemId = "{55AF091B-3C7A-41E3-B477-F2FDAA23CFDA}" 
}; 
相關問題