2011-10-06 30 views
18

Tôi đang cố gắng lấy hàng cuối cùng của một bảng tính excel bằng cách sử dụng Thư viện Microsoft.interop.Excel và C#. Tôi muốn làm điều đó, bởi vì tôi bị tính phí với lặp qua tất cả các hồ sơ của một bảng tính excel và thực hiện một số loại hoạt động trên chúng. Cụ thể, tôi cần số thực tế của hàng cuối cùng, vì tôi sẽ ném số này vào một hàm. Bất cứ ai có bất kỳ ý tưởng làm thế nào để làm điều đó?Lập trình nhận hàng excel được điền cuối cùng bằng cách sử dụng C#

Trả lời

39

cách Couple,

using Excel = Microsoft.Office.Interop.Excel; 

Excel.ApplicationClass excel = new Excel.ApplicationClass(); 
Excel.Application app = excel.Application; 
Excel.Range all = app.get_Range("A1:H10", Type.Missing); 

HOẶC

Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing); 
Excel.Range range = sheet.get_Range("A1", last); 

int lastUsedRow = last.Row; 
int lastUsedColumn = last.Column; 
+1

Không chắc chắn cách thức tùy chọn đầu tiên sẽ hoạt động ... Nhưng tùy chọn thứ hai có vẻ thú vị. Làm thế nào tôi có thể dịch nó thành Giá trị int? – SoftwareSavant

+0

Tôi đã chỉnh sửa mã của mình, tôi chưa thử nghiệm mã đó nhưng hy vọng sẽ cung cấp cho bạn ý tưởng về những gì bạn muốn đạt được. – Priyank

+4

Câu trả lời này cung cấp cho bạn ô cuối cùng trong UsedRange của trang tính. Vấn đề, mặc dù, là UsedRange không bao giờ hợp đồng. Nếu bạn có một giá trị trong A1 và AA100, sau đó xóa nội dung của AA100, UsedRange sẽ vẫn là A1: AA100. AA100 vẫn sẽ được coi là ô cuối cùng. – CtrlDot

14

Đây là sự cố thường gặp trong Excel.

Dưới đây là một số mã C#:

// Find the last real row 
nInLastRow = oSheet.Cells.Find("*",System.Reflection.Missing.Value, 
System.Reflection.Missing.Value, System.Reflection.Missing.Value, Excel.XlSearchOrder.xlByRows,Excel.XlSearchDirection.xlPrevious, false,System.Reflection.Missing.Value,System.Reflection.Missing.Value).Row; 

// Find the last real column 
nInLastCol = oSheet.Cells.Find("*", System.Reflection.Missing.Value,  System.Reflection.Missing.Value,System.Reflection.Missing.Value, Excel.XlSearchOrder.xlByColumns,Excel.XlSearchDirection.xlPrevious, false,System.Reflection.Missing.Value,System.Reflection.Missing.Value).Column; 

tìm thấy here

hoặc sử dụng SpecialCells

Excel.Range last = sheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing); 
Excel.Range range = sheet.get_Range("A1", last); 

[EDIT] Hiện chủ đề tương tự:

+0

Điều này đang hoạt động, tôi đang cố gắng để có được hàng chính xác. – NWessel

7

Đối với câu hỏi liên quan đến mô hình đối tượng Excel, nó thường dễ dàng hơn để thử nó ra trong VBA đầu tiên, sau đó được dịch ra là C# là khá tầm thường.

Trong trường hợp này một cách để làm điều đó trong VBA là:

Worksheet.UsedRange.Row + Worksheet.UsedRange.Rows.Count - 1 
9

Pryank's answer là những gì làm việc gần gũi nhất đối với tôi. Tôi đã thêm một chút vào cuối (.Row) vì vậy tôi không chỉ trả về một số range mà còn là integer.

int lastRow = wkSheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell, Type.Missing).Row; 
6

Cách duy nhất tôi có thể làm cho nó làm việc trong tất cả các kịch bản (trừ tấm bảo vệ):

Nó hỗ trợ:

  • quét Hidden Row/Cột

  • bỏ qua ô được định dạng không có dữ liệu/công thức

Code:

// Unhide All Cells and clear formats 
sheet.Columns.ClearFormats(); 
sheet.Rows.ClearFormats(); 

