fpspreadsheet - Kleinere Fragen

Rund um die LCL und andere Komponenten

fpspreadsheet - Kleinere Fragen

Beitragvon af0815 » 21. Jun 2017, 14:15 fpspreadsheet - Kleinere Fragen

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).
af0815
 
Beiträge: 3266
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon wp_xyz » 21. Jun 2017, 14:35 Re: fpspreadsheet - Kleinere Fragen

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

Beitragvon af0815 » 21. Jun 2017, 20:23 Re: fpspreadsheet - Kleinere Fragen

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).
af0815
 
Beiträge: 3266
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon wp_xyz » 21. Jun 2017, 21:03 Re: fpspreadsheet - Kleinere Fragen

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

Beitragvon af0815 » 21. Jun 2017, 21:49 Re: fpspreadsheet - Kleinere Fragen

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).
af0815
 
Beiträge: 3266
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon wp_xyz » 21. Jun 2017, 22:59 Re: fpspreadsheet - Kleinere Fragen

formulamacros.zip
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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
wp_xyz
 
Beiträge: 2280
Registriert: 8. Apr 2011, 08:01

Beitragvon af0815 » 22. Jun 2017, 06:06 Re: fpspreadsheet - Kleinere Fragen

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).
af0815
 
Beiträge: 3266
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon wp_xyz » 22. Jun 2017, 11:29 Re: fpspreadsheet - Kleinere Fragen

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

Kein Problem
wp_xyz
 
Beiträge: 2280
Registriert: 8. Apr 2011, 08:01

Beitragvon af0815 » 26. Jun 2017, 15:18 Re: fpspreadsheet - Kleinere Fragen

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).
af0815
 
Beiträge: 3266
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon wp_xyz » 26. Jun 2017, 15:54 Re: fpspreadsheet - Kleinere Fragen

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

Beitragvon af0815 » 26. Jun 2017, 20:40 Re: fpspreadsheet - Kleinere Fragen

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).
af0815
 
Beiträge: 3266
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon af0815 » 27. Jun 2017, 08:53 Re: fpspreadsheet - Kleinere Fragen

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
fpspread01.JPG


Excel Online
fpspread02.JPG


fpSpreadSheet
fpspread03.JPG
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
af0815
 
Beiträge: 3266
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon wp_xyz » 27. Jun 2017, 09:12 Re: fpspreadsheet - Kleinere Fragen

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

Beitragvon af0815 » 27. Jun 2017, 09:39 Re: fpspreadsheet - Kleinere Fragen

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).
af0815
 
Beiträge: 3266
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: Win7/Linux (L stable FPC stable) per fpcup | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon wp_xyz » 27. Jun 2017, 10:24 Re: fpspreadsheet - Kleinere Fragen

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

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried