Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 851

/ вопрос открыт /

Здравствуйте, эксперты!
У меня такой вопрос: мне нужно для обновления данных в БД перегонять их из 2-ух Excel -таблиц;
я перевела их в *.csv формат .
и делаю как то так:(см код)



но теперь возникает зависание на выполнении этого блока ...
так как у меня получаеться разное колличество полей в строке каждого из файлов (я так предполагаю)
как можно решить этот вопрос?
помогите пожалусто

Приложение:
  1. for i := 8 to ListBox1.Count-1 do begin
  2. s := ListBox1.Items.Strings[i];
  3. for j := 1 to 13 do begin
  4. c := 0;
  5. while s[length(s)]<>';' do begin
  6. SetLength(s,length(s)-1);
  7. c := c+1;
  8. end;
  9. a[j] := Copy(ListBox1.Items.Strings[i],length(s)+1,c);
  10. SetLength(s,length(s)-1);
  11. end;
  12. a[14] := s;
  13.  
  14. for k := 2 to ListBox2.Count-1 do begin
  15. s := ListBox2.Items.Strings[k];
  16. for k1 := 1 to 42 do begin
  17. c := 0;
  18. while s[length(s)]<>';' do begin
  19. SetLength(s,length(s)-1);
  20. c := c+1;
  21. end;
  22. b[k1] := Copy(ListBox2.Items.Strings[i],length(s)+1,c);
  23. SetLength(s,length(s)-1);
  24. end;
  25. b[43] := s;
  26.  
  27. end;
  28. end;


Танюшка Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Танюшка (статус: Посетитель)
Вопрос отправлен: 27 августа 2008, 12:04
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Шичко Игорь

Здравствуйте, Танюшка!
Если я правильно понял то массивы a[j] и b[k1] используются под перегонку двух таблиц.
Тогда код такой: (перенесён в приложение).
попробуйте, если что - пишите

Приложение:
  1. for i := 8 to ListBox1.Count-1 do
  2. begin
  3. s := ListBox1.Items.Strings[i];
  4. for j := 1 to 13 do
  5. begin
  6. c := 0;
  7. while s[length(s)]<>';' do
  8. begin
  9. SetLength(s,length(s)-1);
  10. c := c+1;
  11. end;
  12. a[j] := Copy(ListBox1.Items.Strings[i],length(s)+1,c);
  13. SetLength(s,length(s)-1);
  14. end;
  15. a[14] := s;
  16.  
  17.  
  18. for k := 2 to ListBox2.Count-1 do
  19. begin
  20. s := ListBox2.Items.Strings[k];
  21. for k1 := 1 to 42 do
  22. begin
  23. c := 0;
  24. while s[length(s)]<>';' do
  25. begin
  26. SetLength(s,length(s)-1);
  27. c := c+1;
  28. end;
  29.  
  30. SetLength(s,length(s)-1);
  31. end;
  32. b[43] := s;
  33. end;


Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 27 августа 2008, 13:34

Ответ #2. Отвечает эксперт: ANBsoft

Здравствуйте, Танюшка!
А зачем такие сложности, загружайте данные прямо из Excel.
Var ExcelApp,Book,Sheet,V:Variant;
I:Integer;
Begin
ExcelApp:=CreateOleObject('Excel.Application');
ExcelApp.Workbooks.Open('Имя вашего файла');
Book:=ExcelApp.Workbooks[1];
Sheet:=Book.Worksheets[1];
ExcelApp.Visible:=True;
I:=8;
V:=Sheet.Cells[I,1].Value;
While Not VarIsEmpty(V) do begin //Перебор пока не дойдете до пустой/последней строки
//Здесь обрабатываете остальные столбцы
Inc(I);
V:=Sheet.Cells[I,1].Value;
end;
Примерно так, детали зависят от Вашей задачи.

Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 27 августа 2008, 15:13
Оценка за ответ: 3


Мини-форум вопроса

