Odczyt wartości z komórek Excela

0

Mam kilkadzisiąt cenników w excelu i PDF. O ile pdfy przekształcę sobie na excele, o tyle chciałbym sobie przyśpieszyć pracę i zrobić jakis prosty program, który importowałby mi moje cenniki ( dwie, trzy kolumny excela - nazwa produktu, cena i ilosc ) i moglbym sobie wybierac producenta np. z jakiegos listboxa ( wtedy odpala sie konkretny cennik ) a póxniez z kolejnego listboxa wybierac produkt i zeby mi wyciągał ceny do jakiegos edita czy memo.

Podejrzewam, ze dla kogos kto siedzi w delphi od zawsze to 2-3 linijki kodu - ja bez pomocy waszej i googla będę siedział nad tym ze dwa lata :)

mogę prosic o jakas pomoc?

0

proszę bardzo -> http://stackoverflow.com/questions/14831463/fast-way-to-load-excel-spreadsheet
jeden z miliona sposobów, ten jest bardzo przyjemny bo dane dostajesz w dwu wymiarowej tablicy.

0

To mnie przerasta :)
Zaraz uderze do działu gielda czyt. kto to zrobi za "piniondz"

0

Jak co to pisz pw. Jakiś czas temu zgłębiłem jak parsować to cholerstwo - możemy się dogadać, ale szczegóły etc. to pw ew. tel.

0

@Wybitny Samiec - jak nie potrafisz tego zrobić z tym co masz to zawsze możesz sobie wyeksportować te arkusze do jakiegoś łatwiejszego formatu (np. CSV) i wtedy coś z nimi zrobić.

0

@furious programming masz rację... Dziesięć lat temu zrobiłem jakimś cudem program, który ładnie odczytywał informacje oddzielone pionowymi kreskami z pliku TXT i ładował je pięknie do listboxa, edita czy memo... Teraz gdy 30 lat na karku juz niestety za dużo pozapominałem i trudność mam z podstawami :(

0

Chyba, że ktoś ma jakiś sprawdzony kod na odczyt kilku danych z pliku i załadowanie go w dowolną kontrolke?

0

@Adaxus - arkuszami Excela nie bawiłem się jeszcze, więc nie mam gotowca;

Mimo wszystko, wcale nie musisz plików parsować ręcznie, bo do obsługi formatu CSV są dostępne gotowe biblioteki, również dla Delphi; One za Ciebie załadują zawartość pliku do pamięci i rozłożą go ładnie na fragmenty; Tobie pozostanie za jej pomocą jedynie odczytać dane (w wygodny sposób) i je wyświetlić w jakichś kontrolkach; Przy czym nie wiem z której wersji Delphi korzystasz, bo nie podałeś, więc nie wiem co miałbym Ci polecić;

W razie czego dla Lazarusa jest biblioteka - nazywa się CsvDocument, więc można śmiało korzystać; Jest też mały tutorial jej obsługi, w razie gdyby ktos miał problemy.

0

mysle ze mozna to ogarnac csv czyli zwyklymi txt podzielonymi srednikami :)
ściągnałem jakis trial embacadero delphi nowe ale juz widze ze w glupich stringridach NIE MA kolumn :( wiec nie takie dobre jak stare delphi 7

Ok, udalo mi sie zawartosc pliku ladnie umiescic w stringgridzie ( A w zasadzie to w stringcolumn ) - jak to teraz przeniesc do czegokolwiek innego? memo,listview,listbox czy inne cudo?

0

Daj jakiś kod i pokaż jak to wygląda - przecież nie będziemy zgadywać co już masz.

0

Tak jak @furious programming daj jakieś choćby przykładowe dane to zobaczymy jak to ogarnąć.

0

Nie umiem sie zalogować na adaxus to napisze z goscinnego konta :)

Wiec tak, planuje miec 8-9 kolumn z danymi: PRODUCENT, KOD TOWARU, NAZWA TOWARU, WALUTA, CENA ZAKUP, CENA DETAL,OPIS KROTKI, ZDJECIE, WYSYLKA

Rozumiem ze zaladowanie pliku txt z csv do stringrida to najwygodniejsza opcja?
O ile zaladowanie z pliku do stingrida juz jako tako dziala ( wieczorem podesle kod ) o tyle dalej ze stringrida do komponentow juz lezy totalnie.

