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

vico8000 291 Messages postés lundi 18 janvier 2016Date d'inscription 14 février 2018 Dernière intervention - 20 janv. 2016 à 09:37 - Dernière réponse : vico8000 291 Messages postés lundi 18 janvier 2016Date d'inscription 14 février 2018 Dernière intervention
- 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 

8 réponses

Répondre au sujet
papyvore 155 Messages postés samedi 15 novembre 2003Date d'inscription 5 avril 2018 Dernière intervention - 20 janv. 2016 à 19:06
+1
Utile
1
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;

Cette réponse vous a-t-elle aidé ?  
vico8000 291 Messages postés lundi 18 janvier 2016Date d'inscription 14 février 2018 Dernière intervention - 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
papyvore 155 Messages postés samedi 15 novembre 2003Date d'inscription 5 avril 2018 Dernière intervention - 21 janv. 2016 à 09:29
+1
Utile
1
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
Cette réponse vous a-t-elle aidé ?  
vico8000 291 Messages postés lundi 18 janvier 2016Date d'inscription 14 février 2018 Dernière intervention - 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
papyvore 155 Messages postés samedi 15 novembre 2003Date d'inscription 5 avril 2018 Dernière intervention - Modifié par papyvore le 20/01/2016 à 12:17
0
Utile
1
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
vico8000 291 Messages postés lundi 18 janvier 2016Date d'inscription 14 février 2018 Dernière intervention - 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
papyvore 155 Messages postés samedi 15 novembre 2003Date d'inscription 5 avril 2018 Dernière intervention - Modifié par papyvore le 20/01/2016 à 16:28
0
Utile
1
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
vico8000 291 Messages postés lundi 18 janvier 2016Date d'inscription 14 février 2018 Dernière intervention - 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.