Tworzenie spersonalizowanych raportów

Możliwe jest tworzenie spersonalizowanych raportów. Każde dane mogą być wyeksportowane do arkusza kalkulacyjnego lub dokumentu tekstowego z zastosowaniem styli, obrazów, tabel oraz zasad formatowania. Możliwe jest także użycie wykresów dla wyeksportowanych danych. Ten podrozdział opisuje jak tworzyć spersonalizowane raporty.

Tworzenie oraz praca z arkuszami kalkulacyjnymi

The MS Office and OpenOffice programs korzystają z tego samego API dlatego oddzielny opis nie jest konieczny. Pakiety MS Office oraz OpenOffice

Tworzenie nowego arkusza kalkulacyjnego jest łatwe. Poniższy skrypt przedstawia jak to zrobić

spreadsheet = Office.createSpreadsheet()

Dokumenty arkuszy kalkulacyjnych mogą być użyte w celu wykonania zadań w listy poniżej.

Tabela 5.2. Metody dla obiektów arkuszy kalkulacyjnych

Zadanie Użycie metody
Umieszczenie danych tekstowych w pojedyńczej komórce
setCellValue(columnIndex, rowIndex, "text")
Umieszczenie wartości liczbowych w pojedyńczej komórce
setCellValue(columnIndex, rowIndex, number)
Umieszczenie formuły w pojedyńczej komórce
setCellValue(columnIndex, rowIndex, "formula")
Umieszczenie tablicy w pojedyńczej komórce
setCellValue(columnIndex, rowIndex, dataArray)
Formuły nie mogą być umieszczne w ten sposób.
Określenie zakresu komórek
setStyle(spreadsheet.getCellRangeByName("cell-range"), spreadsheet.headerStyle)
Zobacz także Komórki oraz zakres komórek oraz Predefiniowanie styli.
Scalanie zakresu komórek
mergeCells(spreadsheet.getCellRangeByName("cell-range"))
Zobacz także Komórki oraz zakres komórek.
Zwiekszenie wcięcia zawartości z zakresu komórek
incrementIndent(spreadsheet.getCellRangeByName("cell-range"), indentationLevel)
Zobacz także Komórki oraz zakres komórek.
Zmniejszenie wcięcia zawartości z zakresu komórek
decrementIndent(spreadsheet.getCellRangeByName("cell-range"), indentationLevel)
Zobacz także Komórki oraz zakres komórek.
Ustawienie szerokości komórki
setColumnWidth(columnIndex, newColumnWidth)
Ustawienie optymalnej szerokości komórki
setOptimalColumnWidth(columnIndex)
Wstawianie wykresów zobacz Wstawianie Wykresów
Wstawianie tabeli przestawnej zobacz Wstawianie Tabeli Przestawnej
Wstawianie nowego aktywnego arkusza zobacz Zarządzanie Arkuszami

Notatka

MS Office korzysta z lokalnych nazw formuł, a OpenOffice nie, co ma wpływ na formuły jak SUM, MEAN, itd.

Wszystkie powyższe metody powinny być wywoływane jak w przykładzie poniżej:

spreadsheet.method(Parametr1, Parametr2, ... )

Gdy spreadsheet jest obiektem arkusza utworzonego za pomocą: SpreadsheetWrapper(officeConnection.createSpreadsheetDocument())

Patrz na podstawowe przykłady poniżej:

# Tworzenie obiektu dokumentu arkusza
spreadsheet = Office.createSpreadsheet()

# Wstawienie danych tekstowych w komórkę A1
spreadsheet.setCellValue(0,0, "Przykładowy tekst")

# Wstawienie zmiennoprzecinkowej liczby w komórkę A2
spreadsheet.setCellValue(0,1, 12.5)

# Wstawienie liczby całkowitej w komórkę A3
spreadsheet.setCellValue(0,2, 100)

# Wstawienie formuły z stylem headerStyle w komórkę A4
spreadsheet.setCellValue(0,3, "=A2*A3", spreadsheet.headerStyle)
            

Eksportowanie danych do arkusza

Tabela może być wyeksportowana do arkusza dla dalszego przetwarzania. AdvancedMiner dostarcza metodę readTable, która wczytuje tabelę do pamięci jako dwuwymiarową tablicę. Tablica może być wykorzystana do wyeksportowania danych do arkusza. Jest to szybkim sposobem. (kod poniżej jest częścią skryptu instruktarzowego openoffice_import_data_PL.gy)