Na poczatku LISTA PRODUCENTOW ( to bedzie sztywna wartosc, ewentualnie rozwojowo zrobie zaladowanie biezacej listy z pliku txt ) planuje ja miec w listboxie albo listview ( lub cokolwiek z wyborem pozycji ). Po kliknieciu na konkretnego producenta, pokazuje sie w kolejnym memo zawratosc kolumny KOD TOWARU. po kliknieciu w kod towaru pokazuja sie w pozostalych editach i labelach wartosci z pozostalych kolumn w tym rzedzie.

I to by bylo na tyle. Jesli ktos z was chcialby mi pomoc w tym rozwiazaniu - jestem w stanie sie odwdzieczyc.

0

Najlepiej będzie, jeśli wkleisz do posta przykładową zawartość pliku (nie muszą być prawidłowe dane, byle struktura danych była taka sama jak w oryginale) oraz pokażesz zrzut ekranu formularza, który chcesz mieć do wyświetlania tych danych; Bo tak to podałeś tylko opis problemu i nawet jeśli ktoś podrzuci kod to może się okazać, że nie trafi (nie będzie działał prawidłowo); Potem znowu będziesz opisywał problem i możemy się w ogóle nie dogadać;

Trzeba to załatwić szybko i konkretnie - szkoda czasu na dogadywanie się; Podaj konkretne dane - to wystarczy, aby napisać kod i ewentualnie coś więcej doradzić.

0
furious programming napisał(a):

@Wybitny Samiec - jak nie potrafisz tego zrobić z tym co masz to zawsze możesz sobie wyeksportować te arkusze do jakiegoś łatwiejszego formatu (np. CSV) i wtedy coś z nimi zrobić.

Jeśli faktycznie dane w arkuszach siedzą ładnie formatowane to można za pomocą ADO dobrać się do nich bez potrzeby konwersji do CSV które też można czytać za pomocą ADO. Proste, wygodne oraz od razu mamy DataSeta którego podpinamy do DBGrida i już. I takie rozwiązanie bym polecał.

0

Wlasnie każdy cennik niby taki sam w excelu a i tak muszę ręcznie po swojemu je zrobić. Dlatego NIE MA znaczenia czy kolumny bedą oddzielane przecinkiem czy średnikiem czy czymkolwiek innym.

W domyśle chce mniej więcej taka strukturę pliku:

APR;IC1003031;Intercooler APR MQB; Intercooler wymiary 50x20x10;800;1200;Euro;50;HTTP://www.adres.pl/obrazek.jpg

Screen z formy w załączniku.
Ok. 20:00 podeśle kod odczytujący plik do stringgrida.

Z góry dziękuje za chęć pomocy

0

@Mr.YaHooo, ja wiem że można - pisałem ten post z myślą o pytaczu, który sam przyznał, że jest w tym temacie zielony; Można zrobić od razu z istniejącymi arkuszami; Mimo wszystko nadal nie wiem z którego środowiska korzysta i jak wyglądają te arkusze.

0

do wspomnianych informacji czyli pliku z przykładowymi danymi i jakie środowisko Delphi czy Lazarus i wersja przydało by się info czy w ogóle na kompie gdzie ma to działać jest zainstalowany Excel.

0
kAzek napisał(a):

do wspomnianych informacji czyli pliku z przykładowymi danymi i jakie środowisko Delphi czy Lazarus i wersja przydało by się info czy w ogóle na kompie gdzie ma to działać jest zainstalowany Excel.

Środowisko to delphi a na komputerze mam excela.

0

To że Delphi to wiadomo od samego początku (z tagów), chodzi o dokładną wersję środowiska; Pisałeś wcześniej o dwóch, ale nie napisałeś z którego ostatecznie chcesz skorzystać.

0
furious programming napisał(a):

To że Delphi to wiadomo od samego początku (z tagów), chodzi o dokładną wersję środowiska; Pisałeś wcześniej o dwóch, ale nie napisałeś z którego ostatecznie chcesz skorzystać.

