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

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

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(filename);

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

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

希望有帮助!

于 2013-02-10T20:17:40.697 回答