Starsze wersje arkuszy kalkulacyjnych posiadały ograniczenie liczby wierszy do 65000 oraz do 256 kolumn. MS Excel począwszy od wersji 2007 limity ma zwiększone do ponad miliona wierszy oraz szesnastu tysięcy kolumn.

Przykład 5.1. Eksportowanie danych do arkusza

# After the connection is established a new spreadsheet document
# is created
spreadsheet = Office.createSpreadsheet()

# Create a new table using the standard table procedure
table 'openoffice_test1':
    a   b   c   d   e
    1   1   2   3   'ABC'
    2   2   1   3   'ABC'
    4   4   2   1   'DEF'
    1   1   2   3   'ABC'
    2   2   1   3   'ABC'
    4   4   2   1   'DEF'
    1   1   2   3   'ABC'
    2   2   1   3   'ABC'
    4   4   2   1   'DEF'

# Now the table is available in the database, so we can import
# it into OpenOffice

# At first write the header...
spreadsheet.setCellValue(0, 0, 'a')
spreadsheet.setCellValue(1, 0, 'b')
spreadsheet.setCellValue(2, 0, 'c')
spreadsheet.setCellValue(3, 0, 'd')
spreadsheet.setCellValue(4, 0, 'e')

# ...and next write the data
trans None <- 'openoffice_test1':
	$spreadsheet.setCellValue(0, __rowNumber__+1, a)
	$spreadsheet.setCellValue(1, __rowNumber__+1, b)
	$spreadsheet.setCellValue(2, __rowNumber__+1, c)
	$spreadsheet.setCellValue(3, __rowNumber__+1, d)
	$spreadsheet.setCellValue(4, __rowNumber__+1, e)

# The task is done, but this is a very slow method and the user has
# to know column names
# There also is an optimized and fast method of reading a table into
# openspreadsheet.

# Add a new sheet to our spreadsheet document
sheet1 = spreadsheet.newSheet("FastImport")

# Read the table...
data = tableRead('openoffice_test1')
spreadsheet.setCellValue(0,0, data)
    

Skrypt powyżej otwiera plik z dwoma arkuszami, z których każdy zawiera dane z tabeli openoffice_test1.

Rysunek 5.2. Arkusz z danymi skopiowanymi z tabeli

Arkusz z danymi skopiowanymi z tabeli

Komórki oraz zakres komórek

Podczas pracy z arkuszami często zachodzi potrzeba zaznaczenia pojedynczej komórki lub zakresu komórek. Niektóre metody, jako parametr, również wymagają komórek lub zakresu. Pożądane zaznaczenie komórki, zakresu komórek można uzyskać w arkuszu przy użyciu następujących poleceń:

# Zaznaczenie komórki po pozycji(liczone od 0)
sheet.getCellByPosition(0,0)

# Zaznaczenie zakresu komórek po nazwie
sheet.getCellRangeByName("A1:C5")

# Zaznaczenie zakresu komórek po pozycji.
sheet.getCellRangeByPosition(0, 0, 2, 4)
                

Wstawianie Wykresów

AdvancedMiner wspiera wstawianie wykresów w arkuszach kalkulacyjnych (dostępne tylko wykresy słupkowe)

Wykresy w arkuszach tworzone są przez dodanie elementu wykresu oraz konfiguracji ustawień

Przykład 5.2. Tworzenie wykresów w arkuszu

spreadsheet = Office.createSpreadsheet()

# Prepare some data to write to the active sheet
values = [ ['Value', 'Count'],
           ['5', 300],
           ['6', 102],
           ['7', 105],
           ['8', 15],
           ['9', 5],
           ['10', 45]
         ]
# Writes the prepared data array to the sheet. Begining at the cell 0,0 (A1)
spreadsheet.setCellValue(0,0, values)

# Insert the chart
chart = spreadsheet.addChart("unique_name")

# Set where the source data is
chart.setDataRanges( collection( [ spreadsheet.getCellRangeByPosition(0,0, 1, 6) ] ) )
# the data range can consist of separate ranges, so it is necessary to use collection([ range1, range2, ...]) syntax

# The position and size of the chart is defined by another cell range
chart.setPositionAndSize( spreadsheet.getCellRangeByPosition( 0, 7, 6, 14) )

# The first row is a header
chart.setFirstColumnHeader( 1 )

# The first column contains data labels, so should be treated
# as a header
chart.setFirstColumnHeader( 1 )
    

Arkusz utworzony przez ten skrypt jest widoczny poniżej.

Rysunek 5.3. Arkusz z danymi skopiowanymi z tabeli

