Problème exportation date en CSV [Résolu]

Messages postés
291
Date d'inscription
lundi 18 janvier 2016
Dernière intervention
14 février 2018
- 20 janv. 2016 à 09:37 - Dernière réponse :
Messages postés
291
Date d'inscription
lundi 18 janvier 2016
Dernière intervention
14 février 2018
- 21 janv. 2016 à 09:37
Bonjour,

J'ai un petit soucis.
J'exporte au format CSV le contenu d'un StringGrid. Jusques la, tous va bien. J'arrive à exporter la totalité de mes données. Mais je rencontre un problème quand je vais lire les données. En effet, en se qui concerne les données numériques, tous se passe correctement. A l'inverse, concernant les dates, c'est pas une réelle réussite. J'explique mon problème : j'exporte par exemple "15/01/2016" et lorsque je vais lire dans Excel, je me retrouve avec une donnée numérique du type "42384". Voici mon code.

var
xls, wb: OLEVariant;
arrData, Range: Variant;
RowCount, ColCount, i, j: Integer;
begin
{create variant array where we'll copy our data}
RowCount := StringGrid1.RowCount;
ColCount := StringGrid1.ColCount;
arrData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);

{fill array}
for i := 1 to RowCount do
for j := 1 to ColCount do
arrData[i, j] := StringGrid1.Cells[j-1, i-1];

// J’effectue un test pour voir si c'est mon StringGrid qui renvoie la valeur numérique mais c'est bien lors du traitement d'export que ça arrive !!
label1.caption:=StringGrid1.Cells[2, 1];

{initialize an instance of Excel}
xls := CreateOLEObject('Excel.Application');

{create workbook}
wb := xls.Workbooks.Add;

{retrieve a range where data must be placed}
Range := wb.WorkSheets[1].Range[wb.WorkSheets[1].Cells[1, 1],
wb.WorkSheets[1].Cells[RowCount, ColCount]];

{copy data from allocated variant array}
Range.Value := arrData;

{show Excel with our data}
xls.Visible := True;
end;


J'utilise Delphi7 / Excel 2010
Merci par avance pour l'aide de vous pourrez m'accorder.
Afficher la suite 

Votre réponse

8 réponses

Meilleure réponse
Messages postés
159
Date d'inscription
samedi 15 novembre 2003
Dernière intervention
1 août 2018
- 20 janv. 2016 à 19:06
1
Merci
je viens de tester ça marche (excel 2007) mais ça devrait aller aussi avec excel 2010

procedure TForm1.Button3Click(Sender: TObject);
var
xls : OLEVariant;
wb: OLEVariant;
arrData, Range: Variant;
begin
{initialize an instance of Excel}
xls := CreateOLEObject('Excel.Application');
xls.Visible := True;
{create workbook}
wb := xls.Workbooks.Add;

{retrieve a range where data must be placed}
arrData := '01/02/2016' ;
{copy data from allocated variant array}
xls.Range['F2'].Formula:='aa';
xls.Range['F1'].NumberFormat:= 'jj/mm/aaaa';
xls.Range['F1'].Formula:= arrData;
end;

Merci papyvore 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Messages postés
291
Date d'inscription
lundi 18 janvier 2016
Dernière intervention
14 février 2018
- 21 janv. 2016 à 09:15
Bonjour,

C'est bon, j'arrive a récupérer la date (Enfin pas exactement).

