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

我的问题可能看起来相当微不足道,但是尽pipe我进行了大量的研究,我还没有find答案。

.NET中有一种方法可以知道文件名是否是Excel电子表格?

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

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

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; } 

您需要读取文件标题字节,以确切知道它是什么types的文件。

这个库在这里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文件中find一个共同的签名。

我的猜测是,这个图书馆仍然工作得很好。 自2012年以来,我没有看到这些头文件发生了变化(最新版本)。

你可以创build一个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 }