Правильный импорт данных из Экселя Help

  • Автор темы Doctordradd
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

Doctordradd

#1
Подскажите, пожалуйста, как правильно импортировать данные из таблицы Эксель. Экспорт работает отлично, при импорте открывается файл экселя, записывается временно 1 колонка, при закрытии программы записанные данные исчезают.
Записываются только в готовую строку, т.е. в программу введены вручную данные, в эти строки вписываются данные с экселя, в пустые же - нет...
Подскажите, пожалуйста, где ошибка.
Спасибо.
Экспорт правильный:
Код:
var ws,xl:variant;
i,maxrow:integer;
col,fst:integer;
begin
fst:=2;
xl:=createoleobject('Excel.Application');
try
maxrow:=0;
xl.visible:=true;
XL.WorkBooks.Add;
ws := XL.ActiveWorkBook.ActiveSheet;
ws.Range['A1'].NumberFormat:='0';

ws.Range['A'+inttostr(fst)].Value := '№';
ws.Range['B'+inttostr(fst)].Value := 'Nombres';
col:=1;
begin
inc(col);
ws.Range[Chr(Ord('A')+col)+inttostr(fst)].Value := ' ';
end;
begin
inc(col);
ws.Range[Chr(Ord('A')+col)+inttostr(fst)].Value := ' ';
end;
begin
inc(col);
ws.Range[Chr(Ord('A')+col)+inttostr(fst)].Value := ' ';
end;
begin
inc(col);
ws.Range[Chr(Ord('A')+col)+inttostr(fst)].Value := ' ';
end;
begin
inc(col);
ws.Range[Chr(Ord('A')+col)+inttostr(fst)].Value := ' ';
end;

for i:=fst+1 to Visitas.Items.Count+fst do begin
col:=1;
ws.Range['a'+inttostr(i)].Value := i-2;//# работы
ws.Range['b'+inttostr(i)].Value := Visitas.Items[i-fst-1].Caption;
begin
inc(col);
ws.Range[Chr(Ord('A')+col)+inttostr(i)].Value:=Visitas.Items[i-fst-1].SubItems[0];
end;
begin
inc(col);
ws.Range[Chr(Ord('A')+col)+inttostr(i)].Value:=Visitas.Items[i-fst-1].SubItems[1];
end;
begin
inc(col);
ws.Range[Chr(Ord('A')+col)+inttostr(i)].Value:=Visitas.Items[i-fst-1].SubItems[2];
end;
begin
inc(col);
ws.Range[Chr(Ord('A')+col)+inttostr(i)].Value:=Visitas.Items[i-fst-1].SubItems[3];
end;
begin
inc(col);
ws.Range[Chr(Ord('A')+col)+inttostr(i)].Value:=Visitas.Items[i-fst-1].SubItems[4];
end;
maxrow:=i;
end;
Импорт с ошибкой:
Код:
var ws,xl:variant;
i,maxrow:integer;
col,fst:integer;
begin
fst:=7;
xl:=createoleobject('Excel.Application');
try
maxrow:=0;
xl.visible:=true;
XL.WorkBooks.open('Filename');
ws := XL.ActiveWorkBook.ActiveSheet;
ws.Range['A1'].NumberFormat:='0';

for i:=fst+1 to Visitas.Items.Count+fst do begin
col:=1;
Visitas.Items[i-fst-1].SubItems[0]:= ws.Range['A'+inttostr(fst)].Value;
Visitas.Items[i-fst-1].SubItems[1] := ws.Range['B'+inttostr(fst)].Value;
maxrow:=i;
 

sinkopa

Well-known member
17.06.2009
344
4
#2
Вижу как минимум 4 ошибки
1.
Код:
 ws.Range['A'+inttostr(fst)].Value //вернет значение типа variant
Не факт что из этого значения можно получить строку.
Необходимо это проверять перед использованием или брать так
Код:
 ws.Range['A'+inttostr(fst)].Text
