Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

EXPORTER UN DATASET VERS EXCEL VIA XML


Information sur la source

Description

You can create excel worksheet using XML is a easier ways to work with excel files but works only with Office 2003 up
 

Source

  • procedure TfrmCBSSReport.Dataset2XLSXML(DataSet:TDataSet; sFile:String);
  • Const
  • sHeadXML = '<?xml version="1.0" encoding="UTF-8"?>';
  • sWorkBookBegin = '<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"'+
  • ' xmlns:x="urn:schemas-microsoft-com:office:excel"'+
  • ' xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"'+
  • ' xmlns:html="http://www.w3.org/TR/REC-html40">';
  • sEndWorkBook = '</Workbook>';
  • sEndWorkSheet = ' </Worksheet>';
  • sTable = ' <Table>';
  • sEndTable = ' </Table>';
  • sRow = ' <Row>';
  • sEndRow = ' </Row>';
  • sCell = ' <Cell>';
  • sEndCell = '</Cell>';
  • Var
  • sXlsXml:String;
  • iColumn:Integer;
  • reXLSXML:TStringList;
  • ftXLSXML:TextFile;
  • begin
  • //log file
  • AssignFile(ftXLSXML,sFile);
  • {$I-}
  • Reset(ftXLSXML);
  • {$I+}
  • if IOResult <> 0 then
  • begin
  • Rewrite(ftXLSXML);
  • end;
  • Append(ftXLSXML);
  • Writeln(ftXLSXML,sHeadXML);
  • Flush(ftXLSXML);
  • Append(ftXLSXML);
  • Writeln(ftXLSXML,sWorkBookBegin);
  • Flush(ftXLSXML);
  • Append(ftXLSXML);
  • Writeln(ftXLSXML,' <Worksheet ss:Name="Table1">');
  • Flush(ftXLSXML);
  • //Add columns
  • For iColumn:=0 to DataSet.FieldCount -1 do
  • begin
  • sXlsXml := sXlsXml + ' <Column ss:Index="'+IntToStr(iColumn+1)+'" ss:AutoFitWidth="0" ss:Width="110"/>';
  • end;
  • Append(ftXLSXML);
  • Writeln(ftXLSXML,sXlsXml+sRow);
  • Flush(ftXLSXML);
  • //Add Cells definitions (Titles)
  • For iColumn:=0 to DataSet.FieldCount -1 do
  • begin
  • Append(ftXLSXML);
  • Writeln(ftXLSXML,sCell+'<Data ss:Type="String">'+DataSet.Fields[iColumn].FieldName+'</Data>'+sEndCell);
  • Flush(ftXLSXML);
  • end;
  • Append(ftXLSXML);
  • Writeln(ftXLSXML,sEndRow);
  • Flush(ftXLSXML);
  • While Not DataSet.Eof do
  • begin
  • Append(ftXLSXML);
  • Writeln(ftXLSXML,sRow);
  • Flush(ftXLSXML);
  • //Add each value by field
  • For iColumn:=0 to DataSet.FieldCount -1 do
  • begin
  • Append(ftXLSXML);
  • Writeln(ftXLSXML,sCell+'<Data ss:Type="String">'+DataSet.FieldByName(DataSet.Fields[iColumn].FieldName).AsString +'</Data>'+sEndCell);
  • Flush(ftXLSXML);
  • end;
  • Append(ftXLSXML);
  • Writeln(ftXLSXML,sEndRow);
  • Flush(ftXLSXML);
  • DataSet.Next;
  • end;
  • Append(ftXLSXML);
  • Writeln(ftXLSXML,sEndTable);
  • Flush(ftXLSXML);
  • Append(ftXLSXML);
  • Writeln(ftXLSXML,sEndWorkSheet);
  • Flush(ftXLSXML);
  • Append(ftXLSXML);
  • Writeln(ftXLSXML,sEndWorkbook);
  • Flush(ftXLSXML);
  • CloseFile(ftXLSXML);
  • { another way to do
  • reXLSXML := TStringList.Create;
  • reXLSXML.PlainText := True;
  • reXLSXML.Add(sHeadXML);
  • reXLSXML.Add(sWorkBookBegin);
  • reXLSXML.Add(' <Worksheet ss:Name="Table1">');
  • reXLSXML.Add(sTable);
  • //Add columns
  • For iColumn:=0 to DataSet.FieldCount -1 do
  • begin
  • sXlsXml := sXlsXml + ' <Column ss:Index="'+IntToStr(iColumn+1)+'" ss:AutoFitWidth="0" ss:Width="110"/>';
  • end;
  • reXLSXML.Add(sXlsXml+sRow);
  • //Add Cells definitions (Titles)
  • For iColumn:=0 to DataSet.FieldCount -1 do
  • begin
  • reXLSXML.Add(sCell+'<Data ss:Type="String">'+DataSet.Fields[iColumn].FieldName+'</Data>'+sEndCell);
  • end;
  • reXLSXML.Add(sEndRow);
  • While Not DataSet.Eof do
  • begin
  • reXLSXML.Add(sRow);
  • //Add each value by field
  • For iColumn:=0 to DataSet.FieldCount -1 do
  • begin //'+getDataType(DataSet.Fields[iColumn].DataType)+'
  • reXLSXML.Add(sCell+'<Data ss:Type="String">'+DataSet.FieldByName(DataSet.Fields[iColumn].FieldName).AsString +'</Data>'+sEndCell);
  • end;
  • reXLSXML.Add(sEndRow);
  • DataSet.Next;
  • end;
  • reXLSXML.Add(sEndTable);
  • reXLSXML.Add(sEndWorkSheet);
  • reXLSXML.Add(sEndWorkbook);
  • reXLSXML.SaveToFile(sFile);
  • reXLSXML.Free;
  • }
  • end;
  • procedure TfrmCBSSReport.SpeedButton1Click(Sender: TObject);
  • begin
  • Dataset2XLSXML(query1,'c:\test.xls');
  • end;
