2012-06-25 148 views
1

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

,我需要在读取Excel文档是XLS文件,所以我不需要在这个阶段阅读XLSX。我正在寻找一个可以在没有安装Excel的情况下在服务器上使用的库,因此它必须是独立的解决方案,最好是开源的。

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

UPDATE:

我因为从我读到它考虑使用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工作?

+0

我认为这将是更方便问关于'Color.ToHex()'例外单独的问题。 –

+0

谢谢,AnatoliiG。我得出了同样的结论,并已经就此提出了一个单独的问题。问题在这里:http://stackoverflow.com/questions/11198653/cannot-convert-theme-color-to-color-in-closedxml – BruceHill

+0

我很高兴'ClosedXml'适合你。 ;) –

回答

4

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

+1

+1 http://closedxml.codeplex.com/ – kenny

0

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

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; 
     } 
+0

如何获取单元格格式? –