'How to determine excel file type(.xlsx or .xlsm) from file data

My application needs to save a byte[] to disk, the issue is that I know it is an excel file but not what the correct file extension is. Is there a way I can tell if the file is .xls or .xlsx or .xlsm from the data itself?



Solution 1:[1]

I ended up writing an extension method to determine the excel file type. This method is not perfect. It will only correctly detect a .xlsm file if the file has a macro.

private static string FindType(this byte[] file)
{
    using(MemoryStream ms = new MemoryStream(file))
    {
        var zf = new ZipArchive(ms, ZipArchiveMode.Read);
        if (zf.Entries.Any(e=>e.FullName.StartsWith("xl.")))
        {
            if (zf.Entries.Any(e=>e.FullName.Equals("xl/vbaProject.bin", StringComparison.InvariantCultureIgnoreCase)))
                return ".xlsm";
            else 
                return ".xlsx";
        }
    }

    return string.Empty;
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 mhussain