CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Odczyt danych z komórki EXCELA

Odczyt danych z komórki EXCELA

dział ogólny

Re: Odczyt danych z komórki EXCELA

Nowy postprzez Corvis » piątek, 30 lipca 2010, 23:03

na tą chwilę uruchomiłem ten mechanizm, umiem odpalić excela pokazać go schować itp. Teraz muszę doczytać jak podpiąć się do otwartego pliku i odczytać wartość z komórki. Mam nadzieję, że tak się da. Bardzo ciekawe te Ole Automaticon :)
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Odczyt danych z komórki EXCELA

Nowy postprzez polymorphism » sobota, 31 lipca 2010, 08:50

Użyj GetActiveObject zamiast CoCreateInstance. Funkcja ta zwróci obiekt IUnknown, z którego za pomocą metody QueryInterface wyciągniesz instancję obiektu IDispatch.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt danych z komórki EXCELA

Nowy postprzez Cyfrowy Baron » sobota, 31 lipca 2010, 11:13

Ponieważ korzystasz ze środowiska Embarcadero RAD Studio 2010 proponuję wykorzystać dostępne tam biblioteki z palety OfficeXP lub Office2000 zależy które włączyłeś, gdyż można tylko jedne.

► włączenie bibliotek Office XP lub 2000 


Gdy komponenty masz już włączone wrzuć na formularz komponent TExcelApplication (w przykładzie exApp1). Potem wystarczy już tylko taki prosty kod:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 exApp1->Connect(); // podłącza do otwartego programu Excel

 VARIANT vrText;
 Variant vr = "A1";   // określa komórkę z której będzie pobierana wartość

 // pobiera wartość z zakresu vr:vr, czyli A1:A1
 vrText = exApp1->Range[vr, vr]->get_Text();

 Edit1->Text = vrText.bstrVal; // przepisanie pobranej wartości do pola Edit1

 exApp1->Disconnect(); // rozłączenie
}


Ten kod pozwala pobrać tekst z aktywnego okna programu Excel i nieistotne jest przy tym, czy zawartość okna jest zapisana, czy też nie.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
Corvis
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt danych z komórki EXCELA

Nowy postprzez Corvis » sobota, 31 lipca 2010, 12:06

Wielki dzięki !!!!!!!!!!!!!!!!! Śmiga aż miło, Poco oni schowali te komponenty hehehehe
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Odczyt danych z komórki EXCELA

Nowy postprzez Cyfrowy Baron » sobota, 31 lipca 2010, 15:22

Wykorzystując zdarzenie OnSheetChange komponentu TExcelApplication można zautomatyzować pobieranie zawartości komórki z tabeli Excel'a.

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 if(FindWindow("XLMAIN", 0) == NULL) return; // przerywa jeżeli Excel nie jest uruchomiony

 exApp1->Connect(); // podłącza do otwartego programu Excel

 VARIANT vrText;
 Variant vr = "A1";   // określa komórkę z której bedize pobierana wartość

 // pobiera wartość z zakresu vr:vr, czyli A1:A1
 vrText = exApp1-> Range[vr, vr]->get_Text();

 Edit1->Text = vrText.bstrVal; // przepisanie pobranej wartości do pola Edit1
}
//---------------------------------------------------------------------------
void __fastcall TForm1::exApp1SheetChange(TObject *Sender, LPDISPATCH Sh,
                        ExcelRange *Target)

{
  Variant vr = "A1";
  Edit1->Text = VARIANT( Target->get_Range(vr, vr)->get_Text() ).bstrVal;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
 exApp1->Disconnect(); // rozłączenie
}


W ten sposób jeżeli zmieni się zawartość komórki to program automatycznie pobierze nową zawartość, bez konieczności stosowania pętli czy też Timer'ów.

Kod nie jest bezpieczny, dodałem do niego co prawda funkcje sprawdzającą, czy Excel jest uruchomiony, ale jeżeli w trakcie działania programu Excel zostanie zamknięty to program może wyrzucić błędy. Zdarzenie OnSheetChange jest jednak bezpieczne, gdyż reaguje ono tylko na zmiany w tabeli programu Excel.

Do środowiska nie dołączono dokumentacji dla tych bibliotek, a w sieci trudno znaleźć coś dobrze opracowanego.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt danych z komórki EXCELA

Nowy postprzez Corvis » niedziela, 1 sierpnia 2010, 08:19

Wielkie dzięki,


Spróbuj u siebie zrobić projekt przenoszony na inne komputery. ( DynamicRTL i RUNTIMEPACKAGE) jak to wyłącze - u mnie nie da się skompilowac projektu mam błąd linkera.

[ILINK32 Error] Fatal: Unable to open file 'EXCEL_XP_SRVR.OBJ'



Pozdrawiam,

Ps. W razie czego odpisze dopiero we wtorek bo wyjeżdżam
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Odczyt danych z komórki EXCELA

Nowy postprzez Cyfrowy Baron » niedziela, 1 sierpnia 2010, 10:23

Ja wszystkie projekty domyślnie tworzę z opcję Dynamic RTL = False i odznaczonym Build with runtime packages, więc mogę je dowolnie przenosić między komputerami.
Jeżeli masz z tym problem to może być Bug środowiska i powinieneś pobrać i zainstalować aktualizacje, u mnie patche rozwiązały wiele problemów.

