fpspreadsheet - Kleinere Fragen

Rund um die LCL und andere Komponenten
Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

fpspreadsheet - Kleinere Fragen

Beitrag von af0815 »

Ich beschäftige mich gerade damit, im fpspreadsheet mit 'makros' = Ersetzungen zu arbeiten. Das funktioniert ja ganz gut für Zeichenketten im Excelsheet.

Code: Alles auswählen

function ReplaceCellWithCode(wb: TsWorkBook; code, replace: string): Boolean;
var
  MyRow, MyCol: Cardinal;
  MyWorksheet: TsWorksheet;
  MySearchParams: TsSearchParams;
  MyReplacParams: TsReplaceParams;
 
begin
  Result := False;
  MySearchparams := InitSearchParams(code, [soEntireDocument], swWorkbook);
  MyReplacParams := InitReplaceParams(replace, [roReplaceEntireCell]);
  // Create search engine and execute replace
  MyRow := 0;
  MyCol := 0;
  with TsSearchEngine.Create(wb) do begin
    Result:= ReplaceFirst(MySearchParams, MyReplacParams, MyWorksheet, MyRow, MyCol);
    Free;
  end;
end;
 

auch ein paar Beispiele hierzu unter https://github.com/afriess/LazInfos/tre ... preadsheet

Nun möchte in dieser Art auch Formeln manipulieren können, ur dazu fällt mir aktuell kein Weg ein, wie ich Excel eine Markierung in der Formel unterjubeln kann und zugleich aber das trotzdem ein gültiges format ist. Vielleicht kann mir wer da einen (Gedanklichen-) Schubser geben.
Das ganze soll es ermöglichen, das eine Person Excel-Reports erstellen kann, die dann vom System ausgefüllt werden. Also Excel als Template für die Reports in Excel :mrgreen:

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: fpspreadsheet - Kleinere Fragen

Beitrag von wp_xyz »

Kannst du ein Beispiel liefern, wie eine solche Formel aussehen soll? Wenn ich das jetzt richtig verstehe, möchtest du in fpspreadsheet Formeln erstellen, die Parameter enthalten?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpspreadsheet - Kleinere Fragen

Beitrag von af0815 »

Genauer gesagt, es so machen, das es trotzdem ein gültiges Excel ist.

=SUMME(a1:Makroersetzer)

ist ja nicht gültig. Wenn ich das bei den Texten mache kann ich ja durchaus ein :makroersetzer machen, das findet das Search&Replace ohne Probleme. Was natürlich ein Hack wäre, wenn ich die Ersetzung als Text definiere und diese dann als Formel einsetze. Das wäre ein gangbarer Weg. Weil Excel als Reportingtool hat schon was :-)

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: fpspreadsheet - Kleinere Fragen

Beitrag von wp_xyz »

Verstehe ich das so richtig? :makroersetzer ist (in dem Beispiel) die andere Grenze eines Zellblocks, z.B. das C5 in A1:C5. Wobei der User irgendwo in deinem Programm festlegt, dass in allen Formeln die den Bestandteil :makroersetzer enthalten, dieser gegen eine bestimmte Zelladresse (in meinem Beispiel C5) ersetzt wird.

Da würde ich alle Formeln nach dem :makroersetzer durchsuchen und dann diesen durch den vom User festgelegten Wert ersetzen, so dass eine Formel in der Template-Datei wie "=SUMME(A1::makroersetzer)" zu "=SUMME(A1:C5)" wird. Das wird dann problemlos von Excel akzeptiert.

Ich würde allerdings als Ersetzer-Kennung nicht den Doppelpunkt nehmen, weil dieser sowieso in Formeln vorkommt. $macroersetzer erscheint mir leichter zu detektieren zu sein.

Du musst nur dafür sorgen, dass fpspreadsheet selbst nicht die Formel berechnet, solange der Platzhalter noch vorhanden ist. Dazu musst du in den Workbook.Options die für die Formelberechnung zuständigen Elemente entfernen: Workbook.Options := Workbook.Options - [boAutoCalc, boCalcBeforeSaving, boReadFormulas]. boCalcBeforeSaving kannst du vor dem Speichern der endgültigen Excel-Datei wieder reinnehmen, damit Ergebnisse im Tabellenblatt stehen. Muss aber nicht sein, weil Excel beim Laden die Formeln selbst neu berechnet.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpspreadsheet - Kleinere Fragen

Beitrag von af0815 »

wp_xyz hat geschrieben: $macroersetzer erscheint mir leichter zu detektieren zu sein.

