2014-01-20 166 views
0

我正在研究这个程序,它将读取excel文件中的数据并将其放入我们的数据库中。该程序使用C#编写在Visual Studio 2010中,我正在使用NPOI库。阅读Excel单元格格式

在过去,我能够逐行读取电子表格并逐个单元格地获取数据,但excel文件的新格式不会让我轻松完成此操作。 (excel是由其他用户提供的,所以我不能对它做出重大修改)。

在一张表中有几个“表”(每个列名使用边框和标题),我将需要主要从表中获取数据,但有时也需要从表中获取数据。

我想知道如果我要逐行阅读电子表格(这是我有点熟悉的),有没有一种方法可以告诉我已经到达表格了?有没有一种方法可以读取单元格的“格式”?

我的意思是,例如,“该小区周围有边框,以便开始此行的表。”或“在此单元格中的文本是勇敢的,所以此行是此标题行新表

在过去,我只能读取电子表格的”文本“,而不能读取格式/样式。我一直在互联网上搜索,我只能找到如何设置输出excel的样式,而不是如何从输入中读取格式。

任何帮助表示赞赏,谢谢!

回答

2

将源工作簿中的各个表定义为具有已知名称的命名范围会更好。然后你就可以得到这样的相关的区域 -

using System.IO; 
using System.Windows; 
using NPOI.SS.UserModel; 
using NPOI.XSSF.UserModel; 

// ... 
     using (var file = new FileStream(workbookLocation, FileMode.Open, FileAccess.Read)) 
     { 
      var workbook = new XSSFWorkbook(file); 
      var nameInfo = workbook.GetName("TheTable"); 
      var tableRange = nameInfo.RefersToFormula; 
      // Do stuff with the table 
     } 

如果你有源电子表格无法控制,不能定义表的命名范围,你的建议,你可以阅读的单元格格式。这里是一个阅读TopBorder风格的例子 -

 using (var file = new FileStream(workbookLocation, FileMode.Open, FileAccess.Read)) 
     { 
      var workbook = new XSSFWorkbook(file); 
      var sheet = workbook.GetSheetAt(0); 

      for (int rowNo = 0; rowNo <= sheet.LastRowNum; rowNo++) 
      { 
       var row = sheet.GetRow(rowNo); 
       if (row == null) // null is when the row only contains empty cells 
        continue; 
       for (int cellNo = 0; cellNo <= row.LastCellNum; cellNo++) 
       { 
        var cell = row.GetCell(cellNo); 
        if (cell == null) // null is when the cell is empty 
         continue; 
        var topBorderStyle = cell.CellStyle.BorderTop; 
        if (topBorderStyle != BorderStyle.None) 
        { 
         MessageBox.Show(string.Format("Cell row: {0} column: {1} has TopBorder: {2}", cell.Row.RowNum, cell.ColumnIndex, topBorderStyle)); 
        } 
       } 
      } 
     }