fpspreadsheet Grafik einfügen

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

fpspreadsheet Grafik einfügen

Beitrag von Mathias »

Ich bin gerade mit fpspreadsheet am basteln.
Dabei wollte ich eine Grafik in eine Zelle einfügen, aber leder geht die nicht, es kommt nicht mal eine Fehlermeldung.
Anderes Zeugs, so wie Textschreiben oder Zellen einrahmen klapp gut, nur die Grafik will nicht.
Auch Zellen kopieren klappt.
Was mache ich falsch ?

Code: Alles auswählen

var
  MyWorkbook: TsWorkbook;
  MyWorksheet: TsWorksheet;
begin
  MyWorkbook := TsWorkbook.Create;
 
  MyWorksheet := MyWorkbook.AddWorksheet('abc');
  MyWorksheet.WriteColWidth(0, 5, suChars);
 
  MyWorksheet.WriteBorders(0, 3, [cbDiagDown, cbDiagUp]);
 
  MyWorksheet.CopyCell(0, 3, 0, 4);
  MyWorksheet.WriteImage(9, 9, 'project1.ico')// geht nicht
  MyWorksheet.WriteImage(10, 10, 'test.bmp')// geht nicht
 
  MyWorkbook.WriteToFile('test.xls', sfExcel8, True);
  MyWorkbook.Free;
 
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: fpspreadsheet Grafik einfügen

Beitrag von wp_xyz »

Ich hab' das jetzt aktuell nicht durchgespielt, aber nachdem ich schon lange nichts mehr mit eingefügten Bildern gemacht habe, wird es so sein wie es im wiki steht (http://wiki.lazarus.freepascal.org/FPSp ... ll_content): Bilder werden vom xls-Format weder geschrieben noch gelesen, weil's einfach zu kompliziert ist. Schreiben geht für xlsx und OpenDocument, Lesen nur für OpenDocument.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: fpspreadsheet Grafik einfügen

Beitrag von Mathias »

Ich habe diese Zeile abgeändert. Mit LibreOffice kommt eine Grafik.
Aber ob dies beim original Excel auch geht ?

Code: Alles auswählen

  MyWorkbook.WriteToFile('test.xls', sfOpenDocument, True)


Noch etwas, die Grafik wird über mehrere Zellen gezeichnet.
Auch, wen ich folgende Parameter angeben.

Code: Alles auswählen

  MyWorksheet.WriteImage(4, 4, 'test.bmp', 0.0, 0.0, 1.0, 1.0);

Auch stimmt die Position 4,4 nicht richtig.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: fpspreadsheet Grafik einfügen

Beitrag von wp_xyz »

Sag mal, hast du meine vorige Antwort nicht gelesen? Und den Link zum Wiki wahrscheinlich auch nicht...

Also nochmals:
  • Schreiben geht nur für xlsx und OpenDocument.
  • Die letzten beiden von dir angegebenen Parameter sind der Streckungsfaktor des Bildes in x- und y-Richtung. Mit dem Wert 1 zeichnest du das Bild in "Originalgröße", so wie es sich aus den Pixeln und seinen dpi ergibt. Um das Bild in eine Zelle einzupassen, musst du den Streckungsfaktor entsprechend ausrechnen.
  • Dass die Bildposition bei OpenDocument nicht richtig ist, liegt daran, dass ich nicht weiß, welche Default-Spaltenbreite dort eingestellt ist, und ich habe auch nichts gefunden, wie man das dort festlegen kann. Es bleibt also keine andere Wahl, also die Breite der Spalten vor dem Bild einzeln festzulegen. Das ist bei xlsx nicht nötig.
Der folgende Code passt das Bild vom Lazarus-Cheetah in die Breite einer Spalte ein, wobei die Spalte 30 mm breit sein soll:

Code: Alles auswählen

uses
  ... fpstypes, fpspreadsheet, fpsallformats, fpsimages, fpsutils;
 
var
  MyWorkbook: TsWorkbook;
  MyWorksheet: TsWorksheet;
  i: Integer;
  wPix, hPix: DWord;
  xdpi, ydpi: Double;
  wMM, hMM: Double;
  f: Double;
  stream: TMemoryStream;
 
const
  wCol_mm = 30// Spaltenbreite, in mm       
...
    stream := TMemoryStream.Create;
    try
      stream.LoadFromFile ('C:\lazarus-trunk_fpc302\images\splash_source\cheetah.jpg');
      // Bildinformationen auslesen
      GetImageInfo(stream, wPix, hPix, xdpi, ydpi);   
      wMM := InToMM(wPix / xdpi)// Bildbreite in mm bei 100%
      hMM := InToMM(hPix / ydpi);
      // Skalierungsfaktor berechnen, um das Bild in eine Spalte der Breite wCol_mm einzupassen
      f := wCol_mm / wMM;
      // Spaltenbreiten festelegen
      for i:=0 to 4 do
        MyWorksheet.WriteColWidth(i, wCol_mm, suMillimeters);
      // Bild einfügen und mit Faktor f skalieren
      MyWorksheet.WriteImage(4, 4, stream, 0, 0, f, f);
    finally
      stream.Free;
    end;

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: fpspreadsheet Grafik einfügen

