Опитимазция поиска данных в файле Excel - C#
Формулировка задачи:
Добрый день!
Подскажите, как оптимизировать поиск данных в эксель, на данный момент поиск осуществляется вот так
Т.е. банальный перебор всех строк определенного столбца, пока значение в нем не совпадет с искомым, но при файлах размером по 20-30 тысяч строк, и случайностью, что искомое значение находится в конце файла - в итоге программа выполняется по минуте ( а таких поисков выполняется 5), итого 5 минут.
Подскажите, возможно есть более быстрый способ осуществить поиск ячейки, с искомым занчением?
Заранее спасибо!
Microsoft.Office.Interop.Excel.Worksheet ObjWorkSheet;
ObjWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ObjWorkBook.Sheets[1];
for (int i = 1; done; i++)
{
if (ObjWorkSheet.get_Range("J" + i).Text.ToString().Trim() == refnumber.Trim())
{
done = false;
range = ObjWorkSheet.get_Range("L" + i);
}
}Решение задачи: «Опитимазция поиска данных в файле Excel»
textual
Листинг программы
#region Save
private void createOleNewBook(string fileName)
{
try
{
string ConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=\"Excel 8.0;HDR=NO\"; Data Source={0}", fileName);
OleDbConnection myODCon = new OleDbConnection(ConnectionString);
myODCon.Open();
OleDbCommand myOleDbCommand = new OleDbCommand();
myOleDbCommand.Connection = myODCon;
myOleDbCommand.CommandText = String.Format("CREATE TABLE [Лист1] ({0})", getSaveCommandData(-1));
myOleDbCommand.ExecuteNonQuery();
for (int i = 0; i < resDS.Tables[0].Rows.Count; i++)
{
myOleDbCommand.CommandText = String.Format("INSERT INTO [Лист1$] values ({0})", getSaveCommandData(i));
myOleDbCommand.ExecuteNonQuery();
}
myODCon.Close();
MessageBox.Show("Файл сохранен");
}
catch { }
}
public string getSaveCommandData(int rowIndex)
{
for (int i = 0; i < resDS.Tables[0].Columns.Count-1; i++)
{
data += String.Format("{0}", rowIndex!=-1 ? getValue(resDS, i, rowIndex) +", " : (i+1)+" integer, ");
}
data += String.Format("{0}", rowIndex != -1 ? getValue(resDS, resDS.Tables[0].Columns.Count-1, rowIndex).ToString() : (resDS.Tables[0].Columns.Count) + " integer");
return data;
}
#endregion