AGB  ·  Datenschutz  ·  Impressum  







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

delphi --stream--> excel ??

Ein Thema von hyype · begonnen am 6. Jan 2009 · letzter Beitrag vom 22. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#1

delphi --stream--> excel ??

  Alt 6. Jan 2009, 15:40
Hiho.
Mit ein wenig Phantasie kann man dem Topic schon entnehmen, worum es geht ^^
Ich möchte von Delphi aus Excel ansteuern, dazu habe ich auch einige Beiträge im Netz gefunden und es auch wie folgt umgesetzt:
Delphi-Quellcode:
procedure TForm1.ExcelViewer(ms:TMemoryStream);
var
  Excel : Variant;
  strPath : string;
  screened:boolean;
  bmp:TBitmap;
begin
  bmp:=TBitmap.Create;
  try
    try
      ms.Position:=0;
      strPath:=ExtractFilePath(paramstr(0))+'hype.xls';
      ms.savetofile(strPath);
      Excel:=CreateOleObject('Excel.Application');
      try
        Excel.Workbooks.open(strPath);
        Excel.Visible:=true;
        screened:=takescreen(bmp);
      finally
        Excel.quit;
        deletefile(strPath);
      end;
      if screened then
      begin
        image1.Picture.Bitmap.assign(bmp);
        memo1.Visible:=false;
        stringgrid1.Visible:=false;
        image1.Visible:=true;
        image1.Left:=0;
        image1.Top:=0;
        image1.Height:=image1.Picture.Height;
        image1.Width:=image1.Picture.Width;
        form1.clientheight:=image1.Height;
        form1.ClientWidth:=image1.Width;
      end
      else
        showmessage('taking screenshot failed');
    finally
      bmp.Free;
      deletefile(strPath);
    end;
  except
    on e : exception do
    showmessage('das hat nicht geklappt '+e.message);
  end;
end;
Die Procedure ist nicht wirklich ausgereift, z.Bsp. kriege ich Excel nicht maximiert, falls es noch nicht maximiert ist.
Habe auch schon n Makro aufgezeichnet:
Application.WindowState = xlMaximized
Ich krieg das aber nicht in Delphi übertragen...
Ein weiterer sehr unschöner Sachverhalt ist, dass ich die hype.xls nicht mehr löschen kann, weil sie von irgendwas geöffnet ist.
Habe im TaskManager nachgeguckt, ob da irgendwo noch ein Excel läuft und: nein
Auch nach einem Neustart ist die Datei nicht löschbar... (auch von Hand nicht)
Also wer mir da einen Rat geben kann: immer her damit!
Nun zum eigentlichen Problem:
Mir liegt das Excel-File als MemoryStream vor und ich würde den gern an Excel übergeben, anstatt ihn erst als .xls abzuspeichern und die Datei dann mit Excel zu öffnen - geht das irgendwie?
Vielen Dank schonmal.
mfg
Hype
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

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

Re: delphi --stream--> excel ??

  Alt 6. Jan 2009, 19:29
Hallo Hype,

Excel maximieren:

Excel.Application.WindowState:= xlMaximized;
Zitat von Hype:
Ein weiterer sehr unschöner Sachverhalt ist, dass ich die hype.xls nicht mehr löschen kann, weil sie von irgendwas geöffnet ist.
Das kann an der Einstellung vom Stream liegen. Ich würde die Einstellungen noch mal überprüfen.

Zitat von Hype:
Mir liegt das Excel-File als MemoryStream vor und ich würde den gern an Excel übergeben, anstatt ihn erst als .xls abzuspeichern und die Datei dann mit Excel zu öffnen - geht das irgendwie?
Ja, aber um weiterzuhelfen fehlen Informationen, wie ist der Stream Aufgebaut.

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

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#3

Re: delphi --stream--> excel ??

  Alt 7. Jan 2009, 09:07
danke, ich hatte es mit excel.windowstate probiert...
der stream ist ein ganz normaler memorystream, ich hab den immer nur benutzt. ich nehme an, dass er die Bytes, aus denen die Datei besteht, einfach kopiert, aber da kenne ich mich auch nicht aus

aus der Hilfe:
"Mit TMemoryStream können Daten in einem dynamischen Speicherpuffer abgelegt werden, der über erweiterte E/A-Funktionalität verfügt. TMemoryStream umfasst die allgemeinen E/A-Merkmale eines Stream-Objekts, führt aber Methoden und Eigenschaften ein, die speziell für die Verwaltung eines dynamischen Speicherpuffers vorgesehen sind.
Speicher-Streams eignen sich gut als temporäre Informationsablage, weil sie Daten speichern können, aber auch Lese- und Schreibvorgänge in/aus anderen Speichermedien zulassen. Sie bieten eine praktikable Möglichkeit, die Inhalte verschiedener Streams zu vergleichen oder gespeicherte Daten auf solchen Medien zu bearbeiten, die nur indirekt zugreifbar sind."

