Einzelnen Beitrag anzeigen

Delphi.Narium

Registriert seit: 27. Nov 2017
2.431 Beiträge
 
Delphi 7 Professional
 
#5

AW: Delphi-Only Read(Writer) für Excel-Dokumente (xls/xlsx)

  Alt 30. Apr 2018, 17:35
Schau mal bitte hier den vierten Betrag an: https://stackoverflow.com/questions/...t-having-excel

Das könnte eventuell eine Lösung sein, die man sich relativ schnell selbst bauen kann.

Ist letztlich "nur" 'ne HTML-Datei mit der Endung xls.

Excel kann damit umgehen und für einen reinen Datenaustausch könnte das durchaus reichen.

Eine Minimalversion in Pascalsacript für meinen Editor sieht so aus:
Delphi-Quellcode:
program Test;

procedure CreateXLS(ADataSet: TDataSet; AFileName : String; ASheetName : String);
var
        i : Integer;
        sl : TStringList;
begin
  sl := TStringList.Create;
  sl.Add('<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40">');
  sl.Add('<head>');
  sl.Add('<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">');
  sl.Add('<!--[if gte mso 9]>');
  sl.Add('<xml>');
  sl.Add(' <x:ExcelWorkbook>');
  sl.Add(' <x:ExcelWorksheets>');
  sl.Add(' <x:ExcelWorksheet>');
  sl.Add(Format(' <x:Name>%s</x:Name>',[ASheetName]));
  sl.Add(' <x:WorksheetOptions>');
  sl.Add(' <x:Selected/>');
  sl.Add(' <x:Panes>');
  sl.Add(' <x:Pane>');
  sl.Add(' <x:Number>1</x:Number>');
  sl.Add(' <x:ActiveRow>1</x:ActiveRow>');
  sl.Add(' </x:Pane>');
  sl.Add(' </x:Panes>');
  sl.Add(' <x:ProtectContents>False</x:ProtectContents>');
  sl.Add(' <x:ProtectObjects>False</x:ProtectObjects>');
  sl.Add(' <x:ProtectScenarios>False</x:ProtectScenarios>');
  sl.Add(' </x:WorksheetOptions>');
  sl.Add(' </x:ExcelWorksheet>');
  sl.Add(' </x:ExcelWorksheets>');
  sl.Add(' </x:ExcelWorkbook>');
  sl.Add('</xml>');
  sl.Add('<![endif]-->');
  sl.Add('</head>');
  sl.Add('<body>');
  sl.Add('<table x:str>');
  ADataSet.First;
  while not ADataSet.EoF do begin
    sl.Add('<tr>');
    for i := 0 to ADataSet.Fields.Count - 1 do sl.Add(Format('<td x:num>%s</td>',[ADataSet.Fields.Fields[i].AsString]));
    sl.Add('</tr>');
    ADataSet.Next;
  end;
  sl.Add('</table>');
  sl.Add('</body>');
  sl.Add('</html>');
  sl.SaveToFile(AFileName);
  sl.Free;
end;

begin
  CreateXLS(DataSet,'c:\temp\Dateiname.xls','Sheetname');
end.
Excel kann die daraus resultierende Datei problemlos öffnen.
  Mit Zitat antworten Zitat