procedure TFormHistorique.BtExportationClick(Sender: TObject);
var
xls, wb: OLEVariant;
arrData, Range: Variant;
RowCount, ColCount, i, k: Integer;
CaseExcel : String;
begin
{create variant array where we'll copy our data}
RowCount := StringGrid1.RowCount;
ColCount := StringGrid1.ColCount;
arrData := VarArrayCreate([1, RowCount, 1, ColCount], varVariant);

{fill array}
for i := 1 to RowCount do
for k := 1 to ColCount do
arrData[i, k] := StringGrid1.Cells[k-1, i-1];

{initialize an instance of Excel}
xls := CreateOLEObject('Excel.Application');

{create workbook}
wb := xls.Workbooks.Add;

{retrieve a range where data must be placed}
Range := wb.WorkSheets[1].Range[wb.WorkSheets[1].Cells[1, 1],
wb.WorkSheets[1].Cells[RowCount, ColCount]];
//Range.NumberFormat:= DateFormat;

for I := 2 to RowCount + 1 do
Begin
CaseExcel := 'D' + inttostr(I);
xls.Range[CaseExcel].NumberFormat := 'aaaa-mm-jj';
CaseExcel := 'E' + inttostr(I);
xls.Range[CaseExcel].NumberFormat := 'hh:mm:ss';
CaseExcel := 'F' + inttostr(I);
xls.Range[CaseExcel].NumberFormat := 'hh:mm:ss';
end;

{copy data from allocated variant array}
Range.Value := arrData;

{show Excel with our data}
xls.Visible := True;

end;


Voici mon code, adapté suite à ton dernier message d'aide.
Dans le Fichier Excel quand je clique sur la cellule de la date, j'ai bien la date que j'exporte. (21/01/2016)
Mais en regardant mon tableur, en visuel, sans cliquer sur la case, je lis un truc du genre "########". pour que l'affichage se fasse correctement, il faut que je renseigne une cellule quelconque à l'aide d'une date quelconque et tous les affichages de cellules comprennant une date se mettent à jour. Aurais-tu une explication?
Pour le Format Time, à l'inverse, aucun soucis, la fonction "fonctionne" :p.

Merci pour l'aide apportée qui m'a permis d'avancer pas mal déja. Cordialement.
Commenter la réponse de papyvore
Meilleure réponse
Messages postés
159
Date d'inscription
samedi 15 novembre 2003
Dernière intervention
1 août 2018
- 21 janv. 2016 à 09:29
1
Merci
salut
en général quand excel affiche "########"., c'est que la colonne n'est pas assez large.Ou tu l'élargie à la main ou tu programme la largeur de la colonne .
va voir ici http://www.marclebrun.be/wiki/doku.php?id=delphi:pilotageexcelole

Merci papyvore 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Messages postés
291
Date d'inscription
lundi 18 janvier 2016
Dernière intervention
14 février 2018
- 21 janv. 2016 à 09:37
C'est effectivement ça.
Je te remercie pour l'aide que tu m'as apporté et le temps que tu m'as accordé.
Bonne continuation, Cordialement.
Commenter la réponse de papyvore
Messages postés
159
Date d'inscription
samedi 15 novembre 2003
Dernière intervention
1 août 2018
- Modifié par papyvore le 20/01/2016 à 12:17
0
Merci
salut

{retrieve a range where data must be placed}
Range := wb.WorkSheets[1].Range[wb.WorkSheets[1].Cells[1, 1],
wb.WorkSheets[1].Cells[RowCount, ColCount]];
Range.NumberFormat:= DateFormat

quelque chose comme ça avec numberformat
j'ai pas testé
papyvore
Messages postés
291
Date d'inscription
lundi 18 janvier 2016
Dernière intervention
14 février 2018
- 20 janv. 2016 à 13:25
Yop,

DateFormat correspondrait à une bibliothèque spéciale à inclure ?
Pour une heure ça serait TimeFormat ?
J'exporte un truc du genre:
5 | 5 | 20/01/2016 | 13:23:52 | 00:25:16 (Par exemple)
Donc si j'utilise ta méthode, ça devrait mettre les 5 champs en Date non ?

Merci pour le début de réponse apporté.
Commenter la réponse de papyvore
Messages postés
159
Date d'inscription
samedi 15 novembre 2003
Dernière intervention
1 août 2018
- Modifié par papyvore le 20/01/2016 à 16:28
0
Merci
voilà un bout de code qui marche dans un de mes prog. avec D7 pour excel 2007

OleApplicationEcriture := CreateOleObject('Excel.Application');// création du lien OLE
OleApplicationEcriture.Range['F'+IntTostr(i+1)].NumberFormat:= 'jj/mm/aa';
OleApplicationEcriture.Range['F'+IntTostr(i+1)].Formula:= Dat;


papyvore
Messages postés
291
Date d'inscription
lundi 18 janvier 2016
Dernière intervention
14 février 2018
- 20 janv. 2016 à 16:33
La seule chose que j'en retourne c'est Violation d'accés
et Erreur OLE 800A03EC.
Commenter la réponse de papyvore

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.