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

Тема в разделе "Delphi - Базы данных", создана пользователем Doctordradd, 3 ноя 2010.

Статус темы:
Закрыта.
  1. Doctordradd

    Doctordradd Гость

    Подскажите, пожалуйста, как правильно импортировать данные из таблицы Эксель. Экспорт работает отлично, при импорте открывается файл экселя, записывается временно 1 колонка, при закрытии программы записанные данные исчезают.
    Записываются только в готовую строку, т.е. в программу введены вручную данные, в эти строки вписываются данные с экселя, в пустые же - нет...
    Подскажите, пожалуйста, где ошибка.
    Спасибо.
    Экспорт правильный:
    Код (Delphi):
    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;
    Импорт с ошибкой:
    Код (Delphi):
    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;
     
  2. sinkopa

    sinkopa Well-Known Member

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

    Doctordradd Гость

    Спасибо за ответ, с ног сбился, пытаясь настроить импорт.
    Написал в этой ветке, потому что программа сама это база данных работников, данные пишутся в файл .pdb.
    В основном окне программы сетка TListView, где отображаются данные, введенные вручную с формы. С формы запись идет таким образом:
    Код (Delphi):
    main.ini.WriteString(Nombres_PPL.text,'n1',NombresVisitante.text);
    1. Попытался изменить value на text, дельфи подчеркивает выражение, но компилит, изменений никаких...
    2. Вот код типа add, пишу почти полностью процедуру, таким образом добавляется колонка, в которую пишеыся из формы вручную, весь исходник с удовольствием б залил, но как раз и боюсь что модераторы будут ругаться...
    Код (Delphi):
     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 строка из экселя...

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

Поделиться этой страницей