2

MS Office ファイルのみに指定されたカスタム プロパティを持つ.docxファイルがあります。 ファイルのプロパティ

MS Office がインストールされていないコンピューターで同じファイルを開こうとすると、[ファイルの詳細] タブに [タグ] プロパティが表示されません。

TagsC# コードを読み込む必要があります。

私はこの解決策を試し、Tagsインデックスを として取得しまし18た。次に、次のコードを使用しました。

public class TagsReader : ITagsReader
{
    private const int keywordsIndex = 18;

    public string Read(string filePath)
    {
        var fullPath = Path.GetFullPath(filePath);

        var directoryName = Path.GetDirectoryName(fullPath);
        Folder dir = GetShell32Folder(directoryName);
        var fileName = Path.GetFileName(fullPath);

        FolderItem item = dir.ParseName(fileName);
        return dir.GetDetailsOf(item, keywordsIndex);
    }

    private Folder GetShell32Folder(string folderPath)
    {
        var shellAppType = Type.GetTypeFromProgID("Shell.Application");
        var shell = Activator.CreateInstance(shellAppType);
        return (Folder)shellAppType.InvokeMember("NameSpace",
        BindingFlags.InvokeMethod, null, shell, new object[] { folderPath });
    }
}

ただし、MS Office がインストールされていないコンピューターでは機能しません。.docファイルに対してのみ機能し、 .docx. ここでInterop、安定性がなく、リソースを大量に消費し、MS Office をサーバーにインストールする必要があるベースのソリューションを使用しました。

public class WordTagsReader : ITagsReader
{
    private readonly string[] availableFileExtensions = { ".docx" };
    public string Read(string filePath)
    {
        var fileExtension = Path.GetExtension(filePath);
        if (!availableFileExtensions.Contains(fileExtension))
            return null;

        dynamic application = null;
        dynamic document = null;
        var tags = string.Empty;
        try
        {
            var typeWord = Type.GetTypeFromProgID("Word.Application");
            application = Activator.CreateInstance(typeWord);
            application.Visible = false;
            application.DisplayAlerts = false;
            var fullFilePath = Path.GetFullPath(filePath);
            document = application.Documents.Open(fullFilePath);
            tags = document.BuiltInDocumentProperties["Keywords"].Value;
        }
        finally
        {
            if (document != null)
            {
                document.Close();
                document = null;
            }
            if (application != null)
            {
                application.Quit();
                application = null;
            }
        }

        return tags;
    }
}

このコードはときどきクラッシュし、MS Word の実行中のインスタンスを残して、リソースとブロック ファイルを取得する可能性があります。多くのハンドラーが同時に動作しましたが、適切に動作しクリーンなリソースから「左」のインスタンスを分離することはできません。

これが、代替ソリューションを検索する理由です。Tagsを使用せずに特定の (カスタム) プロパティを読み取る方法はありOffice.Interopますか?

4

3 に答える 3

4

U はウォーム ランプ .docx 形式の読み取りを使用できます。このようなもの:

using System.IO.Packaging;

var package = Package.Open(ms, FileMode.Open, FileAccess.ReadWrite);
var corePart = package.GetPart(new Uri("/docProps/core.xml", UriKind.Relative))
XDocument settings;
using (TextReader tr = new StreamReader(settingsPart.GetStream()))
    settings = XDocument.Load(tr);

XNamespace cp = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties"
var tags = settings.Root.Element(cp + "keywords");

追加のライブラリや SDK を使用する必要はありません。System.IOのみ、ハードコアのみ!

于 2016-02-15T12:26:28.450 に答える
2

これにはOpen Xml Sdkを使用することをお勧めします。open xml はオフィスの「新しい」標準です。タグの読み取りは、次のコードで可能です: (これにはDocumentFormat.OpenXml.Packaging名前空間を使用する必要があることに注意してください)

string tags = "";
using(var doc = WordProcessingDocument.Open("filename",false)
    tags = doc.PackageProperties.KeyWords;

open xml を使用すると、マシンに Office 関連をインストールする必要がないため、サーバー上で使用したり、オフィスがインストールされていないマシンでドキュメントを読み取り/編集したりするのに最適です。

于 2016-02-15T12:07:39.427 に答える
2

Microsoft は現在、Office が不安定な動作を示す可能性があるため、無人の非対話型クライアント アプリケーションまたはコンポーネント (ASP、ASP.NET、DCOM、および NT サービスを含む) からの Microsoft Office アプリケーションの自動化を推奨しておらず、サポートもしていません。または、この環境で Office を実行するとデッドロックが発生します。

サーバー側のコンテキストで実行されるソリューションを構築している場合は、無人実行に対して安全になっているコンポーネントを使用するようにしてください。または、コードの少なくとも一部をクライアント側で実行できる代替手段を探す必要があります。サーバー側のソリューションから Office アプリケーションを使用する場合、アプリケーションは正常に実行するために必要な機能の多くを欠いています。さらに、ソリューション全体の安定性に関してリスクを負うことになります。詳細については、Office のサーバー側の自動化に関する考慮事項の記事を参照してください。

回避策として、Open XML SDK の使用を検討してください。詳細については、「 Office 用の Open XML SDK 2.5 へようこそ」を参照してください。または、サーバー側の実行用に設計されたサードパーティ コンポーネントを使用します。たとえば、Aspose を見てみましょう。

于 2016-02-15T12:45:32.680 に答える