有没有办法知道文件名是否是Excel格式?

时间:2014-03-06 10:42:34

标签: c# .net vb.net excel spreadsheet

我的问题似乎相当微不足道,但尽管我进行了大量研究,但我还没有找到答案。

在.NET中是否有办法知道文件名是否为Excel电子表格?

我对特定扩展名(.xls,.xlsx等)不感兴趣,我只想知道该文件是否是excel通用电子表格。

3 个答案:

答案 0 :(得分:4)

您需要读取文件Header字节,以便确切地知道它是什么类型的文件。

此库FileTypeDetective完全符合您的要求,但看起来项目已不再有效。无论如何,一旦你明白了它就可以很容易地进行调整/纠正。

请参阅:

// MS Office files
        public readonly static FileType WORD = new FileType(new byte?[] { 0xEC, 0xA5, 0xC1, 0x00 }, 512, "doc", "application/msword");
        public readonly static FileType EXCEL = new FileType(new byte?[] { 0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05, 0x00 }, 512, "xls", "application/excel");
        public readonly static FileType PPT = new FileType(new byte?[] {0xFD, 0xFF, 0xFF, 0xFF, null, 0x00, 0x00, 0x00  }, 512, "ppt", "application/mspowerpoint");

您所要做的就是在所有Excel文件中找到一个共同的签名。

我的猜测是这个库仍然运行良好。我认为自2012年(上一版本)以来,这些标题没有任何改变。

答案 1 :(得分:1)

您可以创建try-catch语句,看看Excel是否可以打开文件:

using Microsoft.Office.Interop.Excel;

....

try
{
    Application app = new Application();
    Workbook book = app.Workbooks.Open(@workbookPath); //@workbookpath is the file path
}
catch
{
    //Excel encountered an error opening the file at the path
}

答案 2 :(得分:1)

很久以前,我在这里写了类似的代码:

private enum Extensions
{
    Unknown = 0,
    DocOrXls,
    Pdf,
    Jpg,
    Png,
    DocxOrXlsx,
}

private static readonly Dictionary<Extensions, string> ExtensionSignature = new Dictionary<Extensions, string>
    {
        {Extensions.DocOrXls, "D0-CF-11-E0-A1-B1-1A-E1"},
        {Extensions.Pdf, "25-50-44-46"},
        {Extensions.Jpg, "FF-D8-FF-E"},
        {Extensions.Png, "89-50-4E-47-0D-0A-1A-0A"},
        {Extensions.DocxOrXlsx, "50-4B-03-04-14-00-06-00"}
    };

private static string GetExtension(byte[] bytes)
{
    if (bytes.Length < 8)
        return string.Empty;
    var signatureBytes = new byte[8];
    Array.Copy(bytes, signatureBytes, signatureBytes.Length);
    string signature = BitConverter.ToString(signatureBytes);
    Extensions extension = ExtensionSignature.FirstOrDefault(pair => signature.Contains(pair.Value)).Key;
    switch (extension)
    {
        case Extensions.Unknown:
            return string.Empty;
        case Extensions.DocOrXls:
            if (bytes.Length < 512)
                break;
            signatureBytes = new byte[4];
            Array.Copy(bytes, 512, signatureBytes, 0, signatureBytes.Length);
            signature = BitConverter.ToString(signatureBytes);
            if (signature == "EC-A5-C1-00")
                return ".doc";
            return ".xls";
        case Extensions.Pdf:
            return ".pdf";
        case Extensions.Jpg:
            return ".jpg";
        case Extensions.Png:
            return ".png";
        case Extensions.DocxOrXlsx:
            string fileBody = Encoding.UTF8.GetString(bytes);
            if (fileBody.Contains("word"))
                return ".docx";
            if (fileBody.Contains("xl"))
                return ".xlsx";
            break;
        default:
            throw new ArgumentOutOfRangeException();
    }
    return string.Empty;
}