$ kommt ebenso auch in Excelformeln vor. $A1 oder $A$1. Aber es geht in die Richtung. Ich muss mich da noch viel mehr in die internas von Excel und fpSpreadsheet einarbeiten.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: fpspreadsheet - Kleinere Fragen

Beitrag von wp_xyz »

formulamacros.zip
(2.63 KiB) 59-mal heruntergeladen
Richtig. Vielleicht #?

Außerdem solltest du daran denken, dass die "Searchengine", die du in einem anderen Beispiel verwendet hast, nur die Zell-Texte durchsucht, nicht die Formeln. Aber mit einem "for cell in Worksheet.Cells" kann man das leicht nachbauen.

Ein Stolperstein kann auch sein, dass beim Kopieren einer Zelle (inkl Formel) die Formel geprüft wird, was ein Problem macht, wenn die Formel einen Platzhalter enthält. Hier kannst du vor dem Kopieren die Formel auslesen, sichern, durch etwas Unverfängliches ersetzen (z.B. "=A1"), die Zelle kopieren und die Formel dann wiederherstellen. Zum Glück sind die Zellen in fpspreadsheet einfache Records, so dass man (natürlich mit Bedacht) die Inhalte verändern kann, ohne einen Haufen Aktionen zu triggern (was eigentlich nicht ganz sauber ist, aber hier ist es von Vorteil).

Das geschieht so in dem beigefügten Beispiel. Hier steht in Zelle B1 die Formel "SUM(A1:#(RANGEEND))", wobei #(RANGEEND) ein Platzhalter für die außerhalb im Edit eingegebene Zelladresse ist. Ein Klick auf ">>" kopiert alle Zellen vom Template links ins Grid rechts, ersetzt den Platzhalter und berechnet die Formel.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpspreadsheet - Kleinere Fragen

Beitrag von af0815 »

Danke für den Gedankenanstoss, das ich bisher nur im Textbereich gesucht habe, ist der Tatsache geschuldet, das ich zuerst mit der einfachen Methode mein Prinzip überprüfe, bevor ich mir das mit den Formeln antue. Ein weitere Weg wäre, die Ersetzungen im Kommentarbereich zu hinterlegen, den Kommentarbereich zu durchsuchen und dann die Ersetzung entweder im Textbereich oder im Formelbereich zu machen. Damit ist die Struktur von Excel am wenigsten beeinflusst.

Wenn es dich nicht stört, so bringe ich die Codeschnippsel auf Github, aktuell https://github.com/afriess/LazInfos.git dort im Branch wip_af sammle ich das und später auf den Master. Ich habe auch schon überlegt, die fpspreadsheets dort zu spiegeln.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: fpspreadsheet - Kleinere Fragen

Beitrag von wp_xyz »

af0815 hat geschrieben:Wenn es dich nicht stört, ...

Kein Problem

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpspreadsheet - Kleinere Fragen

Beitrag von af0815 »

Gibt es bestimmt Options die ich aufpassen sollte, damit das Layout im Excel-Sheet beim Laden ins Grid nicht verloren geht ?! Irgendwo zerstöre ich mir aktuell mein Layout. Gibt es da typische Anfängerfehler ?

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: fpspreadsheet - Kleinere Fragen

Beitrag von wp_xyz »

Weil ich nicht weiß, wie Excel die Spaltenbreiten und Zeilenhöhen exakt berechnet, wird es hier am ehesten klemmen, das WorksheetGrid kann nie genauso aussehen wie Excel. Wenn die Zellen sehr eng bemessen sind, kann es als Folge davon zu Zeilenumbrüchen kommen, die im Excel-Sheet nicht vorhanden sind. Oder bei bestimmten Zellen erscheinen die ####, weil das formatierte Datum etwas breiter ausfällt als der in der Zelle vorhandene Platz. Daher alles etwas großzügig designen.

Auch sind einige Zahlenformate sehr spärlich dokumentiert. Excel setzt manchmal lokalisierte Formate ein, die ich in fpspreadsheet nicht implementiert habe, weil ich nicht einen Rattenschwanz an Lokalisierungsproblemen mit reinziehen wollte.

Wenn's irgendwo überhaupt nicht klappt, poste die Datei und den Code, wie du sie ins Grid lädst, dann kann ich mir das mal ansehen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpspreadsheet - Kleinere Fragen

Beitrag von af0815 »

Danke, ich werde mir mal ein neutrales Template erstellen das ich dann auch aus der Hand geben kann.

