DATABASE CONVERTOR XLS <--> DB

cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 - 17 déc. 2004 à 16:46
sollo Messages postés 1 Date d'inscription vendredi 5 juillet 2013 Statut Membre Dernière intervention 5 juillet 2013 - 5 juil. 2013 à 02:36
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/28226-database-convertor-xls-db

sollo Messages postés 1 Date d'inscription vendredi 5 juillet 2013 Statut Membre Dernière intervention 5 juillet 2013
5 juil. 2013 à 02:36
thanks very much
ka124b Messages postés 3 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 1 décembre 2011
16 avril 2013 à 15:29
merci bq pour cette source,
est ce que vous pouvez m'aider a transferer Excel a des tables interbase (IBTable) Merci .
jolijoli Messages postés 3 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 20 décembre 2010
20 déc. 2010 à 13:27
Bonjour et merci pour cette source,
je vous propose ci dessous quelques améliorations pour la fonction DB vers Excel
{------------------------------------------------------------------------------}
{Programmeur : Jean-Marc PIRES 23/06/2004 }
{ Exportation de la table sous excel. }
{ Rectifié joliJoli 19/12/2010 }
{ - Extension aux TDataset pour pouvoir exporter une requete SQL }
{ - corrigée la fonction ColExcel (qui ne marche pas au delà de la ligne 52 }
{ - traitement par ligne au lieu de colonne pour améliorer les performances }
{ sur de grandes tables (on ne parcoure la table qu'une seule fois) }
{ - Fourniture d'un nom de fichier par défaut (Nomtable pour les tables, }
{ ou NomComposant pour les requêtes }
{------------------------------------------------------------------------------}
//Définition globale
const
cXLSext = '.xls'; //.xlsx

var RepSaveDbToXls : string;

//procedure ExtractionExcel(TableTemp : TTable; var MemoTemp : TMemo{; var GaugeTemp : TGauge});
procedure ExtractionExcel(TableTemp : TDataset; var MemoTemp : TMemo{; var GaugeTemp : TGauge});

var I, J, ndx : Integer;
OleApplication : Variant;
OleWorkBook : Variant;
TypeChampAr : array[0..511] of String;
TypeChamp
, ColXls
, NomTable
, NomChamp
, NomFichier : String;
Cond : Boolean;
SaveDialogDb : TSaveDialog;

//***********************************************************************
{Permet de retrouver les colonnes AA .. ZZ sous excel}
function ColExcel(Col : Integer) : ShortString;
begin
If Col > 25 then
//Result := format('%d %s', [Col, Chr(64 + Col div 26) + Chr(65 + Col mod 26)])
Result := Chr(64 + Col div 26) + Chr(65 + Col mod 26)
else
//Result := format('%d %s', [Col, Chr(65 + Col)]);
Result := Chr(65 + Col);
end;
//***********************************************************************

begin
{On récupère le nom de la table ou query}
if TableTemp is TTable
then NomTable := Ttable(TableTemp).TableName
else NomTable := TableTemp.Name;

{Création de la boite de sauvegarde}
SaveDialogDb := TSaveDialog.Create(nil);

Try
{Initialisation de la boite de sauvegarde}
SaveDialogDb.Title := 'Sauver le fichier excel';
SaveDialogDb.Filter := 'Fichiers Excel (*.xls)|*.xls';
SaveDialogDb.FileName := changefileext(NomTable, cXLSext);
SaveDialogDb.InitialDir := RepSaveDbToXls;

If SaveDialogDb.Execute then
begin
{Récupération des infos de la boite de sauvegarde et sauvegarde du repertoire dans l'ini}
RepSaveDbToXls := ExtractFilePath(SaveDialogDb.FileName);
//SaveIni;

{On récupère le nom du fichier}
NomFichier := ExtractFileName(SaveDialogDb.FileName);

{Barre de progression + Memo}
//GaugeTemp.Visible := True;
MemoTemp.Lines.Add( 'Extraction de la table dans ' +
RepSaveDbToXls +
NomFichier);
MemoTemp.Update;

{Connection à excel}
Try
{On bloque l'affichage}
TableTemp.DisableControls;

{On lance excel}
{Création du lien OLE pour la classe référencé par Excel dans la base de registre "Excel.Application"}
OleApplication := CreateOleObject('Excel.Application');

{On ouvre le fichier voulu}
OleWorkBook := OleApplication.Workbooks.Add;

{On sélectionne l'onglet dans lequel on va entrer les données}
OleWorkBook.Worksheets.Item['Feuil1'].Activate;

{On colorie la premiere ligne en jaune}
OleApplication.Range['A1:'+ColExcel(TableTemp.FieldCount)+'1'].Interior.ColorIndex := 6;

{On applique les filtres auto}
//OleApplication.Range['A2:'+ColExcel(I-1)+IntToStr(J)].AutoFilter;

{Initialisation de la progressbar}
//GaugeTemp.MaxValue := TableTemp.FieldCount;
//GaugeTemp.Progress := 1;

MemoTemp.Lines.Add( 'Extraction des colonnes');
ndx := MemoTemp.Lines.Count;
MemoTemp.Lines.Add( '');

//définit le format des données par colonnes
For I:= 0 to TableTemp.FieldCount-1 do
begin
//Recherche du type de champ
case TableTemp.Fields.Fields[I].DataType of
FtString : If TableTemp.Fields.Fields[I].Size = 16
then TypeChampAr[I] := 'S'
else TypeChampAr[I] := 'S' + IntToStr(TableTemp.Fields.Fields[I].Size);
FtFloat : TypeChampAr[I] := 'F';
FtInteger : TypeChampAr[I] := 'I';
FtDate : TypeChampAr[I] := 'D';
FtTime : TypeChampAr[I] := 'T';
FtDateTime : TypeChampAr[I] := 'DT';
FtMemo : TypeChampAr[I] := 'M';
//FtGraphic : TypeChamp := 'G';
end;

{Récupération du nom de ce champ}
NomChamp := TableTemp.Fields.Fields[I].FieldName;
ColXls := ColExcel(I);
OleApplication.Cells[1,ColXls].Formula := NomChamp;

MemoTemp.Lines[ndx] := Format( NomChamp+' %d/%d col:%s',
[I, TableTemp.FieldCount, ColXls]
);
MemoTemp.Update;
end;

//Exporte les données par ligne
Cond := TableTemp.FindFirst;
//Récupération du contenu de ces champs
J := 2;
While Cond do
begin
//On indique l'état d'avancement dans le memo
MemoTemp.Lines[ndx] := Format( 'Extraction de la ligne%d/%d',
[J-1, TableTemp.recordcount]
);
MemoTemp.Update;

for I := 0 to TableTemp.FieldCount-1 do
begin
if TypeChampAr[I] = 'F' then OleApplication.Cells[J,ColExcel(I)].NumberFormat := '0.000';
OleApplication.Cells[J,ColExcel(I)].Formula := TableTemp.Fields.Fields[I].AsString;
end;

Cond := TableTemp.FindNext;
Inc(J);
end;

{On renomme l'onglet}
OleWorkBook.Worksheets.Item['Feuil1'].Name := NomTable;

{On désactive les messages d'excel}
OleApplication.DisplayAlerts := False;

OleApplication.ActiveWorkBook.SaveAs(RepSaveDbToXls + NomFichier);

{On Réactive les messages d'excel}
OleApplication.DisplayAlerts := True;
Finally
{On rend excel visible}
OleApplication.Visible:=True;

{On réactive les mise à jour de la base}
TableTemp.EnableControls;

{On ferme le lien ole}
{Barre de progression}
//GaugeTemp.Visible := False;
{On confirme la fin de l'extraction et on initialise les boutons du menu}
MemoTemp.Lines.Add('Extraction de la table "' + NomTable + '" terminée.');
end;
end;
Finally
SaveDialogDb.Free; {On libère le mémoire}
end;
end;
merazkaabdennebi Messages postés 4 Date d'inscription samedi 5 août 2006 Statut Membre Dernière intervention 10 février 2009
10 févr. 2009 à 09:23
bonjour JMP77
bon merci pour ton application, moi g'ai une application développée par delphi avec une base de donnée access, est ce que ce code va m'aider pour importer et exporter ver ma base access et que ce que je doit modifier comme code merci d'avance.
merazkaabdennebi Messages postés 4 Date d'inscription samedi 5 août 2006 Statut Membre Dernière intervention 10 février 2009
10 févr. 2009 à 09:20
bon merci pour ton application, moi g'ai une application développée par delphi avec une base de donnée access, est ce que ce code va m'aider pour importer et exporter ver ma base access et que ce que je doit modifier comme code merci d'avance.
Chipit2001 Messages postés 1 Date d'inscription mardi 11 mai 2004 Statut Membre Dernière intervention 1 février 2009
1 févr. 2009 à 08:46
Excellent programme qui se compile sans problème sous Delphi 7.
Un petit soucis cependant avec la conversion de champs Date (format Date sous Excel)
Curieusement le champs Fttime est correctement formaté en Excel à l'opposé du champs créé via Ftdate qui se retrouvait en Excel sous forme de String.

Dans DbtoXls après la récupération du type de champs, j'ai ajouté :
if TypeChamp = 'D' then
OleApplication.Cells[J,I].Formula := TableTemp.Fields.Fields[I].AsDateTime
else .... (autre champs en AsString )

Je n'ai évidement pas testé tous les format de cellules sous Excel, mon soucis étant la conversion de champs heures et dates.

Encore merci pour ce source.
merazkaabdennebi Messages postés 4 Date d'inscription samedi 5 août 2006 Statut Membre Dernière intervention 10 février 2009
19 janv. 2009 à 11:43
merci amigo gé essayé votre application sa marche très bien merci pour tan effort
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
28 sept. 2008 à 12:17
Quelle version de Delphi il faut utiliser pour compiler ce prog ? j'ai essayé avec TurboDelphi4NET_FR.exe mais je n'y arrive pas, merci pour toute aide.
haouarin Messages postés 1 Date d'inscription samedi 10 mai 2008 Statut Membre Dernière intervention 9 juin 2008
9 juin 2008 à 11:11
MERCI
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
30 mai 2008 à 18:23
Bonsoir,
Quels composants?
Utilisateur anonyme
30 mai 2008 à 15:41
MERCI, MAIS je peut pas le lire il y a des composant qui ne son't disponible sous delphi 5 aidez mois SVP
bassman100 Messages postés 1 Date d'inscription dimanche 2 janvier 2005 Statut Membre Dernière intervention 27 novembre 2005
27 nov. 2005 à 22:45
Ce prog a l'air super bien fait. Enfin, d'après ce que j'en ai lu parce mon delphi 5 n'en veux pas : form1.designsize, il connait pas(snif).
meznet2003 Messages postés 1 Date d'inscription dimanche 1 juin 2003 Statut Membre Dernière intervention 1 mai 2005
1 mai 2005 à 23:38
c'est tres pratique ....
merci
DGPat Messages postés 53 Date d'inscription samedi 27 mars 2004 Statut Membre Dernière intervention 1 août 2006
6 janv. 2005 à 13:04
Hello JMP77,

Les grandes idées se rejoignent, justement je suis occupé à me prendre la tête avec les filtres (hé oui encore) mon idée est que je veux que ma table filtre par exemple toutes les factures non réglées a la date d'aujourd'hui,et pas seulement celles qui sont à la date du jour(je sais pas si je suis clair) là ou ton prog de convertion est idéal c'est parce que je récupére des fichiers Excel où il y a des formules qui me mettent une lettre pour les fact en question ces fichiers sont mis à jour journalièrement, le prog que je construit va me permettre de centraliser sur 1 logiciel toutes les données qui me parviennent de tous le monde, ca c'est un exemple car je traite beaucoup de fichiers excel pour diverses taches, petite question comment on fait pour calculer une moyenne de nombre d'un champs de DBGrid

Maintenant je vais devoir retravailler de A à Z mon prog pour qu'il soit compatible avec toi mais ce sera un plaisir, quand je dis que ce que tu as fait est vraiment ce que j'attendais je suis en dessous de la réalité

Si tu veux je te soumettrais mon prog fini pour dire ce que tu pense et éventuellement apporter des améliorations.
Si c'est convenable (en ayant retiré les info confidentielles, pour le moment il n'y a que ca) tu me diras si je peux poster le prog, ca pourra peut être aider d'autres.

Je suis preneur de toutes tes idées,

En mon nom et au nom des autres encore merci car il suffit de surfer sur le forum ou tu dépannes pas mal.

Bonne Journée

DGPat
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
6 janv. 2005 à 10:03
Hello DgPat,

Il est vrai qu'un fichier d'aide ne serait pas du luxe. Alors je vais en préparer un. Cependant il ne sera pas dispo de suite car c'est plus long que de taper le code (lol). Donc je le prépare et si ca te derange pas je te contacterai pour que tu le lises et que tu me dises ce que tu en penses. Comme tu t'es bien pris la tete sur le soft je pense que tu es le plus apte à juger une aide dessus.

Sinon pas de souci quand j'ai une nouvelle source sur les bases de données je t'en ferrai part. D'ailleurs j'en prepare une en ce moment. Cette nouvelle source s'orientra autour des filtres des bases de données. Elle permettra de generer un filtre automatiquement. Si ca t'interesse ??? Ca fait 2 semaines que je promet de la poster mais malheureusement j'ai pas beaucoup de temps en ce moment. Si tu as des questions ou des choses que tu souhaites realiser et que tu as besoin d'aide n'hesite pas.

Enfin en ce qui concerne la réutilisation du code il est là pour ca alors fais toi plaisir. Ca me fait plaisir de savoir que ce code aura pu depanner au moins une personne.

Si tu as d'autres idées d'améliorations pour ce soft je suis preneur.

Bonne journée,
JMP77.
DGPat Messages postés 53 Date d'inscription samedi 27 mars 2004 Statut Membre Dernière intervention 1 août 2006
5 janv. 2005 à 22:04
Bonsoir JMP77,

Ben.... voilà,il ny a plus qu'a l'utiliser,je l'ai essayé je lui ai incorporé 27 champs et 7836 enregistrements de tous les types,rien n'a bronché,il a créé la base paradox et a l'inverse un fichier Excel.

il y a quelques petites astuces dans la préparation de fichier Excel : A savoir ne pas travailler sur la feuille originale mais faire un copier et coller mais seulement les valeurs,pas de formule ca évite les problèmes

Bien que facile d'utilisation,peut être qu'un fichier d'aide sur ton prog aidera ceux qui aurait des difficultés?

Si des utilisateurs ont des difficultés a configurer Excel pour ton prog, tout le monde peut m'envoyer un message, vu que j'ai ramé et essayé beaucoup de soluce il n'a pas de raison de laisser ramer les autres.

Comme tu dois t'en douter je suis sur un prog très volumineux qui fait gestion de stock, facturation et gestion clients et fournisseurs,echéancier etc....
Avec ton autorisation je vais incorporer ton prog, bien entendu je laisse ta boite"a propos" l'honneur te reviens pour le super boulot.

Quand tu crée (surtout en base de données) tu peux m'envoyer un message? je suis preneur.

A plus tard sur le site

DGPat
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
5 janv. 2005 à 11:15
Hello,

C'est ok DgPat je viens de corriger le programme. C'était plutot rapide vu que c'est toi qui a trouver qu'elle était le probleme.
Maintenant quand le programme doit ecrire dans un champ integer, flottant ou datetime il verifie que les données à inserées ne sont pas vide.

N'hesite pas si tu vois d'autres erreurs ou des améliorations éventuelles ce sera avec grand plaisir.

Bonne journée, et bonne conversion,
JMP.
DGPat Messages postés 53 Date d'inscription samedi 27 mars 2004 Statut Membre Dernière intervention 1 août 2006
5 janv. 2005 à 07:42
Hello JMP77,

Je crois avoir trouvé pourquoi, le prog n'accepte pas les autres format chez moi, cela vient que dans le fichier Excel que l'on veut mettre en paradox il ne peut pas avoir de cellules vides autres que celles en String, j'ai essayé en remplissant toutes les cellules qui sont en Date et là aucun prob ca passe.

Super le code, surtout qu'il est très commenté ca aide mais comme je suis débutant (un an que j'apprend tout seul) j'ai pas tout compris mais je compte évoluer.

Bon je vais au boulot

Bonne journée
DGPat
DGPat Messages postés 53 Date d'inscription samedi 27 mars 2004 Statut Membre Dernière intervention 1 août 2006
4 janv. 2005 à 20:42
Bonsoir JMP77 ,

Je viens de rentrer et j'ai essayé tes modif, le boulot est super maintenant j'ai mes 20 tables qui s'affichent, et j'ai mis 3750 enregistrements, le seul problème restant est qu'il refuse toujours autre chose que les format "String", date, integer ou autres ne passent pas, il enregistre biens tout les champs et enregistrement mais à la contruction de la table paradox j'ai le message suivant : ETAP 4 remplissage impossible de convertir le variant de type [OLEStr] en type [double].

Enfin, c'est LE PROG génial attendu pour ceux qui travaillent en manipulant des gros fichiers Excel venant de diverses sources et qui veulent se créer une table paradox

Pour ceux nombreux qui vont se servir de ce prog il faut signaler que c'est toujours la 1° feuille qui est prise en compte pour créer la table.

Merci pour le service après vente, plus vite que ça tu meurs, déposé a midi a 16 h rendu dépanné , bravo

DGPat

PS j'avais validé ta réponse tout de suite je l'ai refait aujourd'hui.

Etant incapable de créer ce type de prog j'attend avec impatience tes rectif.
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
20 déc. 2004 à 13:00
Pas de souci mauricio moi aussi j'ai pas mal de boulot en ce moment je voulais d'ailleurs poster ma nouvelle source aujourd'hui et finalement ca ne sera pas avant la fin de la semaine si tout va bien. Et tinkiet je ferrais en sorte que tous les honneurs te reviennent pour ta fonction export html.
Sinon concernant le link de delphiprog je suis impatient de voir le résultat.

Allez bon courage,
JMP77.
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
20 déc. 2004 à 12:13
Salut jmp77 !
DelphiProg viens de me donner un link mais je suis pas sur Delphi pour l' instant: je posterai quelques chose là dessus quand j' aurai vu la soluce qu il me donne : )

A propos de ma fonction: désolé mais tu vas devoir attendre cet apres midi car j' ai pas le temps malheureusement. Tu peux l' utiliser dans tes programmes sans probleme, tout l' honneur est pour moi : )
A+ (G trop de boulot pour l' instant)
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
17 déc. 2004 à 18:35
Tu as raison, je ne l' ai pas postée celle-là.
C' est normal puisque je ne donne pas toutes mes fonctions.
Aller, c' est Noel après tout non?
Si, j' ai le temps, je poste ça aujourd' hui, sinon lundi.
PS: continuons de chercher pour le pb des floats: faut embêter tout le monde, y en bien un qui va trouver. J' ai bien mis un msg sur le forum ça fait un bon moment : ( mais toujours pas de soluce (DelphiProg a répondu mais à côté de la question).
A+
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
17 déc. 2004 à 17:09
Je viens de fouiller un peu et je n'ai pas trouver ton code pour passer de db en html si tu as 2 min mauricio et que tu pouvais me filer le lien ca serait cool.

Merci.

Bonne prog,
JMP77.
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
17 déc. 2004 à 16:59
Merci Mauricio.

Ouais effectivement je n'avais pas penser au Feuil1 je vais corriger ca pour lundi.

Sinon pour la taille des float y a pas moyen j'ai cru que j'allais devenir fou j'ai retourner le probleme dans tous les sens mais pas plus de resultats. Je suis à court d'idée.

Ouais elle m'interesse ta fonction (db to html) je vais aller voir si je la trouve.

Bon week end et merci de ton commentaire.

Bonne prog,
JMP77.
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
17 déc. 2004 à 16:46
Il n' y a pas que moi qui est en forme!!!
Normalement, j' hyberne en Octobre mais cet hiver il fait bien plus chaud : )
Et dire que je cherchais comment créer des tables dynamiquement il n' y a même pas 3 mois (DBase).
Donc, je connais le procédé mais cette source reste une bonne initiative de ta part. Tu as trouvé comment récup' la taille des floats ???

Un petit problème quand même:
OleWorkBook.Worksheets.Item['Feuil1'].Activate;
Vu que je suis sur Excel en Portugais, bem 'Feuil1' il connais pas !!! Mais bon, je sais, c normal, et puis ça fait 2 ans que je ais des applications OLE (comme Excel quoi) pour les 'piloter' avec d' autres programmes.

Au fait, j' ai une fonction qui exporte une DBGRID vers Html, je l' ai déjà postée il me semble ...
Rejoignez-nous