vico8000
Messages postés287Date d'inscriptionlundi 18 janvier 2016StatutMembreDernière intervention14 février 2018
-
Modifié par vico8000 le 20/01/2016 à 09:40
vico8000
Messages postés287Date d'inscriptionlundi 18 janvier 2016StatutMembreDernière intervention14 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.
papyvore
Messages postés223Date d'inscriptionsamedi 15 novembre 2003StatutMembreDernière intervention16 décembre 202115 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;
vico8000
Messages postés287Date d'inscriptionlundi 18 janvier 2016StatutMembreDernière intervention14 février 20182 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.
{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
Messages postés287Date d'inscriptionlundi 18 janvier 2016StatutMembreDernière intervention14 février 20182 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 ?
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
Messages postés287Date d'inscriptionlundi 18 janvier 2016StatutMembreDernière intervention14 février 20182 20 janv. 2016 à 16:33
La seule chose que j'en retourne c'est Violation d'accés
et Erreur OLE 800A03EC.
21 janv. 2016 à 09:15
C'est bon, j'arrive a récupérer la date (Enfin pas exactement).
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.