[gelöst] Excel und QT

Alles rund um die Programmierung mit Qt
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

also... den ersten entwurf ist fertig....

http://ciz.ch/svnciz/xls2sql/messdaten_a.xml
http://ciz.ch/svnciz/xls2sql/excel2003xml_2_sql.xsl

die excel daten habe ich gesehen.... du machts einmal vertikal und einmal horrizzontal ... das geht leider nicht... sondern jede tabelle muss die kopf daten haben und die daten zeile fuer zeile... wie ....

http://ciz.ch/svnciz/xls2sql/ xls der converter ist xsl die namen sind gegeben.... und das Bill Gate in seine namenspache xslt ss: verwendet ist nicht meine schuld.....

mess daten messdaten_a.xml ist ein den excel2003 export macro xml resultat ... (habe ich mit openoffice2 gemacht .. doch die namenspace sind gleich die sind registriert.)

der converter zu einem sqlite3 dump ist excel2003xml_2_sql.xsl dort muss man herum feilen dass die schleifen "xsl:for-each" richtig fuer ein dump sind die erste zeile ist der name der kolonne...

Code: Alles auswählen

<xsl:for-each select="//ss:Worksheet/ss:Table/ss:Row">
<xsl:variable name="aktuellename" select="../../@ss:Name" />
<xsl:if test="$tabs = $aktuellename">
position |<xsl:value-of select="position()" />| cell Height |<xsl:value-of select ="@ss:Height"/>| Daten Inhalt: |<xsl:value-of select ="ss:Cell/ss:Data"/>|
</xsl:if>
</xsl:for-each>
den text result ist dann so nach dem feilen:


Code: Alles auswählen

BEGIN TRANSACTION;
CREATE TABLE member_a (Bearb_Name, Member_ID);
INSERT INTO member_a VALUES('Marco812',200);
INSERT INTO member_a VALUES('Marco815',201);
INSERT INTO member_a VALUES('Müller1',202);
INSERT INTO member_a VALUES('Müller2',203);
INSERT INTO member_a VALUES('Mayer',204);
INSERT INTO member_a VALUES('Mayer1',205);
INSERT INTO member_a VALUES('Mayer2',206);
INSERT INTO member_a VALUES('Pluto',207);
CREATE TABLE messdaten_a (ID, Member_ID, A, B, C, D, F, G, H, I, L);
INSERT INTO messdaten_a VALUES(1,200,15.6,12.3,69.8,101.5,48.7,22.3,66.4,33.2,98.5);
INSERT INTO messdaten_a VALUES(2,200,45.3,14.6,66.3,98.3,48.6,23.8,65.2,34.6,95.6);
INSERT INTO messdaten_a VALUES(3,200,21.5,16.9,62.8,95.1,48.5,25.3,64,36,92.7);
INSERT INTO messdaten_a VALUES(4,202,22.9,19.2,59.3,91.9,48.4,26.8,62.8,37.4,89.8);
INSERT INTO messdaten_a VALUES(5,203,11,21.5,55.8,'',48.3,28.3,61.6,38.8,86.9);
INSERT INTO messdaten_a VALUES(6,205,23.8,23.8,52.3,'',48.2,29.8,60.4,40.2,84);
INSERT INTO messdaten_a VALUES(7,201,10.5,26.1,48.8,'',48.1,31.3,59.2,41.6,81.1);
INSERT INTO messdaten_a VALUES(8,201,55.1,28.4,45.3,79.1,48,32.8,58,43,78.2);
INSERT INTO messdaten_a VALUES(9,201,33.2,30.7,41.8,75.9,47.9,34.3,56.8,44.4,75.3);
INSERT INTO messdaten_a VALUES(10,201,48.3,'',38.3,72.7,47.8,35.8,55.6,'',72.3999999999999);
INSERT INTO messdaten_a VALUES(11,201,29.7,'',34.8,69.5,47.7,37.3,54.4,'',69.4999999999999);
INSERT INTO messdaten_a VALUES(12,207,12.9,'',31.3,66.3,47.6,38.8,53.2,'',66.5999999999999);
INSERT INTO messdaten_a VALUES(13,206,41.6,'',27.8,63.1,47.5,40.3,52,'',63.6999999999999);
INSERT INTO messdaten_a VALUES(14,206,47.8,42.2,24.3,59.9,47.4,41.8,50.8,'',60.7999999999999);
INSERT INTO messdaten_a VALUES(15,205,9.2,44.5,20.8,56.7,47.3,43.3,49.6,'',57.8999999999999);
COMMIT;