Arkusz z danymi skopiowanymi z tabeli

Wstawianie tabeli przestawnej

AdvancedMiner dostarcza funkcjonalność wstawiania tabel przestawnych w arkuszach kalkulacyjnych.

Przykład 5.3. Tworzenie tabeli przestawnej

# After the connection is established a new spreadsheet document
# is created
spreadsheet = Office.createSpreadsheet()

# Create sample data
table 'openoffice_test1':
    a   b   c   d   e
    1   1   2   3   'ABC'
    2   2   1   3   'ABC'
    4   4   2   1   'DEF'
    1   1   2   3   'ABC'
    2   2   1   3   'ABC'
    4   4   2   1   'DEF'
    1   1   2   3   'ABC'
    2   2   1   3   'ABC'
    4   4   2   1   'DEF'

# Export the data into a spreadsheet
data = tableRead('openoffice_test1')

# Write data array into the spreadsheet
spreadsheet.setCellDataArray(0, 0, data)

# Some properties of the data pilot have to be set before it can
# be added to the spreadsheet
dpp = DataPilotProperties()

# Add column indexes which should be treated as columns
dpp.addColumn(1)
dpp.addColumn(2)
dpp.addColumn(3)

# Add a row index
dpp.addRow(0)

# Indicate which column should be used as the data for the
# data pilot
dpp.addData(4)

# Specify the source data range...
sourceCellRange = spreadsheet.getCurrentSheet().getCellRangeByPosition(0,0, 4, 9)

# ... and the destination of the inserted data pilot
destinationCell = spreadsheet.getCurrentSheet().getCellByPosition(0, 11)

# Insert the prepared data pilot
spreadsheet.insertDataPilot(dpp, sourceCellRange, destinationCell)
    

Arkusz stworzony przez ten skrypt jest widoczny poniżej.

Rysunek 5.4. Arkusz z tabelą przestawną

Arkusz z tabelą przestawną

Zarządzanie Arkuszami

W sytuacji nawiązania połączenia z pakietem narzędzi biurowych oraz nowy arkusz kalkulacyjny jest tworzony, jest on aktywny oraz bieżący co oznacza, że każda operacja jest wykonywana na tym konkretnym arkuszu. Nowy arkusz w aktywnym dokumencie jest tworzony za pomocą metody: newSheet metody. Możliwe jest przełączanie między aktywnymi arkuszami metodą: setActiveSheet. Patrz na skrypt poniżej..

# Po nawiązaniu połączenia nowy dokument arkusza kalkulacyjnego 
# jest tworzony
spreadsheet = Office.createSpreadsheet()

# Utworzenie nowego arkusza o nazwie: "My new sheet"
sheet1 = spreadsheet.newSheet("My new sheet")

# Wstawienie pewnych wartości
spreadsheet.setCellValue(0,0, 'ABC')

# Tworzenie nowego arkusza
sheet2 = spreadsheet.newSheet("Another sheet")

# Wstawienie pewnych wartości
spreadsheet.setCellValue(3, 3, 'Hello World?')

# Ponowne aktywowanie pierwszego arkusza
spreadsheet.setActiveSheet(sheet1)
                

Istotne jest zdanie sobie sprawy, że nowy arkusz stanie się widoczny i bieżący. Przełączanie pomiędzy arkuszami odbywa się za pomocą: setActiveSheet(sheetName) oraz setActiveSheet(sheetObject).

Style Predefiniowane

Obramowanie arkusza kalkulacyjnego dostarcza kilka predefiniowanych styli. Poniższa tabela przedstawia predefiniowane style.

Tabela 5.3. Style predefiniowane arkusza kalkulacyjnego

headerStyleStyl standardowy dla nagłówków
header1StyleInny styl standardowy dla nagłówków
level1StyleStyl dla pierwszego tworzonego poziomu danych
level2StyleStyl dla drugiego tworzonego poziomu danych
level3StyleStyl dla trzeciego tworzonego poziomu danych
ooStyleStyl domyślny
rowLightStyleStyl dla tworzonego wierszza z jasnym tłem
rowDarkStyleStyl dla tworzonego wierszza z ciemnym tłem
whiteStyleStyl z białym tłem
significanceStyleStyl z pogrubioną i dużą czcionką

Style te mogą być stosowane w następujących obiektach:

  • komórka - używając setCellStyle lub setCellValue

  • zakres komórek - używając setCellRangeStyle

  • wiersze, kolumny, komórki w tabelach tekstowych zastosowanych w dokumentach edytorów tekstu.

