我的问题似乎相当微不足道,但尽管我进行了大量研究,但我还没有找到答案。
在.NET中是否有办法知道文件名是否为Excel电子表格?
我对特定扩展名(.xls,.xlsx等)不感兴趣,我只想知道该文件是否是excel通用电子表格。
答案 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;
}