Avatar billede bif_pin Nybegynder
11. september 2005 - 21:30 Der er 27 kommentarer

Læs fra Excel ark med C++ Borland Builder

Hej folks

Jeg vil meget gerne hive nogle data ud fra et excel ark. Jeg bruger C++ og Borland Builder. Er der en som evt. kan vedlægge et eksempel.

Med venlig hilsen
Tom
Avatar billede arne_v Ekspert
11. september 2005 - 21:32 #1
Nogen preferencer til API ? Eller kan ODBC bruges ?
Avatar billede bif_pin Nybegynder
11. september 2005 - 21:34 #2
Meget gerne API tak.
Avatar billede arne_v Ekspert
11. september 2005 - 21:37 #3
Det skal uden tvivl gennem et API. Men hvilket. De indbyggede i Borland ?
Standard ODBC ? OLE DB/Active X ? noget helt fjerde ?
Avatar billede bif_pin Nybegynder
11. september 2005 - 21:46 #4
Mit ønske var at hente data fra excel arket ud i en almindelig tekstfil. Programmet skal laves således at jeg kan køre det selvstændigt i sidste ende. Jeg har før haft problemer med dette med ganske alm. variabler som String i Borland. Derfor tror jeg at det gerne må være standard ODBC hvis det er muligt. Men hvad er nemmest Arne? Du er eksperten.

MVH
Tom
Avatar billede bif_pin Nybegynder
11. september 2005 - 21:47 #5
PS: Når jeg mener selvstændigt, mener jeg et program som kan eksekveres uden Borland Builder installeret
Avatar billede arne_v Ekspert
11. september 2005 - 21:53 #6
jeg kan prøve at lave et ODBC eksempel
Avatar billede arne_v Ekspert
11. september 2005 - 22:04 #7
som jeg tænkte jeg tog noget eksisterende ODBC C kode jeg havde liggende, snuppede
en connection string fra www.connectionstrings.com og så virkede det

Book1.xls
=========

F1    F2
1    A
2    BB
3    CCC
4    Lang tekst

xls2txt.c
=========

#include <stdio.h>
#include <stdlib.h>

#include <windows.h>
#include <sql.h>
#include <sqlext.h>

int main()
{
  SQLHENV Environment;
  SQLHDBC DataBaseConnect;
  SQLHSTMT stmt;
  SQLRETURN stat;
  char *constr = "Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=C:\\Book1.xls;";
  char outconstr[1024];
  int outconlen;
  char *sqlstr = "SELECT * FROM [sheet1$]";
  int i;
  char s[50];
  int il,sl;
  stat = SQLAllocEnv(&Environment);
  stat = SQLAllocConnect(Environment,&DataBaseConnect);
  stat = SQLDriverConnect(DataBaseConnect,NULL,
                          (SQLCHAR *)constr,(SQLSMALLINT)strlen(constr),
                          (SQLCHAR *)outconstr, (SQLSMALLINT)sizeof(outconstr),
                          (SQLSMALLINT *)&outconlen,SQL_DRIVER_COMPLETE);
  stat = SQLAllocStmt(DataBaseConnect,&stmt);
  stat = SQLExecDirect(stmt,(SQLCHAR *)sqlstr,strlen(sqlstr));
  stat = SQLBindCol(stmt,1,SQL_C_LONG,&i,sizeof(i),(SQLINTEGER *)&il);
  stat = SQLBindCol(stmt,2,SQL_C_CHAR,s,sizeof(s),(SQLINTEGER *)&sl);
  for(;;)
  {
      stat = SQLFetch(stmt);
      if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO)) break;
      s[sl] = '\0';
      printf("%d %s\n",i,s);
  }
  SQLFreeStmt(stmt,SQL_DROP);
  SQLDisconnect(DataBaseConnect);
  SQLFreeConnect(DataBaseConnect);
  SQLFreeEnv(Environment); 
  return 0;
}

test
====

C:\>bcc32 xls2txt.c odbc32.lib
Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
xls2txt.c:
Warning W8004 xls2txt.c 30: 'stat' is assigned a value that is never used in function main
Turbo Incremental Link 5.65 Copyright (c) 1997-2002 Borland

C:\>xls2txt
1 A
2 BB
3 CCC
4 Lang tekst
Avatar billede arne_v Ekspert
11. september 2005 - 22:05 #8
ovenstående kode forventer at der er kolonne headere og at man ved hvilke
kolonner der er (i dette tilfæle en tal og en tekst kolonne), men
det er da en start
Avatar billede bif_pin Nybegynder
12. september 2005 - 07:13 #9
Hej Arne.

Tak for din kode. Jeg prøver det lige af i aften.

