【问题标题】:OpenXML documents, how do you know which is which, when there is no extention打开XML文档,怎么知道哪个是哪个,没有扩展名的时候
【发布时间】:2013-01-25 22:44:13
【问题描述】:

我现在做了什么,哪个有效:

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 文件的签名,我可以还可以使用 zip 程序打开 OpenXML 文件并查看其内容。也许这是我应该采用的解决方案,我只是希望使用 OpenXML SDK 会更快/更容易,并且它有一个属性或可以为我检查它的东西。

编辑: 我已经添加了一个答案,我仍然想看看是否有更好的解决方案,即使它适用于我目前的目的。它没有考虑扩展名应该是模板文件。

【问题讨论】:

    标签: c# openxml packaging


    【解决方案1】:

    我最终改用 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;
        }
    

    尚未进行任何广泛的测试,但已为我当前的文件工作。

    如果有人有好的解决方案,我会留下问题。

    【讨论】:

    • 这是一种更好的方法。
    • 是的,速度也更快,但不考虑它是否是模板文件,在我的情况下,这并不重要,因为文件现在至少会打开,因为文件将在正确的程序,但对于可能最终处于相同情况并需要模板的人来说,他们可能需要做更多的事情。
    • 你有没有找到比这更好的方法?
    • 应该是“.xlsx”,而不是“.xslx”...
    【解决方案2】:

    根据我对 OpenXMLSDK2 的经验,它对于操作文档的 xml 内部结构更有用。如果您只需要扩展类型,那么为什么不直接使用:

    string extension = System.IO.Path.GetExtension(filename);

    值得注意的是,try catch 是一种仅用于确定外部细节的昂贵方法,因为它需要 catch 块的所有异常细节、堆栈跟踪等。

    Excel 的扩展类型也是 .xslx 而不是 .xslt,即“可扩展样式表语言转换”

    希望有帮助!

    【讨论】:

    • dosn not that just give my extension, from the file基本上是filepath.Substring(LastIndexOf('.')),这是行不通的,因为我没有扩展名,我正在寻找为。
    • 是的,第二个效果更好,你甚至可以尝试在 pacakge 中循环查找字符串 "xl","word","ppt" 例如part.Uri.OriginalString.Split('/')[1] == "ppt" 因为它们总是以扩展类型开头,然后在你拥有它后从循环中中断。
    • 这听起来像是一个创造的想法,我相信有一个关键字的第一部分在索引 2 或 3,所以会有很短的循环
    • 我刚刚测试了它,我在 900 个文件上的方式花费了 7105275 个滴答声,而使用 split 花费了 11151623 个滴答声,它相当慢,猜想它需要一些时间来进行字符串操作
    猜你喜欢
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多