OpenXML文档,当没有扩展时,你怎么知道哪个是哪个

时间:2013-02-10 19:45:31

标签: c# openxml packaging

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

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更快/更容易,并且它有一个属性或可以为我检查它的东西。

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

2 个答案:

答案 0 :(得分: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;
    }

没有做过任何广泛的测试,但已经为我当前的文件工作了。

如果有人有一个很好的解决方案,我会将问题保持打开状态。

答案 1 :(得分:0)

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

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

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

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

希望有所帮助!