Delphi 10.1 RAD STUDIO - to dobrze czy źle? Bo wydaje mi się, że jak kiedyś korzystałem z BORLAND 7 to było wszystko jakoś prostsze ;)

Co do kodu, który odczytuje zawartość pliku do stringgrida:

var
  sl, sLine: TStringList;
  i, j: Integer;
begin
  sl := TStringList.Create;
  sLine := TStringList.Create;
  try
    sl.LoadFromFile('c:\p.csv');
    for i := 0 to sl.Count - 1 do
    begin
      sLine.Clear;
      ExtractStrings([','], [' '], PWideChar(sl[i]), sLine);
      if i = 0 then
      begin
        StringGrid1.RowCount := sl.Count;
      end;
      for j := 0 to sLine.Count - 1 do
        StringGrid1.Cells[j, i] := sLine[j];
    end;
  finally
    sLine.Free;
    sl.Free;
  end; 
0

Kolego @furious programming masz jakiś pomysł od której strony to ugryźć?

0

Miałbym pomysł gdybym wiedział co potrzebujesz; A tak to podałeś kod który teoretycznie wczytuje zawartość pliku do komponentu, tyle że nie napisałeś o co chodzi i co dalej; Co więc mam zrobić? Odpowiedzieć, czy ten kod jest dobry? Nie za bardzo - dziwnie te pętle wyglądają, warunek w środku też dziwny;

Napisz dokładnie co masz i przede wszystkim czego oczekujesz, a postaram się pomóc.

0

Napisalem juz na poprzedniej stronie:

Wiec tak, planuje miec 8-9 kolumn z danymi: PRODUCENT, KOD TOWARU, NAZWA TOWARU, WALUTA, CENA ZAKUP, CENA DETAL,OPIS KROTKI, ZDJECIE, WYSYLKA

Rozumiem ze zaladowanie pliku txt z csv do stringrida to najwygodniejsza opcja?
O ile zaladowanie z pliku do stingrida juz jako tako dziala ( wieczorem podesle kod ) o tyle dalej ze stringrida do komponentow juz lezy totalnie.

Na poczatku LISTA PRODUCENTOW ( to bedzie sztywna wartosc, ewentualnie rozwojowo zrobie zaladowanie biezacej listy z pliku txt ) planuje ja miec w listboxie albo listview ( lub cokolwiek z wyborem pozycji ). Po kliknieciu na konkretnego producenta, pokazuje sie w kolejnym memo zawratosc kolumny KOD TOWARU. po kliknieciu w kod towaru pokazuja sie w pozostalych editach i labelach wartosci z pozostalych kolumn w tym rzedzie.

Podsumowujac: kolumna1 ze stringrida do listbox
kolumna2 ze stringrida do memo
kolumny3-8 ze stringrida do editów lub labelów.

0

I struktura pliku:

APR;IC1003031;Intercooler APR MQB; Intercooler wymiary 50x20x10;800;1200;Euro;50;HTTP://www.adres.pl/obrazek.jpg

Sorry za poprzedni post ale samo mnie wylogowało ;/

1

kolumna1 ze stringrida do listbox

Do przepisania wszystkich komórek z danej kolumny do dowolnego komponentu, który posiada kontent w postaci listy typu TStrings, wystarczy użyć metody Assign:

ListBox.Items.Assign(StringGrid.Cols[0]);

Dokładnie to samo można zrobić jeśli chodzi o skopiowanie zawartości danego wiersza;

kolumna2 ze stringrida do memo

To samo - dane zawarte w tym polu edycyjnym także są przechowywane w TStrings:

Memo.Lines.Assign(StringGrid.Cols[1]);

kolumny3-8 ze stringrida do editów lub labelów.

A to wytłumacz, bo nie rozumiem jak chcesz tyle kolumn przenieść do editów.

0
furious programming napisał(a):

A to wytłumacz, bo nie rozumiem jak chcesz tyle kolumn przenieść do editów.
Pewnie program ma tak działaś, że z list boxa wybiera producenta, z memo kod towaru, a w pozostałych polach ukaże się opis danego towaru.