2. Слишком "вольное" (на мой взгляд) с типом TStrings
Код:
	Visitas.Items[i-fst-1].SubItems[0] := 
Visitas.Items[i-fst-1].SubItems[1] :=
Вы уверены что SubItems-ы с этими индексами уже существуют?
из Вашего кода нигде не видно чтонибудь типа
Код:
Visitas.Items[i-fst-1].SubItems.Add('');
3. Вы спрашиваете про ошибку в процедуре (функции?) и при этом "выдаете" огрызок кода... Ожидаете дежурного экстрасенса? :rolleyes:
Ну и... не знаю как к этому относятся модераторы... на мой взгляд - это вопрос немного для другой ветки форума...
 
D

Doctordradd

#3
Спасибо за ответ, с ног сбился, пытаясь настроить импорт.
Написал в этой ветке, потому что программа сама это база данных работников, данные пишутся в файл .pdb.
В основном окне программы сетка TListView, где отображаются данные, введенные вручную с формы. С формы запись идет таким образом:
Код:
main.ini.WriteString(Nombres_PPL.text,'n1',NombresVisitante.text);
1. Попытался изменить value на text, дельфи подчеркивает выражение, но компилит, изменений никаких...
2. Вот код типа add, пишу почти полностью процедуру, таким образом добавляется колонка, в которую пишеыся из формы вручную, весь исходник с удовольствием б залил, но как раз и боюсь что модераторы будут ругаться...
Код:
 var i,cur:integer;
sec:tstringlist;
begin
BaseVisitas.Visitas.OnChange:=nil;
sec:=tstringlist.Create;
with BaseVisitas do begin
Visitas.Clear;
try
ini.ReadSections(sec);
status.panels[1].text:=' Total Visitas : '+inttostr(sec.Count);
if groups.ItemIndex=0 then begin
for i:=0 to sec.Count-1 do begin
Visitas.Items.Add.Caption:=Sec[i];
Visitas.Items[i].SubItems.Add(Ini.ReadString(Sec[i],'n1',''));
Visitas.Items[i].SubItems.Add(Ini.ReadString(Sec[i],'n2',''));
Visitas.Items[i].SubItems.Add(Ini.ReadString(Sec[i],'n3',''));
Visitas.Items[i].SubItems.Add(Ini.ReadString(Sec[i],'n4',''));
Visitas.Items[i].SubItems.Add(Ini.ReadString(Sec[i],'n5',''));
Visitas.Items[i].SubItems.Add(Ini.ReadString(Sec[i],'n6',''));
end;
end;
if groups.itemindex>0 then begin
for i:=0 to sec.Count-1 do begin
if ini.readstring(sec[i],'n7','')=GroupName then begin
cur:=Visitas.Items.Add.Index;
Visitas.items[cur].Caption:=sec[i];
Visitas.items[cur].SubItems.Add(ini.readstring(sec[i],'n1',''));
Visitas.items[cur].SubItems.Add(ini.readstring(sec[i],'n2',''));
Visitas.items[cur].SubItems.Add(ini.readstring(sec[i],'n3',''));
Visitas.items[cur].SubItems.Add(ini.readstring(sec[i],'n4',''));
Visitas.items[cur].SubItems.Add(ini.readstring(sec[i],'n5',''));
Visitas.items[cur].SubItems.Add(ini.readstring(sec[i],'n6',''));
end;
end;
end;
except
writelog(log,'FileReadError('+ini.filename+')','LoadAllVisitas');
end;
end;
Программу писал не сам, переделываю телефонный справочник, я абсолютно не программист. Знаю что нет записи в файл, поэтому импортированные данные отображаются в основной таблице ТViewList, в базу же не записываются, исчезают после закрытия программы.
Еще недочеты:
1.Данные записываются только в уже созданные items, а нужно б чтоб полностью все строки из экселя в таблицу шли...
2.Импортируется только 1 строка из экселя...

Помогите, пожалуйста, настроить, буду премного благодарен.
Спасибо.
 
Статус
Закрыто для дальнейших ответов.