2015-05-29 70 views
0

我有一个拥有数万行的excel。我需要在这个excel中随机插入数据。下面我有我正在使用的功能,现在主要关心的是移位和插入数据。我需要一个更好的主意或一种可以和我的一样但速度更快的方法。有效插入行+数据

一个好的答案将有希望显示一种方法和评论来解释它是如何工作的。那么如果有人需要它,它可以被重用。

这里是我的:

private void shiftRows(int from, int numberof) 
    { 
     from++; 
     Range r = oXL.get_Range("A" + from.ToString(), "A" + from.ToString()).EntireRow; 

     for (int i = 0; i < numberof; i++) 
      r.Insert(Microsoft.Office.Interop.Excel.XlInsertShiftDirection.xlShiftDown); 
    } 

    public void inputRowData(string[] data, int rds) 
    { 
     int bestRow = getRowByRDS_a(rds); 
     string[] formatedData = formatOutput(bestRow, data); 
     string val = getValueOfCell(bestRow, 6); 
     if (val != null) 
     { 
      shiftRows(bestRow, data.Length); 
      bestRow++; 
     } 
     else 
      shiftRows(bestRow, data.Length - 1); 
     // transform formated data into string[,] 
     string[][] splitedData = formatedData.Select(s => s.Split('\t')).ToArray(); 
     var colCount = splitedData.Max(r => r.Length); 
     var excelData = new string[splitedData.Length, colCount]; 
     for (int i = 0; i < splitedData.Length; i++) 
     { 
      for (int j = 0; j < splitedData[i].Length; j++) 
      { 
       excelData[i, j] = splitedData[i][j]; 
      } 
     } 
     oSheet.get_Range("A" + bestRow.ToString()).Resize[splitedData.Length, colCount].Value = excelData; 
     MainWindow.mainWindowDispacter.BeginInvoke(new System.Action(() => MainWindow.mainWindow.debugTextBox.AppendText("Done with " + rds + " input!" + Environment.NewLine))); 
    } 
+1

也许值得一试:从Excel中读取所有数据,在您的应用程序中使用它,然后将它全部写回去。 – Raidri

+0

我对Interop没有太多经验,但背后糟糕表现的主要原因通常是使用多个范围。你应该努力获得一个相对较大的范围(如果可能的话,代表整个工作表),然后执行所有必需的操作,然后用其他大范围重复。 –

+0

@Raidri我得到了用于我的表格的usedRange虐待编辑我的代码中的范围现在是什么方法来替换sheetRange与我的新方法? –

回答

0

我最好的猜测是,你for循环与r.Insert使它缓慢,因为你的numberof大。这导致Excel通过一次插入一行来移动整个电子表格numberof次。

有多快究竟有多快,你想要的:

private void shiftRows(int from, int numberof) 
{ 
     // Excel starts at 1 
     from = from+1; 
     // Insert numberof rows at row from 
     oXL.Rows(String.Format("{0}:{1}", from, from+numberof)) 
     .Insert(Microsoft.Office.Interop.Excel.XlInsertShiftDirection.xlShiftDown); 
} 

,可以帮助其他问题:

如果一次插入所需的行数这可能是快了很多? 它在哪种情况下变慢?

+0

我会建议将'Application.EnableAnimations'设置为FALSE – Seb

0

要有效地将值写入工作表,您不应该直接直接写入工作表。你需要做的是仅为行或列声明一个对象数组,或者为网格声明一个2维的对象数组。用你想要的值填充这些对象。接下来,从目标工作表中声明一个Range对象,然后设置它的起始位置(偏移量)并用数组的长度(/ s)调整它的大小。通过使用对象数组设置范围值,写入范围1次。

public static void Write(
     _Worksheet worksheet, object[,] values, int rowIndex, int columnIndex, ExcelFormatter formatter) 
    { 
     if (worksheet == null) 
     { 
      return; 
     } 

     if (values == null) 
     { 
      return; 
     } 

     var range = (Range)worksheet.Cells.Item[1, 1]; 

     // range = range.get_Offset(rowIndex, columnIndex); // this did not work when cell 1,1 is a merged cell (column wise); offset moves by columns first before rows 
     range = range.Offset[rowIndex, 0]; // this partially solves the problem 
     range = range.Offset[0, columnIndex]; 

     // may need a different algo if cell 1,1 is a merged cell (row wise) 
     range = range.Resize[values.GetLength(0), values.GetLength(1)]; 
     range.set_Value(XlRangeValueDataType.xlRangeValueDefault, values); 
     if (formatter != null) 
     { 
      formatter.Invoke(range); 
     } 

     ReleaseObject(range); 
    }