Problème exportation date en CSV

Résolu
vico8000 Messages postés 287 Date d'inscription lundi 18 janvier 2016 Statut Membre Dernière intervention 14 février 2018 - Modifié par vico8000 le 20/01/2016 à 09:40
vico8000 Messages postés 287 Date d'inscription lundi 18 janvier 2016 Statut Membre 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.

4 réponses

papyvore Messages postés 223 Date d'inscription samedi 15 novembre 2003 Statut Membre Dernière intervention 16 décembre 2021 15
20 janv. 2016 à 19:06
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;

1
vico8000 Messages postés 287 Date d'inscription lundi 18 janvier 2016 Statut Membre Dernière intervention 14 février 2018 2
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.
0
papyvore Messages postés 223 Date d'inscription samedi 15 novembre 2003 Statut Membre Dernière intervention 16 décembre 2021 15
21 janv. 2016 à 09:29
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
1
vico8000 Messages postés 287 Date d'inscription lundi 18 janvier 2016 Statut Membre Dernière intervention 14 février 2018 2
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.
0
papyvore Messages postés 223 Date d'inscription samedi 15 novembre 2003 Statut Membre Dernière intervention 16 décembre 2021 15
Modifié par papyvore le 20/01/2016 à 12:17
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
0
vico8000 Messages postés 287 Date d'inscription lundi 18 janvier 2016 Statut Membre Dernière intervention 14 février 2018 2
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é.
0
papyvore Messages postés 223 Date d'inscription samedi 15 novembre 2003 Statut Membre Dernière intervention 16 décembre 2021 15
Modifié par papyvore le 20/01/2016 à 16:28
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
0
vico8000 Messages postés 287 Date d'inscription lundi 18 janvier 2016 Statut Membre Dernière intervention 14 février 2018 2
20 janv. 2016 à 16:33
La seule chose que j'en retourne c'est Violation d'accés
et Erreur OLE 800A03EC.
0
Rejoignez-nous