W niektórych przypadkach konieczna jest dodatkowa kontrola nad zawartością komórek, np. potrzeba wykrywania przekroczenia wartości granicznych, niestandardowa reakcja na niepoprawne wartości, potrzeba nietypowej generacji treści komórki. W takim przypadku można zastosować mechanizm funkcji generacji treści komórek, który zostanie omówiony w tym rozdziale. Celem przykładowego skryptu jest uzyskanie poniższej tabeli, w której przekroczenie wartości granicznej jest sygnalizowane dodaniem do wartości znaku ! oraz zmianą koloru komórki.
Rys. Tabela z kontrolą zawartości komórek.
C# |
using System; using Askom.AsixEvo.Scripting; using MigraDoc.DocumentObjectModel; using MigraDoc.DocumentObjectModel.Shapes; using MigraDoc.DocumentObjectModel.Shapes.Charts; public class VertTable : IScript
{
public bool Initialize(string[] aParameters, IApplication aApplication)
{
try
{
DateTime reportDate = DateTime.Parse(aParameters[0]).Date;
string outputFile = aParameters[1];
Report report = aApplication.CreateReport();
// Define standard and custom styles report.SetStyle(ReportStyleStandardNames.TableHeader, "Calibri", 12, Colors.Blue, true, true, ParagraphAlignment.Center, Colors.LightYellow); report.SetStyle(ReportStyleStandardNames.TableRow, "Calibri", 10, Colors.Blue, false, false, ParagraphAlignment.Right, Colors.Gray); report.SetStyle(ReportStyleStandardNames.TableAltRow, "Calibri", 10, Colors.Blue, false, false, ParagraphAlignment.Right, Colors.DarkGray); report.SetStyle("OverLimit", "Calibri", 10, Colors.Red, false, false, ParagraphAlignment.Right, Colors.Yellow); // Build table ReportTable vt = report.AddVerticalTable(true);
vt.LeftIndent(10);
vt.AddColumn("Godzina", ReportTable.StartTimeColumn, null, 40, null, ReportTableCellErrorBehavior.Normal, null); vt.AddColumn("V1 średnia", "sym01", "average", 30, "f2",
ReportTableCellErrorBehavior.Empty, CheckLimit);
vt.AddColumn("V1 minimum", "sym01", "min", 30, "f2", ReportTableCellErrorBehavior.Empty, null); vt.AddColumn("V1 maksimum", "sym01", "max", 30, "f2", ReportTableCellErrorBehavior.Empty, null);
vt.SetEdgeStyle(ReportTableEdgeType.Columns, Colors.Cyan);
vt.SetQueryData(reportDate, reportDate.AddDays(1), "3H");
report.Render(outputFile);
}
catch (Exception e)
{
aApplication.ReportMessage(EvoMessageType.Error,
"Error generating report: " + e.ToString());
}
return true;
}
bool CheckLimit(ReportTableCell c)
{
if ((c.ValueStatus & Askom.Ascent.StatusOpc.QualityMask) ==
Askom.Ascent.StatusOpc.Good &&
c.RawValue != null && (double)c.RawValue >= 24)
{
c.Content = "! " + c.Content; c.Style = "OverLimit";
}
return false; } public void FinalizeScript() {
}
}
|
VB |
Imports System Imports Askom.AsixEvo.Scripting Imports MigraDoc.DocumentObjectModel Imports MigraDoc.DocumentObjectModel.Shapes Imports MigraDoc.DocumentObjectModel.Shapes.Charts Public Class VertTableVb Implements IScript Public Function Initialize(ByVal aParameters() As String, ByVal aApplication As _ IApplication) As Boolean Implements IScript.Initialize Try Dim reportDate As DateTime = DateTime.Parse(aParameters(0)).Date Dim outputFile As String = aParameters(1) Dim report As Report = aApplication.CreateReport() ' Define standard And custom styles report.SetStyle(ReportStyleStandardNames.TableHeader, "Calibri", 12, Colors.Blue,_ True, True, ParagraphAlignment.Center, Colors.LightYellow) report.SetStyle(ReportStyleStandardNames.TableRow, "Calibri", 10, Colors.Blue,_ False, False, ParagraphAlignment.Right, Colors.Gray) report.SetStyle(ReportStyleStandardNames.TableAltRow, "Calibri", 10, Colors.Blue,_ False, False, ParagraphAlignment.Right, Colors.DarkGray) report.SetStyle("OverLimit", "Calibri", 10, Colors.Red, False, False, _ ParagraphAlignment.Right, Colors.Yellow) ' Build table Dim vt As ReportTable = report.AddVerticalTable(True)
vt.LeftIndent(10)
vt.AddColumn("Godzina", ReportTable.StartTimeColumn, Nothing, 40, Nothing, _ ReportTableCellErrorBehavior.Normal, Nothing) vt.AddColumn("V1 średnia", "sym01", "average", 30, "f2", _ ReportTableCellErrorBehavior.Empty, AddressOf CheckLimit) vt.AddColumn("V1 minimum", "sym01", "min", 30, "f2", _ ReportTableCellErrorBehavior.Empty, Nothing) vt.AddColumn("V1 maksimum", "sym01", "max", 30, "f2", _ ReportTableCellErrorBehavior.Empty, Nothing)
vt.SetEdgeStyle(ReportTableEdgeType.Columns, Colors.Cyan)
vt.SetQueryData(reportDate, reportDate.AddDays(1), "3H")
report.Render(outputFile)
Catch e As Exception
aApplication.ReportMessage(EvoMessageType.Error, _
"Error generating report: " + e.ToString()) End Try Return True End Function Function CheckLimit(c As ReportTableCell) As Boolean If ((c.ValueStatus And Askom.Ascent.StatusOpc.QualityMask) = _ Askom.Ascent.StatusOpc.Good And _ c.RawValue IsNot Nothing And CType(c.RawValue, Double) >= 24) Then c.Content = "! " + c.Content c.Style = "OverLimit" End If Return False End Function Public Sub FinalizeScript() Implements IScript.FinalizeScript End Sub End Class |
Przykładowy kod to modyfikacja skryptu generującego tabelę pionową. Zmienione fragmenty zostały oznaczone wytłuszczoną czcionką.
Pierwszy nowy element to dodanie stylu OverLimit, który będzie używany w komórkach z przekroczoną wartością. Druga nowość to użycie w jednym z wywołań metody AddColumn odwołania do funkcji CheckLimit.
Najważniejszą częścią skryptu jest treść funkcji CheckLimit. Funkcja ta jest wywoływana dla każdej komórki kolumny, a w wywołaniu przekazywany jest jej obiekt klasy ReportTableCell. Poprzez ten obiekt funkcja uzyskuje dostęp do danych opisujących komórkę. Obiekt służy także do zmiany zawartości komórki.
W typowych scenariuszach funkcja kontroli zawartości komórki używa pól ValueStatus i RawValue obiektu ReportTableCell do podjęcia decyzji dotyczącej ewentualnej ingerencji w zawartość komórki. Pola te przechowują status wartości i oryginalną wartość numeryczną komórki (w tym przypadku pochodzącą z zapytania o dane archiwalne). W przypadku gdy zachodzi konieczność zmiany zawartości komórki, można to wykonać przez ustawienie w polu Style nowej nazwy stylu i w polu Content nowej tekstowej treści komórki. Pole Content w momencie wywołania funkcji jest ustawione na treść, która byłaby umieszczona w komórce, gdyby nie była użyta funkcja kontroli. W przykładowym kodzie wykorzystano to, żeby wyświetlić standardową zawartość z dodanym znakiem wykrzyknika. Zwrócenie wartości false oznacza, że system generacji ma wygenerować treść komórki w sposób normalny, ale z ewentualnym wykorzystaniem zmienionych pól Content i Style.
Bardziej zaawansowaną metodą zmiany treści komórki jest własna generacja kompletnej zawartości, wykorzystując obiekt bazowy komórki (dostępny poprzez właściwość MigraCell) oraz jego metody. Ten tryb pozwala na większy wpływ na postać komórki (np. dodanie obrazka), ale wymaga działania bezpośrednio na obiektach i metodach biblioteki MigraDoc. Jeżeli funkcja kontroli zawartości komórki tworzy treść bezpośrednio, to musi ona zwrócić wartość true.