我正在尝试使用纯 C# 和 Xlinq 而不是 Ooxml SDK更改包(Word 或 Excel 文档)的自定义属性的值。但是,它会损坏文件并且不会反映包中的更改。
有人可以建议这里有什么不正确的吗?
Package package = null;
try
{
package = Package.Open("NewCustomProp.docx", FileMode.OpenOrCreate, FileAccess.ReadWrite);
foreach (var packagePart in package.GetParts())
{
if (packagePart.ContentType == "application/vnd.openxmlformats-officedocument.custom-properties+xml")
{
var packageStream = packagePart.GetStream(FileMode.OpenOrCreate, FileAccess.ReadWrite);
using (StreamReader streamReader = new StreamReader(packageStream))
{
try
{
string ns = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties";
XDocument xDocument = XDocument.Parse(streamReader.ReadToEnd());
var properties = xDocument.Descendants(XName.Get("property", ns)).Where(x => x.Attribute(XName.Get("name")).Value == "NewCustomProp").ToList();
if (properties.Count > 0)
{
foreach (var currentProperty in properties)
{
var valueNode = currentProperty.Descendants().First();
valueNode.Value = "This is new value of Custom Property";
}
StringBuilder innerXmlSB = new StringBuilder();
xDocument.Nodes().ToList().ForEach(node => innerXmlSB.Append(node.ToString()));
string innerXml = innerXmlSB.ToString();
byte[] buffer = Encoding.UTF8.GetBytes(innerXml);
packageStream.Write(buffer, 0, buffer.Length);
//tried this as well
//xDocument.Save(packageStream);
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
}
}
}
}
package.Flush();
}
finally
{
package.Close();
}