Beitrag von Mathias »

Sag mal, hast du meine vorige Antwort nicht gelesen? Und den Link zum Wiki wahrscheinlich auch nicht...

Ich habe die Tabelle schon gesehen.

Ist *.xlsx etwa "Microsoft OOXML" ?

Wäre dann zum speicher dies richtig ?

Code: Alles auswählen

  MyWorkbook.WriteToFile('test.xlsx', sfExcelXML, True);

Nur sehe ich da keine Grafik, wen ich es mit LibreOffice öffne.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: fpspreadsheet Grafik einfügen

Beitrag von wp_xyz »

Das heute übliche Excel-Format (seit Excel 2007) hat die Endung .xlsx. FPSpreadsheet kann hier Bilder schreiben, aber nicht lesen (warum müssen die das so kompliziert machen?). Der Formatbezeichner dafür ist sfOOXML, und der Reader/Writer steckt in der Unit xlsxOOXML (um die Verwirrung komplett zu machen, meint Microsoft mit dem "OO" "Open Office" - ja es war damals ein kleiner Krieg zwischen Microsoft und OpenOffice um das "beste" xml-Datenformat).

Ein paar Jahr vorher machte Microsoft die ersten Gehversuche mit xml und nannte das Format ExcelXML (Datei-Endung .xml), es hat sich nicht durchgesetzt (fpspreadsheet-Bezeichner sfExcelXML)

So wird das Workbook als xlsx-Datei geschreiben:

Code: Alles auswählen

    MyWorkbook.WriteToFile(MyDir + 'test.xlsx', sfOOXML, true); 

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: fpspreadsheet Grafik einfügen

Beitrag von Mathias »

Dann bin ich wohl mit dem "Microsoft OOXML (xlsx)"-Format am besten bedient, da es dieses schon 10 Jahre gibt ?

Jetzt wird mir auch klarer, wieso die Bilder nicht in eine Zelle passen, wen ich ein Bild direkt in LibreOffice einfüge, dann hat es auch die Originalgrösse.
Ich hatte im Hinterkopf, das man auch Bilder lokal in eine Zelle einfügen konnte. Was man bei Excel noch als Coder umdenken muss, bei Excel bezieht sich das meiste auf ein Blatt-Papier und bei sonstigen Code auf Bildschirm-Pixel.

Auch mit der Zellengrösse hatte ich schon Mühe gehabt, da dies in mm ist und nicht in Pixel. Ich hbae gerade gesehen, das eine Zell in Lazarus bei default ein Zoll breit ist.
In LibreOffice ist es ein bisschen weniger.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: fpspreadsheet Grafik einfügen

Beitrag von wp_xyz »

Mathias hat geschrieben:Dann bin ich wohl mit dem "Microsoft OOXML (xlsx)"-Format am besten bedient, da es dieses schon 10 Jahre gibt ?

Ja, wenn du die Dateien nicht lesen musst. Andernfalls hat OpenDocument (LibreOffice) bei fpspreadsheet die Nase vorn - siehe die Tabelle im wiki.

Mathias hat geschrieben:Auch mit der Zellengrösse hatte ich schon Mühe gehabt, da dies in mm ist und nicht in Pixel.

Zeilenhöhen und Spaltenbreiten kann man nun sehr flexibel angeben, in mm, cm, Inch, Punkt, Zeilen/Zeichen, nur nicht in Pixel. Diese sind keine verlässliche Längenangabe, weil das Basis-Package laz_fpspreadsheet nicht von der LCL abhängig sein soll und daher die Bildschirmauflösung nicht bekannt ist.

Mathias
Beiträge: 6160
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: fpspreadsheet Grafik einfügen

Beitrag von Mathias »

Ja, wenn du die Dateien nicht lesen musst. Andernfalls hat OpenDocument (LibreOffice) bei fpspreadsheet die Nase vorn - siehe die Tabelle im wiki.

Mir wäre vor allem das Schreiben interessant. Ein Beispiel wäre eine Messdatenerfassung, welche man dann als xlsx exportieren könnte.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: fpspreadsheet Grafik einfügen

Beitrag von wp_xyz »

Kein Problem... Schau dir die Beispiel-Dateien an und lege einfach los. Melde dich, wenn es Probleme gibt.

Antworten