Przykład 5.4. Używanie styli predefiniowanych

spreadsheet = Office.createSpreadsheet()

# Insert a value into cell and set a predefined style
spreadsheet.setCellValue(1,1, "Some text", spreadsheet.header1Style)
    

Styl spersonalizowany

W rzeczywistości style predefiniowane są zestawem styli w postaci tablicy, dlatego możliwe jest tworzenie styli spersonalizowanych. Przedstawione jest to w poniższym przykładzie.

Przykład 5.5. Tworzenie styli spersonalizowanych

spreadsheet = Office.createSpreadsheet()

# Create an empty array for styles
oStyle = []

# Use Office.createStyle to provide a style object.
oStyle.append(Office.createStyle(OStyle.CELL_BACK_COLOR, OStyle.COLOR_RED))
oStyle.append(Office.createStyle(OStyle.FONT_SIZE, 15))
oStyle.append(Office.createStyle(OStyle.FONT_WEIGHT, 150.0))
oStyle.append(Office.createStyle(OStyle.FONT_COLOR, OStyle.COLOR_WHITE))

#Now apply the prepared style to cell value
spreadsheet.setCellValue(1,1, "Some text", oStyle)
spreadsheet.setOptimalColumnWidth(1)
    

Poniższa lista zawiera OStyle stałe oraz ich znaczenie.

  • FONT_COLOR - kolor czcionki, może być liczbą całkowitą (RGB) lub lub jednym z stałych predefiniowanych styli.

  • FONT_SIZE - rozmiar czcionki wypunktowania

  • FONT_WEIGHT - grubość czcionki. Mniej niż 100 oznacza domyślną grubośc czcionki, a więcej niż 150 oznacza czcionkę pogrubioną

  • H_JUSTIFY - używane do określenia poziomego wyrównania komórki

  • V_JUSTIFY - używane do określenia pionowego wyrównania komórki

  • BACK_COLOR - używane do ustawienia koloru tła czcionki w dokumentach tekstowych

  • CELL_BACK_COLOR - kolor tła komórki

  • COLOR_USER_DEF_1 - COLOR_USER_DEF_8 - definiowanie kolorów używanych w predefiniowanych stylach

  • COLOR_RED - kolor czerwony

  • COLOR_GREEN - kolor zielony

  • COLOR_BLUE - kolor niebieski

  • COLOR_BLACK - kolor czarny

  • COLOR_WHITE - kolor biały

Tworzenie i używanie dokumentu tekstowego

AdvancedMiner wspiera również edytory tekstu. Kod poniżej przestawia jak utworzyć dokument tekstowy.

textDocument = Office.createText()
            

Poniższa tabela przedstawia metody dla edytorów tekstu

Tabela 5.4. Metody dokumentów tekstowych

Zadanie Przykłady wywoływania metod
Podmiana tkstu w całym dokumencie
setString(text)
Dopisanie tekstu na końcu dokumentu
appendString(text)
Dopisanie tekstu na początku dokumentu
prependString(text)
ustawienia stylu czcionki
								# ustawienie koloru znaku na czerwony - kolory w formacie RGB są zdefiniowane szesnastkowo
								setCursorStyle(Office.createStyle(OStyle.FONT_COLOR, OStyle.COLOR_RED))  
								# ustawienie stylu dla grubości czcionki                                               
								setCursorStyle(Office.createStyle(OStyle.FONT_WEIGHT, 150))               
                                
Dodanie wcięcia dla akapitu
insertParagraphBreak()
Wyśrodkowanie ostatniego akapitu
centerLastParagraph()
Wyrównanie do lewej ostatniego akapitu
leftLastParagraph()
Wstawienie tabeli w dokumencie tekstowym
textTable = createTable(rowCount, columnCount)
Wstawienie danych do tabeli
setCellStringValue(textTable, "A2", "TextData")
                                
Ustawienie stylu dla całej tabeli
								# ustawienie tła tabeli na kolor ciemno szary                                    
								setTableProperty(textTable, Office.createStyle(OStyle.BACK_COLOR, 0x606060))
                                
Ustawienie stylu dla wiersza tekstu w tabeli
								# ustawienie tła wiersza trzeciego na kolor niebieski
								setRowProperty(textTable, 3, Office.createStyle(OStyle.BACK_COLOR, OStyle.COLOR_BLUE)) 
                                
Ustawienie stylu dla kolumny tekstu w tabeli
								# ustawienie tła kolumny drugiej kolor zielony
								setColumnProperty(textTable, 2, Office.createStyle(OStyle.BACK_COLOR, OStyle.COLOR_GREEN))
                                
