我正在寻找一个允许我在C#中阅读Excel文档的库,但我需要能够阅读单元格格式以及电子表格中的数据。我发现this useful question列出了许多用于阅读Excel文档的不同选择,但是这里提供的许多解决方案只允许读取电子表格的内容,而不是单元格属性(例如字体,背景颜色等) )。但是,对于我的特殊问题,我需要阅读包含大量单元格格式的文档,并且我需要能够读取此格式信息。
我需要阅读的Excel文档是 xls 文档,因此在此阶段我不需要阅读 xlsx 。我正在寻找一个可以在没有安装Excel的服务器上使用的库,因此它必须是一个独立的解决方案,最好是开源的。
是否有人有从 xls 文档中读取单元格格式信息的经验,并且可以建议一个有助于完成此任务的库?
更新:
我正在考虑使用ClosedXml,因为根据我所读到的内容,它似乎提供了我需要的功能。我正在使用此示例代码:
并且能够毫无问题地阅读Excel文档的内容。我只使用了此代码中的Categories示例,但已将两个categoryname单元格格式化为背景颜色。现在我想用ClosedXml做的是确定:
如果在特定单元格上定义了 Fill 背景颜色
如果已定义,则检索 Fill 的颜色(十六进制值即可)
以下是我尝试使用的一些代码:
// 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?
答案 0 :(得分:4)
答案 1 :(得分:0)
如果不需要免费,我强烈推荐Aspose.Cells
答案 2 :(得分:0)
我部分躲避您的要求,但您可以在服务器上转换xls-> xlsx,然后搜索(XPath)XML。也许xls-> openoffice calc可以大致相同。
答案 3 :(得分:0)
您可以使用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;
}