0

Ooxml SDK の代わりにプレーンな C# と XLinq を使用して、パッケージ (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();
        }
4

1 に答える 1

1

申し訳ありませんが、C# についてはよくわかりませんが、これは VB.NET で Linq、XML リテラル、および IO.Packaging を使用して行う方法です (つまり、SDK は必要ありません)。

Imports System.IO
Imports System.IO.Packaging
Imports <xmlns:vt="http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes">
Imports System.Xml

Module Module1
    Sub Main()
        Dim docFilePath = "C:\Users\you\Documents\Doc2.docx"
        Using presentationPackage As Package = Package.Open(docFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite)
            Dim uriCustom = New Uri("/docProps/custom.xml", UriKind.Relative)
            Dim customPart = presentationPackage.GetPart(uriCustom)
            Dim customStream = New StreamReader(customPart.GetStream)

            Dim custom = XDocument.Load(customStream)
            Dim customProperties = custom.Root.Elements.<vt:lpwstr>

            For Each prop In customProperties
                prop.Value = "My New Custom Value"
            Next

            Using xw As XmlWriter = XmlWriter.Create(customPart.GetStream(FileMode.Create, FileAccess.Write))
                custom.Save(xw)
            End Using
        End Using
    End Sub

End Module

これ<vt:lpwstr>は、「テキスト」タイプのカスタム プロパティ用です。値を直接変更するだけです。正確な顧客プロパティを照会したり、カスタム プロパティの名前などを変更したり、別のタイプで作業したりする場合は、以下のコードの一部を変更する必要があります。

于 2012-08-15T22:23:03.883 に答える