在C#中读取Excel数据和单元格格式

我正在寻找一个库,允许我在C#中读取Excel文档,但是我需要能够读取单元格格式以及电子表格中的数据。 我发现这个有用的问题列出了许多用于阅读Excel文档的不同select,但是这里提供的许多解决scheme只允许读取电子表格的内容,而不是单元格属性(例如字体,背景颜色等)。 但是,对于我的特定问题,我需要阅读包含大量单元格格式的文档,并且需要能够读取此格式的信息。

我需要阅读的Excel文档是一个xls文档,所以在这个阶段我不需要阅读xlsx 。 我正在寻找一个可以在没有安装Excel的服务器上使用的库,所以它必须是一个独立的解决scheme,最好是开源的。

有没有人有从xls文档阅读单元格格式信息的经验,并可以build议一个库,将有助于完成这项任务?

更新:

我正在寻找使用ClosedXml,因为从我已阅读它,它似乎提供了我所需要的function。 我正在从这个示例代码工作:

http://closedxml.codeplex.com/wikipage?title=Finding%20and%20extracting%20the%20data&referringTitle=Documentation

并能够正常阅读Excel文档的内容。 我只使用了这个代码中的类别示例,但是将两个类别名称单元格格式化为背景颜色。 现在我正在尝试使用ClosedXml来确定:

  • 如果在特定的单元格上定义了填充背景颜色

  • 如果已经定义,检索填充的颜色(hex值将做)

以下是我尝试使用的一些代码:

// Get all categories while (!categoryRow.Cell(coCategoryId).IsEmpty()) { IXLCell categoryName = categoryRow.Cell(coCategoryName); try { categories.Add(categoryName.GetString() + " " + categoryName.Style.Fill.BackgroundColor.Color.ToHex()); } catch { categories.Add(categoryName.GetString() + " None"); } categoryRow = categoryRow.RowBelow(); } 

但是代码

 categoryName.Style.Fill.BackgroundColor.Color.ToHex() 

总是抛出“给定的钥匙不在字典里”。 ,即使对于有背景颜色定义的单元格。 任何人有任何想法如何得到这与ClosedXml的工作?

OpenXml和它的包装 – ClosedXml给你很多有用的function。

如果它不需要免费,我强烈build议Aspose.Cells

我部分隐藏你的需求,但你可以在服务器上转换xls-> xlsx,然后search(XPath)XML。 也许xls-> openoffice calc可以做大致相同的事情。

您可以使用Microsoft.Office.Interop.Excel

 var workbookPath = ""; var worksheetName = ""; var applicationClass = new Application(); var workbook = applicationClass.Workbooks.Open(workbookPath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing , Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); var worksheet = workbook.GetWorksheet(worksheetName); var usedRange = worksheet.UsedRange; var columnRangeIndexColumn= 1; for (int i = beginIndexRow; i <= usedRange.Rows.Count; i++) { var columnRange = usedRange.Cells[i, columnRangeIndexColumn]; var value= columnRange.Value2; } use this extension public static Worksheet GetWorksheet(this Workbook value, string name) { foreach (Worksheet worksheet in value.Worksheets) { if (worksheet.Name == name) { return worksheet; } } return value.ActiveSheet; }