und gefreet wird der ms am ende auch..
habe zu testzwecken (weil es erstmal nur ein testproject ist bis es dann so läuft wie ich es will) einfach ms.loadfromfile gemacht und den pfad einer excel-datei angegeben
aber kann das denn daran liegen? wenn ich den rechner neustarte hat es doch nix mehr mit dem stream zu tun, oder?
bei word-dokumenten mache ich es genauso und die kann ich löschen :/
gib mir mal bitte nen kleinen tip, wie ich nen stream an excel übergeben könnte, dann probier ich n bissl rum

edit:
er sagt mir "unbekannter bezeichner xlMaximized"
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: delphi --stream--> excel ??

  Alt 7. Jan 2009, 09:41
xlMaximized hat den Wert -4137
Markus Kinzler
  Mit Zitat antworten Zitat
hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#5

Re: delphi --stream--> excel ??

  Alt 7. Jan 2009, 11:44
Mit -4137 geht es, danke!
Ich habe jetzt einiges geändert, weil das Abscreenen im Endeffekt Schwachsinn ist, da die Excel-Tabelle ja wesentlich mehr Daten enthalten kann als man sieht, auch wenn mans maximiert hat..
Delphi-Quellcode:
procedure TForm1.ExcelViewer(ms:TMemoryStream);
var
  Excel : Variant;
  strPath : string;
  offen : boolean;
begin
  offen:=false;
  ms.Position:=0;
  strPath:=ExtractFilePath(paramstr(0))+'hype.xls';
  try
     Excel := GetActiveOleObject('Excel.Application');
     offen:=true;
  except
     Excel := CreateOleObject('Excel.Application');
  end;
  if offen then
    try
      WB.close;
    except

    end;
  try
    ms.savetofile(strPath);
  except
    showmessage('Nicht genügend freier Speicherplatz oder fehlende Schreibrechte');
  end;
  WB:=Excel.Workbooks.open(strPath);
  Excel.visible:=true;
  Excel:=Unassigned;
end;
WB ist eine globale Variable vom Typ Variant. Damit kann ich gegebenenfalls das zuletzt über mein Programm geöffnete Workbook schließen, damit ich die hype.xls wieder benutzen kann. Ich habe leider nicht herausgefunden, wie ich bei Excel.Workbooks.Close den Namen des zu schließenden Workbooks übergeben kann, daher diese unschöne Lösung. Ist schon schwer, ohne Autovervollständigung zu programmieren, ich kann gar nicht gucken, welche Methoden mir zur Verfügung stehen, welche Übergabeparameter die erwarten etc :/
Offene Fragen wären noch die mit dem Stream und obs auch ohne WB geht.
Vielen Dank.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

Re: delphi --stream--> excel ??

  Alt 7. Jan 2009, 13:11
Hallo,

welche Delphiversion hast Du?

Zumindest bei Delphi 7 gibt es Packages dcloffice2k70.bpl und dclofficexp70.bpl. Wenn Du die installierst, bekommst Du einen zusätzlichen Palettenreiter "Server", der diverse Komponenten für die Officeprodukte enthält. Damit funktioniert die Autovervollständigung. Zum Nachgucken reicht das dann immer, auch wenn Du Excel und Co auf dem gewohnten Weg weiter benutzen willst.
Was auch hilft: In Excel ein Makro erstellen, was die gewünschte Aufgabe ausführt, mit ein bisserl Übung und Geduld kann man sich das nach Delphi übersetzen. Ansonsten die Hilfe des Makroeditors von Excel benutzen, ist immer besser, als nur stochern.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

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

Re: delphi --stream--> excel ??

  Alt 7. Jan 2009, 15:16
Hallo hyype,

die Konstante xlMaximized funktioniert nicht, wenn Du nicht die entsprechende Excel-Unit mit eingebunden hast.
Welches Excel benutzt Du? Wenn Du z.B. Excel 2000 auf Deinen Rechner laufen hast, muss du die Excel2000-Unit mit einbinden.

Zitat von hyype:
WB ist eine globale Variable vom Typ Variant. Damit kann ich gegebenenfalls das zuletzt über mein Programm geöffnete Workbook schließen, damit ich die hype.xls wieder benutzen kann.
Das kann eigentlich nicht sein, weil Du in Deinem Anfangsbeitrag geschrienen hast, dass auch nach einem Neustart die Dateien nicht mehr aufrufbar ist. Aber Schwamm drüber.
Um Hilfe bei der Eingabe von Delphi zu bekommen musst Du die frühe Bindung der Oleautomation verwenden.

Delphi-Quellcode:
WB:= Unassigned;
  if not VarIsEmpty(Excel) then
  begin
     Excel.DisplayAlerts := False;
     Excel.Quit;
     Excel := Unassigned;
  end;
Damit wird die Verbindung von Deinem Programm zum Workbook beendet.

