获得Excel范围的行的最快方法
在VSTO C#项目中,我想从一组行索引中获取一系列行。
行索引可以是例如“7,8,9,12,14”。
然后我想要范围“7:9,12,14”行。
我现在这样做:
Range rng1 = sheet.get_Range("A7:A9,A12,A14", Type.Missing); rng1 = rng1.EntireRow;
但是由于范围规范中的string处理,效率有点低。
sheet.Rows["7:9"]
作品,但我不能给这个
sheet.Rows["7:9,12,14"] // Fails
尝试这个:
Sheet.Range("7:9,12:12,14:14")
编辑:对不起,如果在C#中使用VSTO它应该是:
sheet.get_Range("7:9,12:12,14:14", Type.Missing)
这里是你正在寻找的代码:
int startRow, endRow, startCol, endCol, row,col; var singleData = new object[col]; var data = new object[row,col]; //For populating only a single row with 'n' no. of columns. var startCell = (Range)worksheet.Cells[startRow, startCol]; startCell.Value2 = singleData; //For 2d data, with 'n' no. of rows and columns. var endCell = (Range)worksheet.Cells[endRow, endCol]; var writeRange = worksheet.Range[startCell, endCell]; writeRange.Value2 = data;
你可以有整个范围,不pipe是1维还是2维的单元格arrays。
这个方法在遍历整个excel表单并在需要时填充数据时特别有用。
我不是C#的专家,但是AFAIK必须像上面所做的那样使用EntireRow。 您正在寻找的string可以通过.Address
属性来实现。 例如
private void button1_Click(object sender, EventArgs e) { Microsoft.Office.Interop.Excel.Application xlexcel; Microsoft.Office.Interop.Excel.Workbook xlWorkBook; Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet; Microsoft.Office.Interop.Excel.Range xlRange; object misValue = System.Reflection.Missing.Value; xlexcel = new Excel.Application(); xlWorkBook = xlexcel.Workbooks.Add(); // Set Sheet 1 as the sheet you want to work with xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); xlRange = xlWorkSheet.get_Range("A7:A9,A12,A14", misValue); MessageBox.Show(xlRange.EntireRow.Address); xlRange = xlWorkSheet.get_Range(xlRange.EntireRow.Address, misValue); MessageBox.Show(xlRange.Address); }
所以你可以写上面的
private void button1_Click(object sender, EventArgs e) { Microsoft.Office.Interop.Excel.Application xlexcel; Microsoft.Office.Interop.Excel.Workbook xlWorkBook; Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet; Microsoft.Office.Interop.Excel.Range xlRange; object misValue = System.Reflection.Missing.Value; xlexcel = new Excel.Application(); xlWorkBook = xlexcel.Workbooks.Add(); // Set Sheet 1 as the sheet you want to work with xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); xlRange = xlWorkSheet.get_Range("$7:$9,$12:$12,$14:$14", misValue); MessageBox.Show(xlRange.Address); }
看到部分
xlRange = xlWorkSheet.get_Range("$7:$9,$12:$12,$14:$14", misValue);
Reafidy编辑的答案是一个很好的开始 ,但是我想在这个评论中做更多的扩展。 sheet.get_Range(rangeselect)
比逐行更快,但是我还没有提到的一件事是get_Range参数有255个字符的限制。
为了解决这个限制,像正常情况一样构build一组范围,比如“8:8,10:13,14:55”,然后使用这个代码的一个变种:
string rangeSelectPart; while (rangeSelect.Length >= 255) { rangeSelectPart = rangeSelect.Substring(0, rangeSelect.Substring(0,255).LastIndexOf(',')); Range multiRangePart = sheet.get_Range(rangeSelectPart, Type.Missing); //do something with the range here using multiRangePart rangeSelect= rangeSelect.Substring(rangeSelectPart.Length + 1); } Range multiRange = sheet.get_Range(rangeSelect, Type.Missing); // do the same something with the last part of the range using multiRange // now that the remaining rows are described in less than 255 characters
这将比在单个行上执行操作快得多,但是当呈现大的非连续行集时也不会失败。
请注意, SutharMonil的答案是快速的 IFF设置值在连续的矩形范围内。 从C#到Excel的瓶颈通常是通过COM对象的重复调用,这些COM对象在创build和更新时被阻塞,并且他的回答很好地整合了调用。
不幸的是,在我到目前为止的testing中,试图使用它来处理非string属性而不是stringtypes,导致了一个types错误。 例如:
object[,] colors; //use C# to set appropriate colors to each location in array... for(int i = 0; i < colors.get_Length(0); i++){ for(int j = 0; j < colors.get_Length(1); j++){ colors[i,j] = XlThemeColor.xlThemeColorAccent6; } } //below causes a type error formatRange.Interior.ThemeColor = color;
我会尽量记住更新,如果我得到它的工作。
最后重复操作设置Globals.ThisAddIn.Application.ScreenUpdating = false;
然后在完成后将其设置为true。 如果没有这个,Excel将停止更新每一组范围属性更新后的屏幕,这可能会增加很多时间。