在C#中读取Excel xlsb文件

我的项目有一个新的要求来读取各种types的Excel文件。 我能够使用Codeplex的ExcelDataReader DLL读取.xls和.xlsx文件。 问题是当我尝试读取.xlsb文件。 ExcelDataReader无法读取.xlsb文件。 除了在基于服务器的应用程序中使用Microsoft.Office.Interop.Excel dll之外,是否还有其他有效的方式来读取xlsb文件?

 IExcelDataReader excelReader = fileName.EndsWith(".xlsx") ? ExcelReaderFactory.CreateOpenXmlReader(stream) : ExcelReaderFactory.CreateBinaryReader(stream); while (excelReader.Read()) { //myStuff read the file } 

LinqToExcel支持xlsb以及xls和xlsx。

这个库的基本用法如下所示:

 using (var excelQueryFactory = new ExcelQueryFactory(filePath)) { //access your worksheet LINQ way var worksheet = excelQueryFactory.Worksheet("worksheetName").Where(...); } 

更详细的教程

最快最容易的解决scheme是使用您已经制作的产品。

只需使用Excel Interop进行保存即可将xlsb转换为xlsx,然后照常读取新文件。 通常我不会推荐使用Excel Interop,因为它非常慢,但是对于只是转换文件而言,它足够快(假设条件正常)。

我build议您尽可能使用Office Open XML SDK来读取生成的xml文件。

这是我之前做的一个:

 public class XlConversion { public static void MarshalReleaseComObject(object comObject) { if ((comObject != null) && (Marshal.IsComObject(comObject))) { Marshal.ReleaseComObject(comObject); } } public static void ConvertTsvToExcel(string inputFullPath, string outputExcelFullPath, bool deleteInput = false) { if (String.IsNullOrWhiteSpace(inputFullPath)) { throw new ArgumentOutOfRangeException(nameof(inputFullPath)); } if (String.IsNullOrWhiteSpace(outputExcelFullPath)) { throw new ArgumentOutOfRangeException(nameof(outputExcelFullPath)); } var inputFilename = new FileInfo(inputFullPath); var xlFilename = new FileInfo(outputExcelFullPath); const int maxSupportedXlFilenameLength = 218; if (xlFilename.FullName.Length > maxSupportedXlFilenameLength) { throw new ArgumentOutOfRangeException(nameof(outputExcelFullPath), outputExcelFullPath, ("The full path filename (" + xlFilename.FullName.Length + " characters) is longer than Microsoft Excel supports (" + maxSupportedXlFilenameLength + " characters)")); } var excelApp = new Application(); Workbooks wbs = excelApp.Workbooks; Workbook wb = wbs.Open(inputFilename.FullName); wb.SaveAs(xlFilename.FullName, XlFileFormat.xlOpenXMLWorkbook); try { wb.Close(); //excel.Quit(); } finally { GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); MarshalReleaseComObject(wb); MarshalReleaseComObject(wbs); MarshalReleaseComObject(excelApp); } if (deleteInput) { File.Delete(inputFilename.FullName); } } }