So dann hast du die excel dabelle im QT drinnen und kannst alle berechnungen machen und der export geht dann auch via xml ins excel format wie das import...



unter http://de.selfhtml.org/ xml format && http://www.zvon.org/xxl/XSLTreference/Output/index.html sind referenzen...
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

gut ist getestet und funktioniert habe probiert mit 3500 excel zeilen..

http://ciz.ch/svnciz/xls2sql/excel2003xml_2_sql.xsl
einfach die erste und die comment zeile mit ### nicht einlesen!

das result ist dann so... egal was fuer daten in der excel drinn sind
das name feld kommt aus der erste zeile........

So hast du eine datenbank und kannst alle berechnungen machet....
sollte auch mit dem QTsqlite plugin gehen ....


Code: Alles auswählen

BEGIN TRANSACTION;
##### total tables 3 #####
##### total rows 3012 #####

#####################################
##### Create table command  start tablenr.(1) table name "Tabelle1" #####

CREATE TABLE Tabelle1 ('TEXT ID' ,'TEXT Name' ,'TEXT Vorname' ,'TEXT Adresse' ,'TEXT PLZ' ,'TEXT Ort' ,'TEXT Land' ,'TEXT Tel' ,'TEXT Fax' );

##### Create table command end  #####
#####################################

INSERT INTO Tabelle1 VALUES (1,'Fafaf','Agag','Aga','Ag','Gag','Agag','Agag','Agag');
INSERT INTO Tabelle1 VALUES (2,'Aga','agag','Aga','Aga','Aga','agag','agag','agag')

mit den daten kannst du denn alles anstellen...
und die db qtable ist ja bereist fertig... der excel kommt einfach als xml raus mit macro... sogar openoffice 2 kennt den 2003 excel standard ...
wen ein neues format kommt .. einfach den converter aendern....

ciao
Marco812
Beiträge: 139
Registriert: 22. November 2005 11:28

Beitrag von Marco812 »

Hallo,

vielen dank für die tolle Hilfe, jetzt hast du dir aber richtig viel Arbeit gemacht. Ich hätte dazu aber noch ein paar Fragen. Also optisch sieht das ganze doch anders aus als ich mir das vorgestellt habe (siehe Vorlage) und wie es zum Schluss aussehen muss. Das sollte aber dann mein Problem sein und von mir angepasst werden. Was viel wichtiger ist, aber mir nicht ganz klar, wie ich die Dateien einsetzen kann um die Daten von meiner QMap mit Hilfe des Konverter (excel2003xml_2_sql.xsl) ? in eine *.xls zu schreiben und diese von einer *.xls in meine QMap wieder einlesen kann. Wie sieht es eigentlich mit Fehleingaben aus? Was ist z.B. wenn jemand bei den Messdaten Buchstaben eingibt, was nicht sein darf, wie kann ich das prüfen?

Gruß

Marco812
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

in deinen programm must du keine xsl (converter schreiben) oder xls(excel)
sondern eine xml... dan kanst du !nicht nur in excel exportieren sondern auch pdf , rtf , openoffice format, csv ..ecc...

eine xml von der db datenbank geht in etwa so:

Code: Alles auswählen

