2015-02-08 152 views
4

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

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

回答

4

LinqToExcel支持xlsb以及xls和xlsx。

这个库的基本用法是这样的:

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

More detailed tutorial

+0

它应该是一个评论,没有回答。 – 2015-02-08 20:13:01

+1

尽管此链接可能回答此问题,但最好在此处包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 – PiotrWolkowski 2015-02-08 21:09:45

+0

非常感谢informatin Rob。我不太确定客户是否会选择全新的解决方案,但我会仔细研究一下。 – 2015-02-08 21:22:33

2

最快和最简单的解决方法是使用你已经取得了各项产品。

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

我建议您尽可能使用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); 
     } 
    } 
} 
+1

感谢您的信息Aalawlx。我不确定他们是否想要通过引入Open XML SDK来更改现有代码,但让我尝试使用您提到的方法。再次感谢。 – 2015-02-08 21:21:18