在C#中读取Excel xlsb文件

5

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

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

5

LinqToExcel支持xlsb、xls和xlsx格式。

这个库的基本用法如下:

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

更详细的教程


1
这应该是一条注释,而不是答案。 - user2160375
非常感谢你的信息,Rob。我不太确定客户是否会选择全新的解决方案,但我会好好研究一下。 - Kaushik Das
这个回答从问题的标题一直到上面的最后一句话都回答了这个问题。虽然提问者提供了代码和库,但并不意味着它是问题的一部分。"读取xlsb的任何其他有效方法"就已经说明了一切,因此这是一个很好的答案。 - Jason Foglia
1
它依赖于Microsoft.ACE.OLEDB.12.0,该组件可能未安装在计算机上。 - Muflix

4

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

只需使用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来更改现有的代码,但让我尝试使用您提到的方法。再次感谢您。 - Kaushik Das

1
"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文件快照

Source XLSB file to be read using Aspose.Cells API

Aspose.Cells C#代码生成的控制台输出快照 使用Aspose.Cells API读取Excel XLSB文件生成的控制台输出


我之前发现了这个产品,但是很遗憾Aspose的定价不适用于我的项目。虽然这个产品非常好。 - user13770736

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接