extern "C" {
#endif

    
struct sqljumper {
  sqlite3 *db;            /* The database */
  int cnt;               /* Number of records displayed so far */
  int mode;              /* An output mode setting */
  int showHeader;        /* True to show column names in List or Column mode */
  QString zDestTable;      /* Name of destination table when MODE_Insert */
  QString CleanTableName;  /* Name of destination table when export dump */
  QString separator;    /* Separator character for MODE_List */
  int colWidth[100];     /* Requested width of each column when in column mode*/
  int actualWidth;  /* Actual width of each column */
  QString nullvalue;    /* The text to print when a NULL comes back from*/
  QString zDbFilename;    /* name of the database file */
};

static int normalcallback( void *pArg , int argc, char **argv, char **azColName) {
     struct sqljumper *p = (struct sqljumper *)pArg;
     int i;
     struct sqljumper d3;
     d3 = *p;
     QString workfile = QString( "%1/.%2/labeldb_normal.xml" ).arg( QDir::homePath() , _PROGRAM_SHORT_NAME );
     QString workdir = QString( "%1/.%2/" ).arg( QDir::homePath() , _PROGRAM_SHORT_NAME );
     QDir dir(workdir);
     if (dir.mkpath(workdir)) { /* make dir if not exist! */ }         
     QFile f( workfile );
     QString  field , data;
     if ( f.open( QFile::Append | QFile::Text ) )
	 {
        QTextStream sw( &f );
        QString timing = QString( "%1" ).arg(time( NULL ));
        sw << "\t\t<table bench_unixtime=\"" << timing << "\" name=\"" << d3.zDestTable << "\" cleanname=\"" << d3.CleanTableName << "\">\n";
        sw << "\t\t\t<row>\n";
        for(i=0; i<argc; i++){  /* azColName[i]  */
         data = QString( "data=\"%1\" " ).arg(argv[i] ? argv[i] : "NULL"); 
         field = QString( "field=\"%1\" " ).arg(azColName[i]);
         sw << "\t\t\t<rows id=\"" << i << "\" " << field << data << "/>\n ";
        }
        sw << "\t\t\t</row>\n";
        sw << "\t\t</table>\n";
		f.close();
	}
      return 0;
}
/* der source von http://sqlitebrowser.sourceforge.net/  qt3!  ist voll mit beispielen... */

#ifdef __cplusplus
}  /* End of the 'extern "C"' block */
#endif

vom file xslt => http://ciz.ch/svnciz/dialog_qt/qt4_a/cu ... _wrapper.h

und xslt kann dir das xml file auf vielen arten darstellen ...
pdf , rtf => http://xmlgraphics.apache.org/fop/
latex => bei sf.net suche xslt + latex
open office .. auch bei sf.net vorhanden...

und wenn ein format aendert musst du den programm nicht aendern sondern nur. dass xsl file und ehrlich gesagt xslt kann sehr viel .. regx gross schreiben und ecc... http://www.zvon.org/xxl/XSLTreference/Output/index.html
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

zur zeit sehe ich etwa 3 - 4 projekte di mit xslt arbeiten...
eins sogar in qt4 ist albumshaper2 http://albumshaper.sourceforge.net/
der nimt bilder und macht sie zu einem prima album .. fertig um es aufs web zu pubblizieren... der converter ist dort albumshaper2\src\backend\tools\xmlTools.h und was bereit fertig ist
http://excelxslreport.sourceforge.net/ von datenbank zu excel!
http://sourceforge.net/project/showfile ... _id=157814
nicht zu vergessen das standard xslt ist erst im 2003 zu einem iso norm geworden... http://www.w3.org/TR/xslt
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Hast du gesehen.... http://sourceforge.net/project/showfile ... _id=157814
Dieses ding macht es auf die selbe art .... aber! mit java jar's ...
Was wiederum nicht so elegant ist... man kann ja die leute nicht zwingen java zu installieren... darum studierte ich lange an xslt auch bei web-applikationen .. mit dem resultat das man mit diesen libs fast alles convertieren kann...(qt ui file imbegriffen) jetzt ab heute lauft es ziemlich stable das qt ding http://ppk.ciz.ch/win_build/vxsltproc_win32_0.3.tar.bz2 heute habe ich eine excel direkt zu pdf gemacht... mit fop..
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Nun ist das ganze excel2sql auch da....

Beitrag von patrik08 »

da so viele leute fast 3000 mal ..... :o In dieser excel in qt reinschauen...

Habe ich die applikation al Ubung fertig gemacht ... (so kann ich mein buchaltung-programm erweitern mit excel import...)

selber probieren.... http://ppk.ciz.ch/win_build/excelxml_sql.tar.bz2
(zu sqlite bringen den sqldump ... selbst in action treten..)
Source => terminal:
svn co http://ciz.ch/svnciz/dialog_qt/qt4_a/excel2sqlinsert/ excel2sqlinsert

