AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Excel Sheets

Ein Thema von Sidi61 · begonnen am 29. Sep 2016 · letzter Beitrag vom 6. Okt 2016
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: Excel Sheets

  Alt 2. Okt 2016, 20:20
Hallo Sidi61,

ich habe einen Fehler in der Zeile:

if ((NOT VarIsEmpty(oExcel))and VarIsEmpty(olevWB)) then
sie muss geändert werden. Von olevWB nach oWB1.

if ((NOT VarIsEmpty(oExcel))and VarIsEmpty(oWB1)) then
Ich habe das Beispiel unter Delphi Berlin mit Office 2016 und Delphi XE5 mit Office 2007 getestet. Einfach ein Form anlegen einen Button drauf und im onClick-Event den Code kopieren.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.SyncObjs,System.Win.ComObj;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
   oExcel: OLEVariant;
   oWB1: OLEVariant;
   oWS1: OLEVariant;
   oWS2: OLEVariant;
begin
   try
     oExcel := CreateOleObject('Excel.Application');
   except
     ShowMessage('Microsoft Excel kann nicht starten.');
     exit;
   end;
   oExcel.Visible:= TRUE;
   // Workbook anlegen
   if (NOT VarIsEmpty(oExcel)) then
   begin
     oWB1:=oExcel.Workbooks.add;
   end;
   if ((NOT VarIsEmpty(oExcel))and(NOT VarIsEmpty(oWB1))) then
   begin
     // Wir legen mal ein neues Sheet an, es soll vor den ersten Sheet eingefügt
     // werden
     oWS1:= oWB1.Worksheets.add(Before:= oWB1.WorkSheets[1]);
     oWS1.Name:= 'Erste Blatt';
     oWS2:= oWB1.Worksheets[2];
     oWS2.Name:= 'Zweites Blatt';
     oWS2.activate;
     ShowMessage('Blatt 2 aktiviert');
     oWS1.activate;
     ShowMessage('Blatt 1 aktiviert');
   end;
   if ((NOT VarIsEmpty(oExcel))and(NOT VarIsEmpty(oWB1))
       and(NOT VarIsEmpty(oWS1))and(NOT VarIsEmpty(oWS2))) then
   begin
     oWS1.Delete; // Wir löschen das neue Sheet
     oWS1:= Unassigned;
   end;
   // Workbook schliesssen
   if (NOT VarIsEmpty(oWB1)) then
   begin
     oWB1.Saved := TRUE; // ohne Nachfragen
     oWB1.Close;
     oWB1:= Unassigned;
   end;
   // Excel schliessen
   if ((NOT VarIsEmpty(oExcel))and VarIsEmpty(oWB1)) then
   begin
     oExcel.Quit;
     oExcel:= Unassigned;
   end;
end;

end.
Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#2

AW: Excel Sheets

  Alt 2. Okt 2016, 20:52
Hallo Chemiker,

habe dein Beispiel 1:1 übernommen, es läuft durch und die Tabellenblätter werden entsprechend umbenannt allerdings erhalte ich auch hier in meinem Struktur Fenster die Fehlermeldung: Undeklarierter Bezeichner 'Before' in Zeile...

Hab so den Verdacht meine Delphi Version ist hier etwas fehlerhaft.

Wollte eigentlich eine Unit schreiben die ich in allen Projekten einsetzen kann, werde mal mit deinem Ansatz weiter experimentieren

Gruß
Sidi61
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.385 Beiträge
 
Delphi 12 Athens
 
#3

AW: Excel Sheets

  Alt 2. Okt 2016, 23:03
Zitat:
Undeklarierter Bezeichner
ErrorInsight hatte noch nie 100% richtig funktioiert und zeigt gern mal falsche Fehler an.
Wenn der Compiler sagt es ist OK, dann ignoriere solche Fehlermeldungen einfach.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
984 Beiträge
 
Delphi 6 Professional
 
#4

AW: Excel Sheets

  Alt 3. Okt 2016, 08:43
So, mal deinen Quellcode überarbeitet

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   oExcel: OLEVariant;
   oWB1: OLEVariant;
   oWS1: OLEVariant;
   oWS2: OLEVariant;
begin
   try
     oExcel := CreateOleObject('Excel.Application');
   except
     ShowMessage('Microsoft Excel kann nicht starten.');
     exit;
   end;


   if (NOT VarIsEmpty(oExcel)) then // Excel gestartet ?
   begin
     try

       oExcel.Visible:= TRUE; // Excel anzeigen

       oWB1:=oExcel.Workbooks.add; // Workbook anlegen

       if (NOT VarIsEmpty(oWB1)) then // Workbook angelegt ?
       begin
         // Wir legen mal ein neues Sheet an, es soll vor den ersten Sheet eingefügt
         // werden
         oWS1:= oWB1.Worksheets.add(oWB1.WorkSheets[1]);
         if (NOT VarIsEmpty(oWS1)) then
         begin
           oWS1.Name:= 'Erste Blatt';
           oWS2:= oWB1.Worksheets[2];
           oWS2.Name:= 'Zweites Blatt';
           oWS2.activate;
           ShowMessage('Blatt 2 aktiviert');
           oWS1.activate;
           ShowMessage('Blatt 1 aktiviert');

           oWS1.Delete; // Wir löschen das neue Sheet

           ShowMessage('Blatt 1 gelöscht');
         end;

         oWS1:= Unassigned;
         oWS2:= Unassigned;

         // Workbook schliesssen
         oWB1.Saved := TRUE; // ohne Nachfragen
         oWB1.Close;
         oWB1:= Unassigned;
       end;
     finally
       // Excel schliessen
       oExcel.Quit;
       oExcel:= Unassigned;
     end;
  end;
