1

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

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

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

更新:

我正在考虑使用 ClosedXml,因为从我所阅读的内容来看,它似乎提供了我需要的功能。我正在使用此示例代码:

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

并且能够毫无问题地读取 Excel 文档的内容。我只使用了此代码中的类别示例,但已将两个类别名称单元格格式化为具有背景颜色。现在我想用 ClosedXml 做的是确定:

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

  • 如果已定义,则检索填充的颜色(十六进制值即可)

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

// 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 来实现它?

4

4 回答 4

5

OpenXml及其包装器 -ClosedXml为您提供许多有用的功能。

于 2012-06-25T12:05:28.800 回答
0

如果它不需要免费,我强烈推荐Aspose.Cells

于 2012-06-25T12:07:24.250 回答
0

我部分回避了您的要求,但您可以在服务器上转换 xls->xlsx,然后搜索(XPath)XML。也许 xls->openoffice calc 可以做大致相同的事情。

于 2012-06-25T12:10:35.157 回答
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;
        }
于 2012-06-25T12:10:54.683 回答