// Detect Last used Row - Ignore cells that contains formulas that result in blank values 
int lastRowIgnoreFormulas = sheet.Cells.Find(
       "*", 
       System.Reflection.Missing.Value, 
       InteropExcel.XlFindLookIn.xlValues, 
       InteropExcel.XlLookAt.xlWhole, 
       InteropExcel.XlSearchOrder.xlByRows, 
       InteropExcel.XlSearchDirection.xlPrevious, 
       false, 
       System.Reflection.Missing.Value, 
       System.Reflection.Missing.Value).Row; 
// Detect Last Used Column - Ignore cells that contains formulas that result in blank values 
int lastColIgnoreFormulas = sheet.Cells.Find(
       "*", 
       System.Reflection.Missing.Value, 
       System.Reflection.Missing.Value, 
       System.Reflection.Missing.Value, 
       InteropExcel.XlSearchOrder.xlByColumns, 
       InteropExcel.XlSearchDirection.xlPrevious, 
       false, 
       System.Reflection.Missing.Value, 
       System.Reflection.Missing.Value).Column; 

// Detect Last used Row/Column - Including cells that contains formulas that result in blank values 
int lastColIncludeFormulas = sheet.UsedRange.Columns.Count; 
int lastColIncludeFormulas = sheet.UsedRange.Rows.Count; 
+1

Câu trả lời rõ ràng (và câu trả lời duy nhất có hiệu quả đối với tôi). –

1

Các ActiveSheet.UsedRange.Value trả về một chiều mảng 2 đối tượng của [hàng, cột]. Kiểm tra độ dài của cả hai chiều sẽ cung cấp chỉ mục LastRow và chỉ mục LastColumn. Ví dụ bên dưới đang sử dụng C#.

 Excel.Worksheet activeSheet; 
 
\t \t Excel.Range activeRange; 
 

 

 
     public virtual object[,] RangeArray { 
 
\t \t \t get { return ActiveRange.Value; } 
 
\t \t } 
 

 
\t \t public virtual int ColumnCount { 
 
\t \t \t get { return RangeArray.GetLength(1); } 
 
\t \t } 
 

 

 
\t \t public virtual int RowCount { 
 
\t \t \t get { return RangeArray.GetLength(0); } 
 
\t \t } 
 

 
\t \t public virtual int LastRow { 
 
\t \t \t get { return RowCount; } 
 
\t \t }

0

Vấn đề này thậm chí còn tồi tệ hơn khi có thể ô trống. Nhưng bạn phải đọc một hàng ngay cả khi chỉ có một giá trị được lấp đầy. Có thể mất một thời gian khi có rất nhiều ô không được lấp đầy nhưng nếu đầu vào gần đúng thì nó khá nhanh.

Giải pháp của tôi bỏ qua hàng hoàn toàn trống rỗng và trả về số cột dài nhất của dãy:

private static int GetLastRow(Worksheet worksheet) 
    { 
     int lastUsedRow = 1; 
     Range range = worksheet.UsedRange; 
     for (int i = 1; i < range.Columns.Count; i++) 
     { 
      int lastRow = range.Rows.Count; 
      for (int j = range.Rows.Count; j > 0; j--) 
      { 
       if (lastUsedRow < lastRow) 
       { 
        lastRow = j; 
        if (!String.IsNullOrWhiteSpace(Convert.ToString((worksheet.Cells[j, i] as Range).Value))) 
        { 
         if (lastUsedRow < lastRow) 
          lastUsedRow = lastRow; 
         if (lastUsedRow == range.Rows.Count) 
          return lastUsedRow - 1; 
         break; 
        } 
       } 
       else 
        break; 
      } 
     } 
     return lastUsedRow; 
    } 
0

Đối với những người sử dụng phương pháp SpecialCells (Tôi không chắc chắn về những người khác), Xin lưu ý trong trường hợp ô cuối cùng của bạn là sáp nhập, bạn sẽ không thể lấy số hàng và cột cuối cùng bằng cách sử dụng Range.Row và Range.Column để nhận hàng và cột cuối cùng dưới dạng số. trước tiên bạn cần phải Hủy hợp nhất phạm vi của bạn và sau đó lại nhận được ô cuối cùng. Tôi mất rất nhiều chi phí.

private int[] GetLastRowCol(Ex.Worksheet ws) 
    { 
     Ex.Range last = ws.Cells.SpecialCells(Ex.XlCellType.xlCellTypeLastCell, Type.Missing); 
     bool isMerged = (bool)last.MergeCells; 
     if (isMerged) 
     { 
      last.UnMerge(); 
      last = ws.Cells.SpecialCells(Ex.XlCellType.xlCellTypeLastCell, Type.Missing); 
     } 
     return new int[2] { last.Row, last.Column }; 
    } 
Các vấn đề liên quan