Obwohl ich da ein Bug! vielleicht enteckt habe.... da XML ja bekant utf8 ist wen das file mehr als 1000 zeilen hat ... kann man nicht ins latin1 convertieren..... im source ist ein beispiel mit alle Schweizer Ortschaften mit postleitzahl als test daten.... excel und openoffice sowie xml 2003 Microsoft standard...
Marco812
Beiträge: 139
Registriert: 22. November 2005 11:28

Beitrag von Marco812 »

Hallo,

vielen dank für die tolle Unterstützung und das Beispiel, funktioniert alles bestens!

Gruß

Marco812


P.S.
So wie es aussieht hast du auch noch vielen anderen geholfen, über 3000 aufrufe, super Rekord würde ich mal sagen, aber den hast du dir auch verdient ;-)
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Als gegen leistung .... koentest du an den sqlite dump export denken....

den import dump kann so ausgelesen werden....

Code: Alles auswählen

  QSqlQuery query;
  QString alls ="";
  QFile file( sqldump_insert_file );
  QTextStream in(&file);
    
        while (!in.atEnd()) {
         ++countnr;
         inside = in.readLine(0);  /* line by line (); */
            
            if (inside.size() > 1 and !inside.startsWith("#", Qt::CaseInsensitive) ) ) {
                
                if (alls.size() > 0) {
                /*  erste zeile */
                query.exec(inside.replace(QString(";"), QString("")));   /* das letzte ; will qt nicht doch alle andere sqls ja */
                alls = alls+"\n"+ inside;
                } else {
                /*  erste zeile */
                query.exec(inside.replace(QString(";"), QString("")));   /* das letzte ; will qt nicht doch alle andere sqls ja */
                alls = inside;
                }
            }
        }
        
  QString alleausgefuhrete_query =alls;

doch den export mit dem qtsqlite plug-in bringe ich nicht hin..
nur mit der "normale" sqlite3" libs

wie :
http://ciz.ch/svnciz/dialog_qt/qt4_a/cu ... lite3_db.h
http://ciz.ch/svnciz/dialog_qt/qt4_a/cu ... te3_db.cpp
http://ciz.ch/svnciz/dialog_qt/qt4_a/current/adb.h

demo im http://ppk.ciz.ch/win_build/vxsltproc_win32_0.3.tar.bz2 query demo pop-up... dialog

als resultat ist ein sauberes xml ... das wieder zu excel werden kann...
aber ob das geht "normale" sqlite3" libs + qtsqlite plug-in ist ein bisschen kabelsalat..
Marco812
Beiträge: 139
Registriert: 22. November 2005 11:28

Beitrag von Marco812 »

Hallo,

nochmals vielen Dank. Das werde ich auch demnächst brauchen, wenn es funktioniert, melde ich mich bei dir bzw. hier in Forum.

Gruß

Marco812
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Beim import bin ich bereits vorbei ... (sind alle funktionen die ich fuer die buch-haltungs app brauche)
den export auch zu 90%

export pdf , sql , xml , excel export geht in der jetzige version nur mit drag...drop...

dies bedeutet eine excel leere aufmachen oder openoffice und das resultfile hineinziehen..

zum reinschauen.. http://ciz.ch/svnciz/dialog_qt/qt4_a/sqlite3function/

auch auf mac kompilierbar und ... funktioniert...
Dateianhänge
Qexcel
Qexcel
qexcel.png (57.75 KiB) 6405 mal betrachtet
ArneStocker
Beiträge: 300
Registriert: 3. November 2004 16:15
Wohnort: Berlin

Beitrag von ArneStocker »

..hat sich erledigt, ich hatte die zweite Seite übersehen :oops:
Gruss Arne
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

Wegen der grosse nachfrage von file und beispielen auf meinem server.... werden in diesem threads gewisse link nicht mehr gehen...

Darum habe ich alles iher geladen...

http://sourceforge.net/projects/qtexcel-xslt/

in einem neuen Projekt namen Qexcel Converter SQL

MFK aus der Italienische Schweiz
Antworten