Всего сообщений: 8; последнее сообщение — 28 августа 2008, 09:51; участников в обсуждении: 5.
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 27 августа 2008, 13:07 [#1]:

Танюшка, не проще перебрасывать информацию непосредственно из Excel, используя OLE?
Feniks

Feniks (статус: Бакалавр), 27 августа 2008, 13:48 [#2]:

Для работы с Excel есть много разных компонентов, которым даже не требуется для работы наличие самого Офиса на компьютере и работает напрямую с файлом, а не через OLE.
В коллекции компонентов сайта есть XLSReadWrite. Попробуйте поиграться с ним.
Вадим К

Вадим К (статус: Академик), 27 августа 2008, 13:55 [#3]:

какой красивый код
while s[length(s)]<>';' do begin
        SetLength(s,length(s)-1);
        c := c+1;
      end;
наверно Вы не в курсе о фукнции LastDelimeter(';',s) которая в данном варианте вернёт позицию последнего употребления ';' в строке s. Дальше сами додумаете код.
К тому же не надо забывать, что точки с запятой в строке может и не быть... или строка будет пустая. А защиты у Вас нет...
Галочка "подтверждения прочтения" - вселенское зло.
Танюшка

Танюшка (статус: Посетитель), 27 августа 2008, 17:33 [#4]:

я делаю так ...
Var ExcelApp,Book,Sheet,V:Variant;
I:Integer;
ResultPath: string;
Begin
ResultPath:=ExtractFilePath(Application.ExeName)+'5511.xls';
ExcelApp:=CreateOleObject('Excel.Application');
ExcelApp.Workbooks.Open(ResultPath);
Book:=ExcelApp.Workbooks[1];
Sheet:=Book.Worksheets[1];
ExcelApp.Visible:=True;
I:=9;
V:=Sheet.Cells[I,1].Value;
While Not VarIsEmpty(V) do begin //Перебор пока не дойдете до пустой/последней строки
DataModule1.Driver.Active:=True;
DataModule1.Driver.Append;
DataModule1.Driver.FieldByName('fio').VAlue := Sheet.Cells[I, 1].Value;
DataModule1.Driver.FieldByName('data_roz').VAlue := Sheet.Cells[I, 3].Value;
DataModule1.Driver.FieldByName('tab_nam').VAlue :=Sheet.Cells[I, 4].Value;
DataModule1.Driver.FieldByName('UNN').VAlue := Sheet.Cells[I, 5].Value;
//if Sheet.Cells[I, 7].Value <>'' then begin
DataModule1.Driver.FieldByName('data_vidachi').VAlue := Sheet.Cells[I, 7].Value; // end;
DataModule1.Driver.FieldByName('vidan').VAlue :=Sheet.Cells[I, 9].Value;
DataModule1.Driver.FieldByName('seria').VAlue := Sheet.Cells[I, 11].Value;
//if Sheet.Cells[I, 14].Value<>'' then begin
DataModule1.Driver.FieldByName('ctaz_v_ap').VAlue := Sheet.Cells[I, 14].Value; //end;

DataModule1.Driver.Post;
ExcelApp.ActiveWorkbook.Close;
//Здесь обрабатываете остальные столбцы

Inc(I);
V:=Sheet.Cells[I,1].Value;<----- сдесь возникает ошибка
end;
Танюшка

Танюшка (статус: Посетитель), 27 августа 2008, 17:54 [#5]:

Вопрос снимаеться все получилось :)
ANBsoft

ANBsoft (статус: Студент), 27 августа 2008, 19:11 [#6]:

Ну понятно, что внутри цикла стоит ExcelApp.ActiveWorkbook.Close; (Закрыть Excel), потому и ошибка.
Нескромный вопрос, если все получилось, почему оценка низкая?
Танюшка

Танюшка (статус: Посетитель), 28 августа 2008, 09:14 [#7]:

оценка низкая потому что я же задавала вопрос иначе не про способы экспорта данных а про свой алгоритм
ANBsoft

ANBsoft (статус: Студент), 28 августа 2008, 09:51 [#8]:

Ну ладно, хотя первая строка Вашего вопроса была такой:
У меня такой вопрос: мне нужно для обновления данных в БД перегонять их из 2-ух Excel -таблиц; ...
Я и предложил вариант. Вам следовало формулировать вопрос иначе, например:
Мне необходимо импортировать данные из файла *.csv, делаю так ...

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:53
Выполнено за 0.02 сек.