2017-01-15 48 views
1

我希望能夠從特定行(例如,A2到列A中使用的最後一行)中獲取列中使用的行數。在特定列Excel Interop C中獲取行計數(來自特定行)

我嘗試下面的代碼,但無法得到期望的結果(即,應該得到4,但有5行)

enter image description here

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
using Excel = Microsoft.Office.Interop.Excel; 

namespace excel_interop_practice 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Excel.Application xlApp = new Excel.Application(); 
     Excel.Workbook xlWorkbook = xlApp.Workbooks.Open("D:\\book1.xlsx"); 

     Excel.Range xlTestRange; 
     Excel._Worksheet xlWorksheet = xlWorkbook.Sheets[1]; 
     xlTestRange = xlWorksheet.UsedRange; 

     int row_used = xlTestRange.Cells[2, 1].End(Excel.XlDirection.xlDown).Row; 
     Console.WriteLine(row_used); 

     Console.ReadKey(); 
    } 
} 
} 

回答

0

你的代碼將打開一個Excel工作簿,得到了範圍從使用範圍。然後,將名爲row_used與識別行2列1的最後一行用一個int

int row_used = xlTestRange.Cells[2, 1].End(Excel.XlDirection.xlDown).Row; 

然後你輸出的row_used

運行一些測試顯示,如果更改行值,它不會更改返回的值。我有一種感覺,你可能不得不從當前選中的單元格向下計數,直到到達該列中的空單元格爲止。

我不明白您的意見:我希望能夠從特定行(例如,A2到列A中使用的最後一行)的列中獲取已用行數。當您在代碼中打開文檔時,當前選定的單元格將是上次保存/關閉時選定單元格的位置。所以我猜測這是針對Excel的插件(VSTO),並不一定打算與您的C#代碼中的用戶交互。再次,我想你可能不得不自己數一數,除非有另一個Excel函數可以做到這一點。

一個在Get Last non Empty Cell of Excel Column Programatically

var row_Used = excelApp.WorksheetFunction.CountA(xlWorksheet.Columns[4]); 

從@Seth摩爾溶液被簡單地計數所有的非空單元中的列。它可以工作,但是在你的代碼中可能會遇到一些缺點。使用下面的圖片描述可能存在問題的情況。

enter image description here

你不說,當使用像顯示範圍返回的東西,你會如何處理的問題。你希望在「C」列中得到什麼?目前,前兩列的代碼示例都是相同的,但是在「C」列中,代碼將返回4,因爲第一個非空單元格從頂部的第4行開始。第二個代碼結果將是8使用​​。列「D」代碼按預期返回2,第二個返回7。我不確定你想如何處理這些情況。希望這可以幫助。

+0

如何從特定列中獲取最大行數?例如「B」和「C」列爲12,「D」列爲9。 – JayNaz

+0

@ JayNaz ...要獲得特定列的行數(如上所述),您必須從使用範圍返回的最後一行開始,然後檢查您要查找的列中的每個單元格。從使用範圍的最後一行開始,循環,直到在該列中找到一個非空的單元格。你也可以使用'CountA'作爲特定​​的列;但是,這不會計算空單元格。因此,如果列中有空單元夾在第一個數據單元和最後一個數據單元之間,則使用CountA查找包含數據的最後一行將不起作用。 – JohnG