3

私が今やったこと、そしてどれがうまくいくかはこれです:

private string DetermineOpenXML(string file)
    {

        try
        {
            SpreadsheetDocument doc = SpreadsheetDocument.Open(file, false);
            doc.Close();
            return ".xslx";
        }
        catch
        {
            try
            {
                WordprocessingDocument doc = WordprocessingDocument.Open(file, false);
                doc.Close();
                return ".docx";
            }
            catch
            {
                try
                {
                    PresentationDocument doc = PresentationDocument.Open(file, false);
                    doc.Close();
                    return ".pptx";
                }
                catch
                {
                    return string.Empty;
                }
            }
        }
    }

試行錯誤以外に、どんなファイルなのかを知るにはもっと良い方法があるはずだと思います。問題は、私が小さなプログラムに取り組んでいるということです。それは、ファイル拡張子ファイルがどうあるべきかを見つけ出します。私がこれを行う理由は、データベースからファイルを持っているためです。ファイルは、拡張子なしで保存されることもあれば、間違った拡張子で保存されることもあります。

これらのファイルで行ったことは、すべてのOpenXMLドキュメントが同じファイル署名を共有していることを発見したことです: "50 4B 03 04 14 00 06 00"、これはzipファイルの署名に近く、OpenXMLを開くこともできますzipプログラムを使用してファイルを作成し、その内容を確認します。そして、これが私が目指すべき解決策かもしれません。OpenXMLSDKをより速く/より簡単に使用できること、そしてそれをチェックできるプロパティなどがあることを望んでいました。

編集:私は答えを追加しました、それが私の現在の目的のために働くとしても、私はまだより良い解決策があったかどうかを見たいです。拡張機能がテンプレートファイルである必要があることは考慮されていません。

4

2 に答える 2

3

代わりに System.IO.Packaging を使用することになりました。

private string anotherOpenXmlAttempt(string file)
    {
        string ext = string.Empty;
        Package package = Package.Open(file);
        if (package.PartExists(new Uri("/word/document.xml", UriKind.Relative)))
        {
            ext = ".docx";
        }
        else if (package.PartExists(new Uri("/xl/workbook.xml", UriKind.Relative)))
        {
            ext = ".xslx";
        }else if (package.PartExists(new Uri("/ppt/presentation.xml", UriKind.Relative)))
        {
            ext = ".pptx";
        }

        package.Close();
        return ext;
    }

大規模なテストは行っていませんが、現在のファイルでは機能しています。

誰かが良い解決策を持っている場合に備えて、質問を開いたままにします。

于 2013-02-10T20:53:12.907 に答える
0

私の OpenXMLSDK2 の経験からすると、ドキュメントの xml 内部を操作する方が便利です。拡張タイプだけが必要な場合は、次を使用しないでください。

文字列拡張子 = System.IO.Path.GetExtension(ファイル名);

try catch は、catch ブロックのすべての例外の詳細、スタック トレースなどを必要とするため、外部の詳細を決定するだけの高価なアプローチであることに注意してください。

また、Excel の拡張子タイプは .xslt ではなく .xslx です。つまり、「拡張可能なスタイルシート言語変換」です。

それが役立つことを願っています!

于 2013-02-10T20:17:40.697 に答える