Osobiście to jakbym ja miał to robić to trzymałbym wszystko w 1 pliku csv. Do list boxa ładował bym listę producentów, do memo po wybraniu producenta listę towarów wybranego producenta. A po wybraniu towaru resztę. Wiadomo, że nie jest to coś trudnego. Jednak nie chciałoby mi się pisać tego ręcznie skoro można to zrobić za pomocą kontrolek bazodanowych + parę zapytań i mamy ładnie działający programik o wiele szybciej niż robienie tego z palca.

0
Mr.YaHooo napisał(a):
furious programming napisał(a):

A to wytłumacz, bo nie rozumiem jak chcesz tyle kolumn przenieść do editów.
Pewnie program ma tak działaś, że z list boxa wybiera producenta, z memo kod towaru, a w pozostałych polach ukaże się opis danego towaru.

Dokładnie tak to miałoby działać :)

Osobiście to jakbym ja miał to robić to trzymałbym wszystko w 1 pliku csv. Do list boxa ładował bym listę producentów, do memo po wybraniu producenta listę towarów wybranego producenta. A po wybraniu towaru resztę. Wiadomo, że nie jest to coś trudnego.

Nie można tego zrobić w jednym CSV z tego względu, że co chwile dochodzi nowy producent, nowy cennik - robie program, żeby sobie ułatwić pracę i przyśpieszyć a nie ugrząznąć na codziennym robieniu CSV'a z bieżącymi cenami.

Jednak nie chciałoby mi się pisać tego ręcznie skoro można to zrobić za pomocą kontrolek bazodanowych + parę zapytań i mamy ładnie działający programik o wiele szybciej niż robienie tego z palca.

Niestety jestem na tyle laikiem w temacie, że nie zabiore się za coś o czym niemam pojęcia :(

furious programming napisał(a):

kolumna1 ze stringrida do listbox

Do przepisania wszystkich komórek z danej kolumny do dowolnego komponentu, który posiada kontent w postaci listy typu TStrings, wystarczy użyć metody Assign:

ListBox.Items.Assign(StringGrid.Cols[0]);

Właśnie nie widziałem w tym stringgridzie elementu o dowolnej treści związanego z kolumnami, ani col, ani column - dosłownie nic ;/ tylko ROW :/ Boje sie ze moze nie zadziałac... Moze warto wrócic do delphi 7 - tam to było na pewno...

Dokładnie to samo można zrobić jeśli chodzi o skopiowanie zawartości danego wiersza;

kolumny3-8 ze stringrida do editów lub labelów.
A to wytłumacz, bo nie rozumiem jak chcesz tyle kolumn przenieść do editów.

No cos na zasadzie:

edit1.text := stringgrid.cols[1];
edit2.text := stringgrid.cols[2];
label3.caption := stringgrid.cols[3];

A jak najprościej poradzić sobie z załadowaniem pliku do stringrida po kliknieciu w konkretny index w listboxie?

if ListBox1.ItemIndex := 1 then loadfile(....) i ten kod do ladowania do stringrida?

0
furious programming napisał(a):
ListBox.Items.Assign(StringGrid.Cols[0]);
Memo.Lines.Assign(StringGrid.Cols[1]);

No i nie działa :( NIE MA czegoś takiego jak .Cols... Możliwe, żeby w delphi od RAD Studio nie było takiej podstawowej właściwości?

EDIT Z NOCY :)

ZAINSTALOWAŁEM DELPHI 7 i problemy znikły !!! :)

Odczyt z wybieranego listboxa do kolejnego okna zrobiłem tak:

begin
 if Listbox1.Selected[0] = True then begin
 button1.Click;
 ListBox2.Items.Assign(StringGrid1.Cols[1])
end;
 if Listbox1.Selected[1] = True then begin
 button2.Click;
 ListBox2.Items.Assign(StringGrid1.Cols[1]);
    end;
   end;

Troche na około idę :) Jaki był "knif" na bezpośrednie odpalenie kodu po kliknieciu w konkretny indeks ( tak zeby pominac buttona )?
Button odpala ładowanie z CSV do stringrida

0

No i nie działa :( NIE MA czegoś takiego jak .Cols... Możliwe, żeby w delphi od RAD Studio nie było takiej podstawowej właściwości?

Jak to nie ma? Wszystko jest na swoim miejscu - Vcl.Grids.TStringGrid.Cols

1 użytkowników online, w tym zalogowanych: 0, gości: 1