procedure TfrmCBSSReport.Dataset2XLSXML(DataSet:TDataSet; sFile:String);
Const
   sHeadXML       = '<?xml version="1.0" encoding="UTF-8"?>';
   sWorkBookBegin = '<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"'+
                    ' xmlns:x="urn:schemas-microsoft-com:office:excel"'+
                    ' xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"'+
                    ' xmlns:html="http://www.w3.org/TR/REC-html40">';
   sEndWorkBook   = '</Workbook>';
   sEndWorkSheet  = ' </Worksheet>';
   sTable         = '  <Table>';
   sEndTable      = '  </Table>';
   sRow           = '   <Row>';
   sEndRow        = '   </Row>';
   sCell          = '    <Cell>';
   sEndCell       = '</Cell>';

Var
  sXlsXml:String;
  iColumn:Integer;
  reXLSXML:TStringList;
  ftXLSXML:TextFile;


begin
 //log file
 AssignFile(ftXLSXML,sFile);
 {$I-}
 Reset(ftXLSXML);
 {$I+}
 if IOResult <> 0 then
 begin
   Rewrite(ftXLSXML);
 end;

 Append(ftXLSXML);
 Writeln(ftXLSXML,sHeadXML);
 Flush(ftXLSXML);

 Append(ftXLSXML);
 Writeln(ftXLSXML,sWorkBookBegin);
 Flush(ftXLSXML);

 Append(ftXLSXML);
 Writeln(ftXLSXML,' <Worksheet ss:Name="Table1">');
 Flush(ftXLSXML);

 //Add columns
 For iColumn:=0 to DataSet.FieldCount -1 do
 begin
   sXlsXml := sXlsXml + '   <Column ss:Index="'+IntToStr(iColumn+1)+'" ss:AutoFitWidth="0" ss:Width="110"/>';
 end;
 Append(ftXLSXML);
 Writeln(ftXLSXML,sXlsXml+sRow);
 Flush(ftXLSXML);


 //Add Cells definitions (Titles)
 For iColumn:=0 to DataSet.FieldCount -1 do
 begin
   Append(ftXLSXML);
   Writeln(ftXLSXML,sCell+'<Data ss:Type="String">'+DataSet.Fields[iColumn].FieldName+'</Data>'+sEndCell);
   Flush(ftXLSXML);
 end;
 Append(ftXLSXML);
 Writeln(ftXLSXML,sEndRow);
 Flush(ftXLSXML);

 While Not DataSet.Eof do
 begin
   Append(ftXLSXML);
   Writeln(ftXLSXML,sRow);
   Flush(ftXLSXML);

   //Add each value by field
   For iColumn:=0 to DataSet.FieldCount -1 do
   begin               
     Append(ftXLSXML);
     Writeln(ftXLSXML,sCell+'<Data ss:Type="String">'+DataSet.FieldByName(DataSet.Fields[iColumn].FieldName).AsString +'</Data>'+sEndCell);
     Flush(ftXLSXML);
   end;
   Append(ftXLSXML);
   Writeln(ftXLSXML,sEndRow);
   Flush(ftXLSXML);

   DataSet.Next;
 end;

 Append(ftXLSXML);
 Writeln(ftXLSXML,sEndTable);
 Flush(ftXLSXML);

 Append(ftXLSXML);
 Writeln(ftXLSXML,sEndWorkSheet);
 Flush(ftXLSXML);

 Append(ftXLSXML);
 Writeln(ftXLSXML,sEndWorkbook);
 Flush(ftXLSXML);

 CloseFile(ftXLSXML);