Für die Oleautomation sollte man nach Möglichkeit die Variabeln mit OLEVariant deklarieren.

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

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#8

Re: delphi --stream--> excel ??

  Alt 7. Jan 2009, 15:37
Danke für eure Beiträge!
Ich habe Delphi 2007, Windows Vista und Office 2003.
Das Programm, welches ich schreibe, soll aber unabhängig von der Office-Version funktionieren, wenn das überhaupt geht ^^
@nahpets:
Das mit den Makros machen und dann in Delphi-Code übersetzen habe ich auch gelesen und auch gemacht, allerdings gestaltet sich das mitunter etwas schwierig, wenn man die Delphi-Entsprechung nicht kennt. :/
@Chemiker:
Die in meinem Anfangsbeitrag erwähnten Dateien sind aufrufbar, sie sind aber nicht mehr löschbar. Ich ahne auch, woran das liegt, ich habe nämlich am Anfang Fehler im Code gehabt und dadurch kam zwischen dem Starten von Excel und Excel.Quit eine Exception. Dadurch hatte ich im Taskmanager 3 Prozesse namens EXCEL.EXE, die die beiden Dateien blockiert haben. Die habe ich dann alle 3 abgeschossen, Rechner neu gestartet und so weiter, aber gelöscht krieg ich sie trotzdem nicht mehr...
Überschreiben dagegen geht.
Mit dem WB meinte ich aber etwas ganz anderes:
Da ich jetzt Excel nicht mehr abscreene und schließe, sondern offen lasse, der User aber evtl mehrere Excel-Files hintereinander öffnet, ich den Stream aber immer als hype.xls speichere, muss ich mir das Workbook merken, damit ich gezielt dieses eine Workbook schließe und nicht andere evtl geöffnete mit Excel.Quit mitschließe...
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

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

Re: delphi --stream--> excel ??

  Alt 7. Jan 2009, 19:42
Hallo hyype,

Zitat von hyype:
Ich habe Delphi 2007, Windows Vista und Office 2003.
Das Programm, welches ich schreibe, soll aber unabhängig von der Office-Version funktionieren, wenn das überhaupt geht
Mit der späten Bindung geht das, allerdings können natürlich Neuerungen die z.B. in Excel 2007 vorhanden sind nicht genutzt werden.
Da Du Office 2003 hast würde ich an Deiner Stelle die Unit ExcelXP mit einbinden, damit hast Du ein Teil der Konstanten die in Excel vorhanden sind zur Verfügung und muss nicht mühselig die Konstanten ermitteln (xlMaximized = -4137)
Hilfe kannst Du aber von Delphi dann nicht erwarten.

Zitat von hyype:
Mit dem WB meinte ich aber etwas ganz anderes:
Da ich jetzt Excel nicht mehr abscreene und schließe, sondern offen lasse, der User aber evtl mehrere Excel-Files hintereinander öffnet, ich den Stream aber immer als hype.xls speichere, muss ich mir das Workbook merken, damit ich gezielt dieses eine Workbook schließe und nicht andere evtl geöffnete mit Excel.Quit mitschließe...
Warum soll der User in eine Excel – Instanz die vom Programm geöffnet worden ist, weitere Workbooks anlegen? Dann muss Du als Programmier auch dafür sorge tragen das Excel nicht vom User geschlossen wird oder der Dateiname geändert wird und dann unter Speichern unter… gespeichert wird. usw. usw.

Delphi-Quellcode:
WB. saved := FALSE;
WB.Close (saveChanges:=TRUE, FileName:= strPath);
Mit diesen Anweisungen ist es möglich das WorkBook abzuspeichern.


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

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#10

Re: delphi --stream--> excel ??

  Alt 8. Jan 2009, 10:36
Mir geht es ja eigentlich nur darum, die Datei anzuzeigen.
Deswegen habe ich auch das Excel-Fenster abgescreent und Excel wieder geschlossen, aber dann habe ich in den meisten Fällen gar nicht alle in der Excel-Tabelle vorhandenen Informationen, weil die Tabellen ja riesig sein können.
Daher öffne ich die Datei einfach in Excel.
Dazu prüfe ich, ob Excel evtl schon offen ist. Wenn das der Fall ist, kann ich ja davon ausgehen, dass auch Workbooks geöffnet sind und speziell kann es sein, dass ein anderes Workbook über mein Programm geöffnet wurde und daher die hype.xls blockiert ist.
D.h. wenn Excel schon offen ist, muss ich zunächst das evtl vorher über mein Programm geöffnete Workbook schließen, damit die hype.xls wieder zur Verfügung steht und ich den Stream wieder als hype.xls speichern kann, ich darf aber nicht Excel komplett schließen, weil ja evtl auch ein ganz anderes Workbook geöffnet sein kann, womit mein Programm gar nix zu tun hat.

Könntest du bitte noch was zum Thema "Stream an Excel übergeben und öffnen" sagen? *liebguck* ^^
  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:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz