У меня есть 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)));
}
Возможно, стоит попробовать: Прочтите все данные из Excel, работайте с ним в своем приложении, а затем напишите все это за один раз. – Raidri
У меня нет большого опыта работы с Interop, но главная причина плохой производительности - это, как правило, использование нескольких диапазонов. Вы должны стремиться получить один относительно большой диапазон (если возможно тот, который представляет весь рабочий лист), а затем выполнить все необходимые операции над ним, а затем повторить его с другим большим диапазоном. –
@ Raidri Я получил usedRange для моего листа, плохо отредактировал этот диапазон в моем коде теперь, каков метод замены листа usedRange с моим новым? –