2014-01-20 167 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)); 
        } 
       } 
      } 
     }