Bezüglich Makros ersetzen. Je mehr ich mir das ansehe um mehr keimt in mir die Idee das ganze in den Bereich des comments abzulegen. Da stört es niemanden, fpsearch wird man auf das durchsuchen des Kommentares auch noch adaptieren können, so kompliziert ist der nicht. Und dort im Kommentarbereich kann ich ja alles hinterlegen was ich will. Die Ersetzungen erfolgen dann je nach Befehl im Text oder Formelbereich. Mal das ganze etwas mehr Ausarbeiten.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpspreadsheet - Kleinere Fragen

Beitrag von af0815 »

Ein Beispiel für die Formatierung ist angeschlossen. Wobei auch LibreOffice manchmal Probleme haben zu schein, das Bild richtig darzustellen. Das das Bild so groß ist, ist Absicht.

Libre Office
Beispiel für das Layout in LibreOffice
Beispiel für das Layout in LibreOffice


Excel Online
Beispielk für das Layout in Excel Online
Beispielk für das Layout in Excel Online


fpSpreadSheet
Beispiel in fpSpreadsheet
Beispiel in fpSpreadsheet
Dateianhänge
MacrosInComment.zip
Beispiel für Formatierung
(3.76 MiB) 60-mal heruntergeladen
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: fpspreadsheet - Kleinere Fragen

Beitrag von wp_xyz »

Meinst du, dass der Text abgeschnitten wird und nicht in die angrenzenden Zellen fließt? Das liegt daran, dass die Eigenschaft TextOverflow des Grid nicht gesetzt ist. Siehe http://wiki.lazarus.freepascal.org/TsWo ... rty_values für die empfohlenen Änderungen der Standardeinstellungen.

Zum fehlenden Bild:
Lesen von Bildern funktioniert nur bei .ods, bei Excel blicke ich nicht durch... (http://wiki.lazarus.freepascal.org/FPSp ... ll_content).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6199
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fpspreadsheet - Kleinere Fragen

Beitrag von af0815 »

Die Column B wird nicht ausgeblendet, das fällt mir besonders auf. Das mit dem Bild glaube ich Dir, da hat sogar (die aktuelle) LibreOffice so seine liebe Not.

BTW:
Ich habe mich mit fpSearch beschäftigt, muss es aber erst weiter Testen, wäre aber eine solche Erweiterung denkbar ? Noch nicht ganz fertig, da aktuell nur Suche, das replace sehe ich mir gerade an !

Code: Alles auswählen

 
 source/common/fpssearch.pas | 11 ++++++++---
 source/common/fpstypes.pas  |  2 +-
 2 files changed, 9 insertions(+), 4 deletions(-)
 
diff --git a/source/common/fpssearch.pas b/source/common/fpssearch.pas
index 080cb18..3a4cf83 100644
--- a/source/common/fpssearch.pas
+++ b/source/common/fpssearch.pas
@@ -454,9 +454,14 @@ var
   celltxt: String;
 begin
   cell := AWorksheet.FindCell(ARow, ACol);
-  if cell <> nil then
-    celltxt := AWorksheet.ReadAsText(cell) else
-    celltxt := '';
+  if (soSearchInComment in FSearchParams.Options) then
+    if cell <> nil then
+      celltxt := AWorksheet.ReadComment(cell) else
+      celltxt := ''
+  else
+    if cell <> nil then
+      celltxt := AWorksheet.ReadAsText(cell) else
+      celltxt := '';
 
   if soRegularExpr in FSearchParams.Options then
     Result := FRegEx.Exec(celltxt)
diff --git a/source/common/fpstypes.pas b/source/common/fpstypes.pas
index 5bcef29..ebae23c 100644
--- a/source/common/fpstypes.pas
+++ b/source/common/fpstypes.pas
@@ -830,7 +830,7 @@ type
 
   {@@ Search option }
   TsSearchOption = (soCompareEntireCell, soMatchCase, soRegularExpr, soAlongRows,
-    soBackward, soWrapDocument, soEntireDocument);
+    soBackward, soWrapDocument, soEntireDocument, soSearchInComment);
 
   {@@ A set of search options }
   TsSearchOptions = set of TsSearchOption;
 
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: fpspreadsheet - Kleinere Fragen

Beitrag von wp_xyz »

SearchInComment geht nun so, wie von dir vorgeschlagen.

Ja, Spalten und Zeilen kann fpspreadsheet bisher NICHT ausblenden. Du kannst höchstens die Spaltenbreite/Zeilenhöhe auf 0 setzen (aber dann gibt es im GUI die Gefahr, dass der User diese mit der Maus im Spalten/Zeilenkopf wieder aufzieht).

Antworten