{ another way to do
  reXLSXML := TStringList.Create;
  reXLSXML.PlainText := True;

  reXLSXML.Add(sHeadXML);
  reXLSXML.Add(sWorkBookBegin);
  reXLSXML.Add(' <Worksheet ss:Name="Table1">');
  reXLSXML.Add(sTable);

  //Add columns
  For iColumn:=0 to DataSet.FieldCount -1 do
  begin
    sXlsXml := sXlsXml + '   <Column ss:Index="'+IntToStr(iColumn+1)+'" ss:AutoFitWidth="0" ss:Width="110"/>';
  end;
  reXLSXML.Add(sXlsXml+sRow);

  //Add Cells definitions (Titles)
  For iColumn:=0 to DataSet.FieldCount -1 do
  begin
    reXLSXML.Add(sCell+'<Data ss:Type="String">'+DataSet.Fields[iColumn].FieldName+'</Data>'+sEndCell);
  end;
  reXLSXML.Add(sEndRow);

  While Not DataSet.Eof do
  begin
    reXLSXML.Add(sRow);
    //Add each value by field
    For iColumn:=0 to DataSet.FieldCount -1 do
    begin               //'+getDataType(DataSet.Fields[iColumn].DataType)+'
      reXLSXML.Add(sCell+'<Data ss:Type="String">'+DataSet.FieldByName(DataSet.Fields[iColumn].FieldName).AsString +'</Data>'+sEndCell);
    end;
    reXLSXML.Add(sEndRow);
    DataSet.Next;
  end;

  reXLSXML.Add(sEndTable);
  reXLSXML.Add(sEndWorkSheet);
  reXLSXML.Add(sEndWorkbook);

  reXLSXML.SaveToFile(sFile);
  reXLSXML.Free;
  }
end;

procedure TfrmCBSSReport.SpeedButton1Click(Sender: TObject);
begin
   Dataset2XLSXML(query1,'c:\test.xls');
end;

Commentaires et avis

signaler à un administrateur
Commentaire de vaughan le 26/10/2005 09:53:39

Hi guy,

This is the "French" Web Site ... and it's correct to speak "French" .. DELPHI[FR] = DELPHI en Français.

C'est un site Francophone, et le but est d'alimenter les petits developpeur Francophone que l'on est.

Sinon ta source en interresante et depuis la mise en place de office 2003, l'utilisation du XML ouvre pas mal de voie.

signaler à un administrateur
Commentaire de SamDotNet le 18/01/2006 00:30:03

tant pis pour toi!
BEGIN c'est anglais et END aussi!
Désolé mais pas de reproche!!!

signaler à un administrateur
Commentaire de vaughan le 18/01/2006 09:35:07

oh !!!
En plus de parler le français, je parle courament le Pascal (entre autre)...
Et BEGIN c'est pascal (entre autre) et END aussi (entre autre)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Export CSV [ par Wriggles ] Bonjour, mon problème est le suivant. J'ai un ensemble à partir duquel je génère un fichier au format csv. Je lance ensuite un shellexecute pour l'ouv import/export delphi excel [ par chec ] [BDE-Excel] Export [ par Isabelle31 ] Bonjour tout le monde!!Voila mon probl&#232;me. Je veux faire des export de requ&#234;tes (les r&#233;sultat de mes requ&#234;tes faites via BDE) pour transformation XML -> dataset [ par metos57 ] Bonjour, j'utilise un le composant tXMLTranform pour recup&#233;rer dans un dataset des donn&#233;es venats d'un flux XML. Le source fonction parfait Export csv vers Excel EOLEERROR [ par couf ] Bonjour à Tous,J'ai besoin de lancer automatiquement l'export d'un ficier csv pour le convertir en EXCEL.J'ai trouvé un sur le forum le topic suivant: Export DBGrid vers Excel [ par grandyaka54 ] Bonjour,J'ai créé un bouton me permettant d'exporter le contenu de mon DBGrid vers Excel via un fichier.csv.Le soucis se passe au moment de lire de fi DATASET -> XML [ par stailer ] Salut,Dans PHPMyadmin pour ceux qui connaissent, on peut exporter les données au format XML. Ensuite dans Delphi on peut se lier à ce fichier XML et m envoyer un fichier sur un serveur http [ par veudAbajour ] Bonjour, je suis novice en développement DELPHI, actuellement je développe ma première application,et je n'ai pas forcément fais au plus simple. Voila Comment envoyer cette commande Excel avec Delphi [ par breiz35 ] Worksheets("Sheet1").Copy After:=Worksheets("Sheet3")Merci pour vos réponses.carpe diem clientdataset et créaion dynamique [ par shakeoff1 ] est ce que quelqu'un pourrais jeter un oeil sur ce code et meire si quelque chose cloche?pour info il s'agit d'une partie de code de génération dynami


Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,48 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.