簡體   English   中英

如何在VSTO / C#中使用行號和列號獲取Excel范圍?

[英]How do I get an Excel range using row and column numbers in VSTO / C#?

我認為這個問題總結了一下。 給定行和列的兩個整數或者一個范圍的兩個角的行和列的四個整數,如何獲得該范圍的范圍對象。

范圍是多個單元格:

Excel.Worksheet sheet = workbook.ActiveSheet;
Excel.Range rng = (Excel.Range) sheet.get_Range(sheet.Cells[1, 1], sheet.Cells[3,3]);

范圍是一個單元格:

Excel.Worksheet sheet = workbook.ActiveSheet;
Excel.Range rng = (Excel.Range) sheet.Cells[1, 1];

如果在Microsoft Excel 14.0對象庫中使用,給定的答案將引發錯誤。 對象不包含get_range的定義。 而是使用

int countRows = xlWorkSheetData.UsedRange.Rows.Count;
int countColumns = xlWorkSheetData.UsedRange.Columns.Count;
object[,] data = xlWorkSheetData.Range[xlWorkSheetData.Cells[1, 1], xlWorkSheetData.Cells[countRows, countColumns]].Cells.Value2;

你可以檢索這樣的價值

string str = (string)(range.Cells[row, col] as Excel.Range).Value2 ;

選擇整個使用范圍

Excel.Range range = xlWorkSheet.UsedRange;

資源 :

http://csharp.net-informations.com/excel/csharp-read-excel.htm

熾盛

面對同樣的問題,我發現最快的解決方案是實際掃描我想要排序的單元格的行,用非空白元素確定最后一行,然后選擇並對該分組進行排序。

    Dim lastrow As Integer
lastrow = 0
For r = 3 To 120
   If Cells(r, 2) = "" Then
        Dim rng As Range
        Set rng = Range(Cells(3, 2), Cells(r - 1, 2 + 6))
        rng.Select
        rng.Sort Key1:=Range("h3"), order1:=xlDescending, Header:=xlGuess, DataOption1:=xlSortNormal
        r = 205
    End If
Next r

如果您收到錯誤,指出“對象不包含get_range的定義”。

試試以下。

Excel.Worksheet sheet = workbook.ActiveSheet;
Excel.Range rng = (Excel.Range) sheet.Range[sheet.Cells[1, 1], sheet.Cells[3,3]].Cells;

我找到了一個好的簡短方法似乎運作良好......

Dim x, y As Integer
x = 3: y = 5  
ActiveSheet.Cells(y, x).Select
ActiveCell.Value = "Tada"

在這個例子中,我們選擇3列和5行,然后將“Tada”放入單元格中。

UsedRange可與“virgins”單元格配合使用,但如果您的單元格在過去已填充,則UsedRange將向您提供舊值。

例如:

“在包含單元格A1A5填充文本的Excel工作表中思考”。 在這種情況下, UsedRange必須實現為:

Long SheetRows;
SheetRows = ActiveSheet.UsedRange.Rows.Count;

在執行這幾行之后,對SheetRows變量的監視必須顯示值5。

Q1:但是,如果A5的值被刪除會發生什么?

A1:SheetRows的值為5

Q2:為什么這樣?

A2:因為MSDN將UsedRange屬性定義為:

獲取一個Microsoft.Office.Interop.Excel.Range對象, 對象表示 隨時包含值的 所有 單元格


所以,問題是:存在這種行為的一些/任何解決方法?

我認為有兩種選擇:

  1. 避免刪除單元格的內容,更喜歡刪除整行(右鍵單擊行號,然后“刪除行”)。
  2. 使用CurrentRegion而不是UsedRange屬性如下:

Long SheetRows;
SheetRows = ActiveSheet.Range("A1").CurrentRegion.Rows.Count;

如果你想要像Cells(Rows.Count, 1).End(xlUp).Row ,你可以做到。

只需使用以下代碼:

using Excel = Microsoft.Office.Interop.Excel;

string xlBk = @"D:\Test.xlsx";
Excel.Application xlApp;
Excel.Workbook xlWb;
Excel.Worksheet xlWs;

Excel.Range rng;
int iLast;

xlApp = new Excel.Application();
xlWb = xlApp.Workbooks.Open(xlBk, 0, true, 5, "", "", true, 
Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);

xlWs = (Excel.Worksheet)xlWb.Worksheets.get_Item(1);

iLast = xlWs.Rows.Count;
rng = (Excel.Range)xlWs.Cells[iLast, 1];
iLast = rng.get_End(Excel.XlDirection.xlUp).Row;

試試這個,有效!

Excel.Worksheet sheet = xlWorkSheet;
Excel.Series series1 = seriesCollection.NewSeries();
Excel.Range rng = (Excel.Range)xlWorkSheet.Range[xlWorkSheet.Cells[3, 13], xlWorkSheet.Cells[pp, 13]].Cells;
series1.Values = rng;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM