fpspreadsheet Grafik einfügen

Rund um die LCL und andere Komponenten

fpspreadsheet Grafik einfügen

Beitragvon Mathias » 19. Aug 2017, 20:41 fpspreadsheet Grafik einfügen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3201
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 19. Aug 2017, 22:04 Re: fpspreadsheet Grafik einfügen

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.
wp_xyz
 
Beiträge: 2253
Registriert: 8. Apr 2011, 08:01

Beitragvon Mathias » 21. Aug 2017, 17:23 Re: fpspreadsheet Grafik einfügen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3201
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 21. Aug 2017, 18:57 Re: fpspreadsheet Grafik einfügen

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;
wp_xyz
 
Beiträge: 2253
Registriert: 8. Apr 2011, 08:01

Beitragvon Mathias » 21. Aug 2017, 19:24 Re: fpspreadsheet Grafik einfügen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3201
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 21. Aug 2017, 20:27 Re: fpspreadsheet Grafik einfügen

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); 
wp_xyz
 
Beiträge: 2253
Registriert: 8. Apr 2011, 08:01

Beitragvon Mathias » 21. Aug 2017, 21:31 Re: fpspreadsheet Grafik einfügen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3201
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 21. Aug 2017, 22:15 Re: fpspreadsheet Grafik einfügen

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.
wp_xyz
 
Beiträge: 2253
Registriert: 8. Apr 2011, 08:01

Beitragvon Mathias » 22. Aug 2017, 17:00 Re: fpspreadsheet Grafik einfügen

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 3201
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 22. Aug 2017, 17:08 Re: fpspreadsheet Grafik einfügen

Kein Problem... Schau dir die Beispiel-Dateien an und lege einfach los. Melde dich, wenn es Probleme gibt.
wp_xyz
 
Beiträge: 2253
Registriert: 8. Apr 2011, 08:01

• Themenende •

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried