2015-05-29 46 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); 
    }