|
Вопрос # 1 851/ вопрос открыт / |
|
Здравствуйте, эксперты!
У меня такой вопрос: мне нужно для обновления данных в БД перегонять их из 2-ух Excel -таблиц;
я перевела их в *.csv формат .
и делаю как то так:(см код)
но теперь возникает зависание на выполнении этого блока ...
так как у меня получаеться разное колличество полей в строке каждого из файлов (я так предполагаю)
как можно решить этот вопрос?
помогите пожалусто
Приложение: Переключить в обычный режим- for i := 8 to ListBox1.Count-1 do begin
- s := ListBox1.Items.Strings[i];
- for j := 1 to 13 do begin
- c := 0;
- while s[length(s)]<>';' do begin
- SetLength(s,length(s)-1);
- c := c+1;
- end;
- a[j] := Copy(ListBox1.Items.Strings[i],length(s)+1,c);
- SetLength(s,length(s)-1);
- end;
- a[14] := s;
-
- for k := 2 to ListBox2.Count-1 do begin
- s := ListBox2.Items.Strings[k];
- for k1 := 1 to 42 do begin
- c := 0;
- while s[length(s)]<>';' do begin
- SetLength(s,length(s)-1);
- c := c+1;
- end;
- b[k1] := Copy(ListBox2.Items.Strings[i],length(s)+1,c);
- SetLength(s,length(s)-1);
- end;
- b[43] := s;
-
- end;
- end;
 |
Вопрос задала: Танюшка (статус: Посетитель)
Вопрос отправлен: 27 августа 2008, 12:04
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Шичко Игорь
Здравствуйте, Танюшка!
Если я правильно понял то массивы a[j] и b[k1] используются под перегонку двух таблиц.
Тогда код такой: (перенесён в приложение).
попробуйте, если что - пишите
Приложение: Переключить в обычный режим- for i := 8 to ListBox1.Count-1 do
- begin
- s := ListBox1.Items.Strings[i];
- for j := 1 to 13 do
- begin
- c := 0;
- while s[length(s)]<>';' do
- begin
- SetLength(s,length(s)-1);
- c := c+1;
- end;
- a[j] := Copy(ListBox1.Items.Strings[i],length(s)+1,c);
- SetLength(s,length(s)-1);
- end;
- a[14] := s;
-
-
- for k := 2 to ListBox2.Count-1 do
- begin
- s := ListBox2.Items.Strings[k];
- for k1 := 1 to 42 do
- begin
- c := 0;
- while s[length(s)]<>';' do
- begin
- SetLength(s,length(s)-1);
- c := c+1;
- end;
-
- SetLength(s,length(s)-1);
- end;
- b[43] := s;
- 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 (статус: Бакалавр), 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 (статус: Студент), 27 августа 2008, 19:11 [#6]:
Ну понятно, что внутри цикла стоит ExcelApp.ActiveWorkbook.Close; (Закрыть Excel), потому и ошибка.
Нескромный вопрос, если все получилось, почему оценка низкая?
|
|
Танюшка (статус: Посетитель), 28 августа 2008, 09:14 [#7]:
оценка низкая потому что я же задавала вопрос иначе не про способы экспорта данных а про свой алгоритм
|
|
ANBsoft (статус: Студент), 28 августа 2008, 09:51 [#8]:
Ну ладно, хотя первая строка Вашего вопроса была такой:
У меня такой вопрос: мне нужно для обновления данных в БД перегонять их из 2-ух Excel -таблиц; ...
Я и предложил вариант. Вам следовало формулировать вопрос иначе, например:
Мне необходимо импортировать данные из файла *.csv, делаю так ...
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|