end;

das Before:= kann auch weggelassen werden, da 'Before' der erste Parameter von Sheet.Add ist...
Somit auch keine Fehlermeldungen...

Durch die vielen (NOT VarIsEmpty( wurde es etwas unübersichtlich..

Geändert von HolgerX ( 3. Okt 2016 um 08:46 Uhr)
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#5

AW: Excel Sheets

  Alt 3. Okt 2016, 19:07
Hallo zusammen,

nach langem Gefummel habe ich jetzt doch tatsächlich einen Code der läuft

Einen Schönheitsfehler bezüglich Fehlermeldung "Undeklarierter Bezeichner" für After und Name bleibt erhalten, wenn ich das jedoch richtig verstanden habe ist das kein Beinbruch.

Es sind einige eurer Tips eingeflossen - Danke dafür - mit folgendem Skript kann ich jetzt eine neue Arbeitsmappe mit 3 Arbeitsblättern anlegen und diese auch benennen.

Delphi-Quellcode:
Var ExcelApp : OleVariant;
Function TFormExcel.Excel_Starten(Q,Namen : String; Anz : integer; V : boolean) : boolean;
var OK : boolean;
    N1, N2 : string;
    I : integer;
begin
  OK := true;
  try
    ExcelApp := GetActiveOleObject('Excel.Application');
  Except
     try
       ExcelApp := CreateOleObject('Excel.Application');
     except
       Showmessage('Excel konnte nicht gestartet werden!');
       OK := false;
     end;
  end;

  if (OK) and (not v) then
  begin
    ExcelApp.visible := false;
    ExcelApp.DisplayAlerts:=False; //unterdrückt die Ausgaben von Hinweisen aus Excel
  end;

  if Q = 'then //neue Arbeitsmappe anlegen
  begin
    ExcelApp.Workbooks.Add(xlWBatWorkSheet);
    //Eine Arbeitsmappe hat automatisch auch eine Tabelle
    N1 := Namen;
    if Pos(';',N1)>0 then
    begin
      N2 := Copy(N1,1,Pos(';',N1)-1);
      Delete(N1,1,Pos(';',N1));
    end else N2 := 'Seite 1';
    ExcelApp.ActiveWorkbook.ActiveSheet.Name := N2;

    //soll die Arbeitsmappe mehr als eine Tabelle enthalten dann weitere anlegen
    if Anz > 1 then
    begin
      for I := 2 to Anz do
      begin
        if Pos(';',N1)>0 then
        begin
          N2 := Copy(N1,1,Pos(';',N1)-1);
          Delete(N1,1,Pos(';',N1));
        end else N2 := 'Seite ' + inttostr(I);
        ExcelApp.ActiveWorkbook.Worksheets.Add(After := ExcelApp.ActiveWorkbook.Worksheets[I-1]);
        ExcelApp.ActiveWorkbook.Worksheets[I].Name := N2;
      end;
    end else
    begin
      //hier Action wenn vorhandene Arbeitsmappe geöffnet werden soll
    end;
  end;
  Result := OK;
end;

Function TFormExcel.Excel_Arbeitsmappe_speichern(Z: string):boolean;
Var OK : boolean;
begin
  OK := true;
  if Z = 'then Ziel := Quelle else Ziel := Z;
  if Ziel <> 'then ExcelApp.ActiveWorkbook.saveas(Ziel) else OK := false;
  Result := OK;
end;

Procedure TFormExcel.Excel_Schliessen;
begin
  ExcelApp.Quit;
  ExcelApp := Unassigned;
end;

procedure TFormExcel.Button1Click(Sender: TObject);
begin
  if Excel_Starten('','Test 1;Test 2;Test 3;',3,false) then
  begin
    Excel_Arbeitsmappe_speichern('D:\Eigene Dateien\temp\Test.xlsx');
    Excel_Schliessen;
  end;
end;
Ein weiteres Problem wo ich noch keinen Ansatz gefunden habe:
Wie im Beispiel zu sehen gebe ich die Datei-Endung mit .xlsx an, was aber wenn der Anwender noch ein älteres Excel hat welches nur xls unterstützt.
Kann ich das irgendwie herausfinden ob xlsx geht oder nicht ??



Gruß
Sidi61

Geändert von Sidi61 ( 3. Okt 2016 um 22:09 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#6

AW: Excel Sheets

  Alt 4. Okt 2016, 08:20
Hallo,

die Excel-Version bekommst du über:
Code:
Application.Version bzw. bei dir: ExcelApp.Version
Das ist ein String, den du dann mal analysieren musst.

Zur generellen Vorgehensweise: Ich würde einfach eine Stringlist, oder TStrings mit den Namen übergeben, dann weißt du zum einen die Anzahl der gewünschten Namen über den Listcount und kannst es dir auch sparen, deinen Namens-String mühsam zu zerlegen, wie du das jetzt machst.

Dann kannst du auch folgendes dann machen, um auf einen Schlag ein Workbook mit n leeren Sheets zu erzeugen:
Delphi-Quellcode:
AlteSheetZahl:=ExcelApp.SheetsInNewWorkbook
ExcelApp.SheetsInNewWorkbook:=Namensliste.Count
wb:=ExcelApp.Workbooks.Add
ExcelApp.SheetsInNewWorkbook:=AlteSheetZahl
for i:=0 to Namensliste.Count-1 do
  wb.Worksheets[i+1].Name:=Namensliste[i]
fertig.
Ralph
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Excel Sheets

  Alt 4. Okt 2016, 12:08
Was passiert wenn du einfach die Endung weglässt? Bei Excel gibt es eine Einstellung wie neue Arbeitsmappen standardmäßig gespeichert werden sollen. Wenn sich der User jetzt explizit einen Datentyp ausgewählt hat und deine Anwendung aber einen anderen verwendet, dann ist das u. U. nicht so gern gesehen.

Vielleicht speichert Excel die Datei dann mit der voreingestellten Endung wenn du sie einfach weglässt. Habe ich bisher aber noch nicht probiert.

Die Fehler werden bei mir auch massig in der Fehlerliste angezeigt. Ich habe meine Export Funktionen in eine eigene Unit ausgelagert damit diese nicht die wirklichen Fehler überdecken. Scheint ein Problem mit den Variants zu sein weil Error Insight das nicht richtig auflösen kann.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Excel Sheets

  Alt 4. Okt 2016, 15:58
Ein weiteres Problem wo ich noch keinen Ansatz gefunden habe:
Wie im Beispiel zu sehen gebe ich die Datei-Endung mit .xlsx an, was aber wenn der Anwender noch ein älteres Excel hat welches nur xls unterstützt.
Kann ich das irgendwie herausfinden ob xlsx geht oder nicht ??
Naja Excel weiß natürlich auch hier alles besser und verbindet mit den Qualifiern bestimmte Formate. Und noch besser Je nach Art eine Datei zu öffnen interpretiert Excel (und Word,und..) das Dateiformat oder aber nicht. Wenn Du auf der sicheren Seite sein willst, bleibt Dir nur die Frage "In welchem Format soll gespeichert werden?"

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.385 Beiträge
 
Delphi 12 Athens
 
#9

AW: Excel Sheets

  Alt 4. Okt 2016, 16:19
Durch die vielen (NOT VarIsEmpty( wurde es etwas unübersichtlich..
Zitat:
Delphi-Quellcode:
  if ((NOT VarIsEmpty(oExcel))and(NOT VarIsEmpty(oWB1))
      and(NOT VarIsEmpty(oWS1))and(NOT VarIsEmpty(oWS2))) then
Ein bissl Boolesche Algebra und viele NOT sind Geschichte.

Erstmal die obsoleten Klammern weg (außerdem können Leerzeichen ja soooooooowas von entspannend wirken)
Ich werde da immer ganz kirre, wenn ich sinnlos Klammern zählen muß, um zu erkennen was wirklich geklammert ist. (wir schreiben hier doch keine C-Codes, wo immer zuviele Klammern vorkommen und ich die gern mal mit { } verwechsle )
Delphi-Quellcode:
  if NOT VarIsEmpty(oExcel) and NOT VarIsEmpty(oWB1)
      and NOT VarIsEmpty(oWS1) and NOT VarIsEmpty(oWS2) then
und dann nur noch umdrehn
  if NOT (VarIsEmpty(oExcel) or VarIsEmpty(oWB1) or VarIsEmpty(oWS1) or VarIsEmpty(oWS2)) then
Warum NOT groß und IF THEN AND klein?
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 4. Okt 2016 um 16:23 Uhr)
  Mit Zitat antworten Zitat
Sidi61

Registriert seit: 13. Jun 2006
97 Beiträge
 
Delphi XE5 Professional
 
#10

AW: Excel Sheets

  Alt 4. Okt 2016, 18:54
Hallo p80286,

da hast du wohl recht, werde es dann einfach in die Grundeinstellung des jeweiligen Programms auslagern, das hat den Charme dass der Anwender das Format selbst wählen kann und somit u.U. auch für ältere Excel Versionen auf ggf. vorhandenen Zweit-Rechnern kompatibel sein kann.

Gruß
Sidi61
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz