【问题标题】:Reading Excel xlsb files in C#在 C# 中读取 Excel xlsb 文件
【发布时间】:2015-02-08 19:01:56
【问题描述】:

我的项目有一个新的要求是读取各种类型的 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
}

【问题讨论】:

    标签: c# excel exceldatareader


    【解决方案1】:

    最快和最简单的解决方案是使用您已经制作的产品。

    只需使用 Excel Interop 进行另存为,将 xlsb 转换为 xlsx,然后照常读取新文件。通常我不建议使用 Excel 互操作,因为它非常慢,但对于仅转换文件来说已经足够快了(假设正常情况下)。

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

    【讨论】:

    • 感谢 Aalawlx 的信息。我不确定他们是否想通过引入 Open XML SDK 来更改现有代码,但让我尝试使用您提到的方法。再次非常感谢。
    【解决方案2】:

    LinqToExcel 支持 xlsb 以及 xls 和 xlsx。

    这个库的基本用法如下:

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

    More detailed tutorial

    【讨论】:

    • 应该是评论,而不是回答。
    • 非常感谢 Rob 提供的信息。我不太确定客户是否会寻求全新的解决方案,但我会看看它。
    • 这回答了问题,从标题到问题的最后一句。虽然提出问题的人提供了代码和库,但这并不意味着它是问题的一部分。 “任何其他有效的读取 xlsb 的方式”说明了一切,因此这是一个很好的答案。
    • 它依赖于Microsoft.ACE.OLEDB.12.0,可能没有安装在计算机上。
    【解决方案3】:

    Aspose.Cells API 可以方便地读取 XLSB 文件数据。除了 XLSB,所有其他 Excel 格式,例如XLS、XLSX、XLSM等数据,只需很少的代码即可轻松读取。

    为了演示,请看下面的C#代码,代码中使用的源XLSB文件和代码生成的控制台输出参考。

    C#

    // Print message on Console
    Console.WriteLine("Reading XLSB file in C# using Aspose.Cells API.");
    Console.WriteLine("----------------------------------------------");
    
    // Directory path of input and output files.
    string dirPath = "D:/Download/";
    
    // Load your source XLSB file inside the Aspose.Cells Workbook object.
    Workbook wb = new Workbook(dirPath + "Source.xlsb");
    
    // Access first worksheet.
    Worksheet ws = wb.Worksheets[0];
    
    // Access cells enumarator
    System.Collections.IEnumerator iEnum = ws.Cells.GetEnumerator();
    
    // Print the cells data in while loop on console.
    while(iEnum.MoveNext())
    {
        Cell cell = (Cell)iEnum.Current;
        Console.WriteLine(cell.Value);
    }
    

    控制台输出

    Reading XLSB file in C# using Aspose.Cells API.
    ----------------------------------------------
    This is C3 data.
    This is J4 data.
    This is F6 data.
    This is D9 data.
    This is H10 data.
    This is G15 data.
    This is L17 data.
    This is B20 data.
    

    在 Aspose.Cells C# 代码中使用的源 XLSB 文件的快照

    Aspose.Cells C# 代码生成的控制台输出快照

    【讨论】:

    • 我很早就发现了这个,不幸的是,我的项目不会定价。虽然产品很棒。
    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多