Ustawienie stylu czcionki dla konkretnej komórki w tabeli
								# ustawienie małego rozmiaru czcionki dla komórki A1
								setCellCursorStyle(textTable, "A1", Office.createStyle(OStyle.FONT_SIZE, 8))
                                
Dodawanie obrazu
									insertImage("file://C:\gfx\graphic.jpg"),
									insertImage("http://public/graphic.gif"),
									insertImage("file:///home/user/gfx/graphic.png")
                                

Metody powinny wyłowywane być w następujący sposób:

textDocument.method(Parameter1, Paramter2, ...)

Obrazy dodawanie są do dokumentów jako linki.

Następujący przykład przedstawia podstawowe możliwości dla użycia z edytorami tekstu:

Przykład 5.6. Praca z dokumentami tekstowymi

# Create a TextWrapper object, which acts as a text document
textDocument = Office.createText()

# Write the text
textDocument.appendString('First line of text, with standard style\n')
textDocument.appendString('This line is appended\n')

# Create a new paragraph and set its alignment
textDocument.insertParagraphBreak()
textDocument.appendString('This is new paragraph - it can have a different alignment than the first one');
textDocument.centerLastParagraph()

# Create a new paragraph and set another cursor style - bold font
textDocument.insertParagraphBreak()
textDocument.setCursorStyle(Office.createStyle(OStyle.FONT_WEIGHT, 150.0))
textDocument.appendString('...THIS IS BOLD')

textDocument.insertParagraphBreak()
# Bring back normal character weight
textDocument.setCursorStyle(Office.createStyle(OStyle.FONT_WEIGHT, 100.0))

# But set a different font color
textDocument.setCursorStyle(Office.createStyle(OStyle.FONT_COLOR, OStyle.COLOR_BLUE))
textDocument.appendString("\nBLUE MAX\n")
    

Dobrą praktyką podczas używania styli jest przedefiniowanie niektórych styli, zamiast tworzenia nowych, przy każdej potrzebie ich użycia.

Przykład 5.7. Definiowanie styli spersonalizowanych dla dokumentu tekstowego

# Create a TextWrapper object, which act as spreadsheet document
textDocument = Office.createText()

# Prepare some useful styles
boldFont = Office.createStyle(OStyle.FONT_WEIGHT, 150)
normalFont = Office.createStyle(OStyle.FONT_WEIGHT, 100)
big = Office.createStyle(OStyle.FONT_SIZE, 20)
small = Office.createStyle(OStyle.FONT_SIZE, 8)

# Use the styles
textDocument.insertParagraphBreak()
textDocument.setCursorStyle(boldFont)
textDocument.appendString('...This is bold\n')

textDocument.setCursorStyle(big)
textDocument.appendString('...and BIG.\n')

textDocument.setCursorStyle(normalFont)
textDocument.appendString('This line is thin...\n')

textDocument.setCursorStyle(small)
textDocument.appendString('...and this small\n')
    

Kolejny przykład demonstruje jak wstawić tabelę w dokumencie tekstowym oraz jak ustawić style dla zawartości komórek, wierszy oraz tła tabeli.

Przykład 5.8. Praca z tabelą w dokumencie tekstowym

# Create a TextWrapper object, which act as a text document
textDocument = Office.createText()

textDocument.appendString("See the table below:\n")

# Create a table with three columns and four rows
textTable = textDocument.createTable(4, 3)

# Prepare the styles
lightRedBackground = Office.createStyle(OStyle.BACK_COLOR, 0xffe0e0)
darkGreenBackground = Office.createStyle(OStyle.BACK_COLOR, 0x408040)
whiteFontColor = Office.createStyle(OStyle.FONT_COLOR, OStyle.COLOR_WHITE)

# Set the table background to light red
textDocument.setTableProperty(textTable, lightRedBackground)

# Set the first row background to dark green color
textDocument.setRowProperty(textTable, 0, darkGreenBackground)

# Now write in the first row values using white font color
textDocument.setCellCursorStyle(textTable, "A1", whiteFontColor)
textDocument.setCellStringValue(textTable, "A1", "First column")

textDocument.setCellCursorStyle(textTable, "B1", whiteFontColor)
textDocument.setCellStringValue(textTable, "B1", "Second column")

textDocument.setCellCursorStyle(textTable, "C1", whiteFontColor)
textDocument.setCellStringValue(textTable, "C1", "Third column")