Aktualnie posiadam wersję:

Embarcadero® C++Builder® 2010 Version 14.0.3593.25826
Delphi and C++Builder 2010 Update 5 (Databaze Pack)
Delphi and C++Builder 2010 Update 4
C++Builder 2010 Boost Update





Może mieć to również związek z tym, iż programujesz w systemie Vista. Czy nie czas zainstalować poprawionej Visty, czyli Windows 7?!



Sprawdź również, czy w pliku źródłowym pod sekcją include masz wpis:
KOD cpp:     UKRYJ  
#pragma link "Excel_XP_srvr"


oraz czy w pliku nagłówkowym masz włączone biblioteki:
KOD cpp:     UKRYJ  
#include "Excel_XP_srvr.h"
#include <OleServer.hpp>
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt danych z komórki EXCELA

Nowy postprzez Corvis » wtorek, 3 sierpnia 2010, 20:24

Mam wszystko wgrane + dopisane wszystko to co napisałeś. Po zrobieniu projektu dodaniu komponentu TExcelApplication i wciśnięciu F9 mam to co w screenie.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Odczyt danych z komórki EXCELA

Nowy postprzez Cyfrowy Baron » wtorek, 3 sierpnia 2010, 20:28

Pewnie masz coś źle poustawiane w środowisku, więc musisz poprzez menu Project -> Add to project włączyć bibliotekę: bcbofficexp.lib (lokalizacja: C:\Program Files\Embarcadero\RAD Studio\7.0\lib\release).
Jeżeli nie masz tej biblioteki to źle zainstalowałeś komponenty OfficeXP.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt danych z komórki EXCELA

Nowy postprzez Corvis » wtorek, 3 sierpnia 2010, 20:35

Niestety nie mam jej.

Chyba faktycznie muszę przeinstalować buildera, ale wydaje mi się, że wszystko instalowalem.
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaChrome

Re: Odczyt danych z komórki EXCELA

Nowy postprzez Cyfrowy Baron » środa, 4 sierpnia 2010, 06:22

W trakcie instalacji tego środowiska trzeba wybrać której wersji MS Office będziesz używał, a po zainstalowaniu trzeba te komponenty włączyć. Jeżeli w trakcie instalacji tego nie zrobiłeś, to nie musisz tego od razu instalować od początku, gdyż masz skrót Modify, Repair, Uninstall.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt danych z komórki EXCELA

Nowy postprzez Corvis » czwartek, 5 sierpnia 2010, 10:13

W trakcie instalacji tego środowiska trzeba wybrać której wersji MS Office będziesz używał


Wyszło tak, że musiałem zrobić format. Wgrywając Buildera od nowa nie widziałem takiej możliwości. Zaznaczyłem wszystkie komponenty do zainstalowania.


EDIT:

Po Formacie i przeinstalowaniu tego dalej nie mam tej biblioteki. Może ktoś ją udostępnić ???
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaOpera

Re: Odczyt danych z komórki EXCELA

Nowy postprzez Corvis » czwartek, 5 sierpnia 2010, 12:42

DZIAŁA !!!!!!!!!!!!!!!!!!!!!!!!!!! o to chodziło :) dodałem tego liba i wszystko OK uffff


WIELKIE DZIĘKI
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows VistaOpera

Re: Odczyt danych z komórki EXCELA

Nowy postprzez bigrom » niedziela, 24 lipca 2011, 22:44

Witam,
A jak jest z kompatybilnością komponentu Excel XP z nowy pakietem Office 2010 czy to działa ?
Bo przy próbach na dwóch kompilatorach wyskakuje błąd:


---------------------------
HRCHECK:
---------------------------
(GetDefaultInterface()->get_Range(Cell1, Cell2, (Excel_xp::ExcelRange**)&RHS)) Error: 800A03EC (-2146827284) @ Excel_XP_srvr.cpp/1807
Press [Y]es to terminate, [N]o to continue and [C]ancel to Debug
---------------------------
Tak Nie Anuluj
---------------------------



Dzięki za odpowiedź.
Avatar użytkownika
bigrom
Bladawiec
Bladawiec
 
Posty: 7
Dołączył(a): niedziela, 12 czerwca 2011, 20:08
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: XP Home
Kompilator: Borland Builder, Delphi
Gadu Gadu: 0
    Windows XPFirefox

Re: Odczyt danych z komórki EXCELA

Nowy postprzez Cyfrowy Baron » wtorek, 26 lipca 2011, 08:11

Mało prawdopodobne by zadziałało. Nie bez powodu w środowisku Embarcadero RAD Studio 2010 przy instalacji jest opcja wyboru odpowiedniej wersji bibliotek pomiędzy Office 2000 Server, a Office XP Server. Trzeba chyba uzupełnić środowisko o nowszą wersję bibliotek (o ile istnieją). Przy czym niezgodność dotyczy chyba dopiero MS Office 2007 i 2010, gdyż przeprowadzałem testy z bibliotekami Office XP Server dla pakietu MS Office 2003 i nie było żadnych problemów.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Poprzednia stronaNastępna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 8 gości