Med venlig hilsen
Tom
Avatar billede bif_pin Nybegynder
12. september 2005 - 19:27 #10
Hej Arne.

Jeg får følgende Linker Error

[Linker Error] Unresolved external 'SQLAllocEnv' referenced from C:\PROGRAMMER\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'SQLAllocConnect' referenced from C:\PROGRAMMER\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'SQLDriverConnect' referenced from C:\PROGRAMMER\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'SQLAllocStmt' referenced from C:\PROGRAMMER\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'SQLExecDirect' referenced from C:\PROGRAMMER\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'SQLBindCol' referenced from C:\PROGRAMMER\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'SQLFetch' referenced from C:\PROGRAMMER\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'SQLFreeStmt' referenced from C:\PROGRAMMER\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'SQLDisconnect' referenced from C:\PROGRAMMER\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'SQLFreeConnect' referenced from C:\PROGRAMMER\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
[Linker Error] Unresolved external 'SQLFreeEnv' referenced from C:\PROGRAMMER\BORLAND\CBUILDER5\PROJECTS\UNIT1.OBJ
Avatar billede arne_v Ekspert
12. september 2005 - 19:28 #11
du skal linke med odbc32.lib
Avatar billede bif_pin Nybegynder
12. september 2005 - 19:36 #12
Tak men vil du ikke være venlig at fortælle hvordan jeg gør det. Jeg må indrømme at jeg har været væk fra C++ og Borland Builder et stykke tid eftersom jeg ikke bruger det arbejdsmæssigt.

MVH
Tom
Avatar billede bif_pin Nybegynder
12. september 2005 - 19:39 #13
Jeg skal lige sige at jeg normalt kører programmer i selve borland builder ved tryk på den grønne pil
Avatar billede arne_v Ekspert
12. september 2005 - 19:44 #14
jeg bruger selv kun borland command line ikke IDE

det gemmer sig sikkert ind i projevt properties eller sådan noget
Avatar billede bif_pin Nybegynder
12. september 2005 - 20:00 #15
Jeg kan ikke rigtig få det til at spile. Kan du venligst vise mig kørslen fra commandopromten?

MVH
Tom
Avatar billede arne_v Ekspert
12. september 2005 - 20:04 #16
den postede jeg da i går aftes !?!?
Avatar billede arne_v Ekspert
12. september 2005 - 20:11 #17
lidt googling antyder:

project options
linker tab
Avatar billede bif_pin Nybegynder
12. september 2005 - 20:25 #18
Nu har jeg prøvet at linke forskellige steder uden held. Det virker åbenbart ikke eller også er det bare mig.

I sidste ende må jeg så finde på noget andet

mvh
Tom
Avatar billede bif_pin Nybegynder
13. september 2005 - 21:07 #19
Nu kører programmet (i dospromten) men det angiver ingen resultater. Jeg har udfyldt exelarket med samme tal og tekst kombination som dig Arne. Jeg har også formateret kollonerne med hhv. en tal og tekst kolonne. Jeg ved bare ikke hvad kolonne headere er for noget. Kan det være det som mangler?
Avatar billede arne_v Ekspert
13. september 2005 - 21:09 #20
det er F1 og F2 i mit eksempel

for at fejlfinde det skal du nok teste på stat
Avatar billede arne_v Ekspert
29. september 2005 - 20:10 #21
kommet videre ?
Avatar billede bif_pin Nybegynder
02. oktober 2005 - 09:47 #22
Hej Arne.

Jeg er desværre gået lidt i stå og der skyldes at jeg ikke er helt sikker på hvad jeg skal gå ind og rette og teste på i "stat".
Avatar billede arne_v Ekspert
02. oktober 2005 - 09:58 #23
if((stat!=SQL_SUCCESS)&&(stat!=SQL_SUCCESS_WITH_INFO))
  {
      printf("Error i xxxxx kald\n");
  }

er en god ting
Avatar billede bif_pin Nybegynder
02. oktober 2005 - 11:10 #24
Tusinde tak. jeg prøver mig lidt frem med overstående.
Avatar billede arne_v Ekspert
04. november 2005 - 20:30 #25
kommet videre ?
Avatar billede bif_pin Nybegynder
08. november 2005 - 07:17 #26
Jeg har prøvet at debugge gennem Borland IDE hvor jeg fik inkluderet ODBC.lib. Her prøvede jeg at koncentrere mig om at hente en type variant SQL_C_CHAR. I mit excell sheet er mit felt sat til tekst. Men jeg kan stadig ikke få programmet til at hente værdierne fra excell sheetet.
Avatar billede arne_v Ekspert
08. november 2005 - 08:30 #27
Hvordan ser din kode ud ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester