JasperReports - Çapraz Tablolar
Çapraz tablo (çapraz tablo) raporları, verileri tablo biçiminde satırlar ve sütunlar arasında düzenleyen tabloları içeren raporlardır. Çapraz tablo nesnesi, ana rapora bir çapraz tablo raporu eklemek için kullanılır. Çapraz tablolar herhangi bir veri düzeyiyle (nominal, sıra, aralık veya oran) kullanılabilir ve genellikle rapor değişkenlerinde bulunan özetlenmiş verileri dinamik bir tablo biçiminde görüntüler. Değişkenler, toplamlar, sayımlar, ortalama değerler gibi toplu verileri görüntülemek için kullanılır.
Çapraz Tablo Özellikleri
JRXML öğesi <crosstab> bir rapora bir çapraz tablo eklemek için kullanılır.
Öznitelik
Aşağıdaki bir <özniteliğinin listesidircrosstab> öğe -
isRepeatColumnHeaders- Bir sayfa sonundan sonra sütun başlıklarının yeniden yazdırılıp yazdırılmayacağını belirtir. Varsayılan değer doğrudur .
isRepeatRowHeaders- Satır başlıklarının bir çapraz tablo sütun sonundan sonra yeniden yazdırılıp yazdırılmayacağını belirtir. Varsayılan değer doğrudur .
columnBreakOffset- Bir sütun kırılması oluştuğunda, aynı sayfada bir öncekinin altına yerleştirilecek sonraki çapraz tablo parçasından önce piksel cinsinden ölçülen dikey boşluk miktarını gösterir. Varsayılan değer 10'dur.
runDirection- Çapraz tablo verilerinin soldan sağa mı (LTR) yoksa sağdan sola mı (RTL) doldurulması gerektiğini belirtir. Varsayılan değer LTR'dir.
ignoreWidth- Çapraz tablonun başlangıçtaki çapraz tablo genişliği sınırını aşıp aşmayacağını ve sütun sonları oluşturmayacağını belirtir. Aksi takdirde, çapraz tablo genişliği sınırı içindeki sütunları oluşturmayı durdurur ve kalan sütunlarla yalnızca tüm satırlar oluşturulmaya başladıktan sonra devam eder. Varsayılan değer yanlıştır .
Alt Öğeler
Bir <crosstab> öğesi aşağıdaki alt öğelere sahiptir -
<reportElement>- Bu öğe, kapsamı içinde çapraz tablonun konumunu, genişliğini ve yüksekliğini tanımlar. Bu öğenin öznitelikleri, tüm standart <reportElement> özniteliklerini içerir.
<crosstabParameter>- Bu öğe, rapor değişkenlerine ve parametrelere çapraz tablo içinden erişmek için kullanılır. Bu öğenin nitelikleri şunları içerir -
isim - Bu, parametre adını tanımlar.
class - Bu, parametre sınıfını gösterir.
<parametersMapExpression>- Bu öğe, çapraz tablo için bir dizi parametre olarak java.util.Map örneğini içeren bir rapor değişkenini veya parametresini iletmek için kullanılır . Bu eleman hiçbir nitelik içermez.
<crosstabDataset>- Bu öğe, çapraz tabloyu doldurmak için kullanılacak veri kümesini tanımlar (ayrıntılı açıklama için sonraki bölüme bakın). Bu öğenin nitelikleri şunları içerir -
isDataPreSorted - Bu, veri kümesindeki verilerin önceden sıralanmış olup olmadığını gösterir. Varsayılan değer yanlıştır .
<crosstabHeaderCell>- Bu öğe, çapraz tablonun sol üst köşesinde bulunan ve sütun başlıklarının ve satır başlıklarının birleştiği bölgede bulunan bölgenin içeriğini tanımlar. Bu hücrenin boyutu, tanımlanan satır ve sütun genişlikleri ve yüksekliklerine göre otomatik olarak hesaplanır.
<rowGroup>- Bu öğe, verileri satırlara ayırmak için kullanılan bir grubu tanımlar. Bu öğenin nitelikleri şunları içerir -
isim - Bu, satır grubunun adını tanımlar.
genişlik - Bu, satır grubunun genişliğini tanımlar.
headerPosition - Bu, başlık içeriklerinin konumunu tanımlar (Üst, Orta, Alt, Geniş).
totalPosition - Bu, tüm sütunun konumunu tanımlar (Başlangıç, Bitiş, Yok).
Bu öğe, aşağıdaki alt öğeleri içerir -
<bucket>
<crosstabRowHeader>
<crosstabTotalRowHeader>
<columnGroup>- Bu öğe, verileri sütunlara ayırmak için kullanılan bir grubu tanımlar. Bu öğenin nitelikleri şunları içerir -
name - Bu, sütun grubu adını tanımlar.
yükseklik - Bu, sütun grubu başlığının yüksekliğini tanımlar.
headerPosition - Bu, başlık içeriklerinin konumunu tanımlar ( Sağ, Sol, Orta, Uzat ).
totalPosition - Bu, tüm sütunun konumunu tanımlar ( Başlangıç, Bitiş, Yok ).
Bu öğe, aşağıdaki alt öğeleri içerir -
<bucket>
<crosstabColumnHeader>
<crosstabTotalColumnHeader>
<measure>- Bu eleman, satırlar ve sütunlar arasında yapılacak hesaplamayı tanımlar. Bu öğenin nitelikleri şunları içerir -
name - Bu, ölçü adını tanımlar.
class - Bu, ölçü sınıfını gösterir.
hesaplama - Bu, çapraz tablo hücre değerleri arasında yapılacak hesaplamayı gösterir. Değerleri şunlardan herhangi biri olabilir - Nothing, Count, DistinctCount, Sum, Average, En Düşük, En Yüksek, Standart Sapma, Varyans ve İlk . Varsayılan değerNothing.
<crosstabCell>- Bu öğe, başlık olmayan hücrelerdeki verilerin nasıl düzenleneceğini tanımlar. Bu öğenin nitelikleri şunları içerir -
columnTotalGroup - Bu, sütun toplamını hesaplamak için kullanılacak grubu gösterir.
yükseklik - Bu, hücrenin yüksekliğini tanımlar.
rowTotalGroup - Bu, satır toplamını hesaplamak için kullanılacak grubu gösterir.
genişlik - Bu, hücrenin genişliğini tanımlar.
<whenNoDataCell>- Bu öğe, boş bir çapraz tablo hücresinde neyin görüntüleneceğini tanımlar. Bu eleman hiçbir nitelik içermez.
Çaprazda Veri Gruplama
Çapraz tablo hesaplama motoru, ilişkili veri kümesi kayıtlarını yineleyerek verileri toplar. Verileri bir araya getirmek için önce onları gruplamak gerekir. Bir çapraz tabloda, satırlar ve sütunlar, adı verilen belirli grup öğelerini temel alır.buckets. Bir kova tanımı şunları içermelidir -
packExpression - Veri grubu öğelerini elde etmek için değerlendirilecek ifade.
comparatorExpression - Değerlerin doğal sıralanmasının en iyi seçim olmaması durumunda gereklidir.
orderByExpression - Verileri sıralamak için kullanılan değeri gösterir.
Çapraz tablodaki satır ve sütun grupları (yukarıda tanımlanmıştır), buckets.
Yerleşik Çapraz Tablo Toplam Değişkenleri
Aşağıda mevcut ölçü değerinin bir listesi bulunmaktadır ve hücreye karşılık gelen farklı seviyelerin toplamlarına aşağıdaki şemaya göre adlandırılan değişkenler aracılığıyla erişilebilir -
Bir ölçü hesaplamasının mevcut değeri, ölçü ile aynı adı taşıyan bir değişkende saklanır.
<Ölçü> _ <Sütun Grubu> _ALL - Bu, aynı satırdaki sütun grubundaki tüm girişlerin toplamını verir.
<Ölçü> _ <Satır Grubu> _ALL - Bu, aynı sütundaki satır grubundaki tüm girişlerin toplamını verir.
<Ölçü> _ <Satır Grubu> _ <Sütun Grubu> _ALL - Bu, hem satır hem de sütun gruplarındaki tüm girişlere karşılık gelen birleşik toplamı verir.
Misal
Çapraz tabloları göstermek için yeni bir rapor şablonu (jasper_report_template.jrxml) yazalım. Burada çapraz tabloyu özet bölümüne ekleyeceğiz. Dizine kaydedinC:\tools\jasperreports-5.0.1\test. Dosyanın içeriği aşağıdaki gibidir -
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name = "jasper_report_template" language = "groovy" pageWidth = "595"
pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
topMargin = "20" bottomMargin = "20">
<parameter name = "ReportTitle" class = "java.lang.String"/>
<parameter name = "Author" class = "java.lang.String"/>
<field name = "name" class = "java.lang.String"/>
<field name = "country" class = "java.lang.String"/>
<title>
<band height = "70">
<line>
<reportElement x = "0" y = "0" width = "515" height = "1"/>
</line>
<textField isBlankWhenNull = "true" bookmarkLevel = "1">
<reportElement x = "0" y = "10" width = "515" height = "30"/>
<textElement textAlignment = "Center">
<font size = "22"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{ReportTitle}]]>
</textFieldExpression>
<anchorNameExpression>
<![CDATA["Title"]]>
</anchorNameExpression>
</textField>
<textField isBlankWhenNull = "true">
<reportElement x = "0" y = "40" width = "515" height = "20"/>
<textElement textAlignment = "Center">
<font size = "10"/>
</textElement>
<textFieldExpression class = "java.lang.String">
<![CDATA[$P{Author}]]>
</textFieldExpression>
</textField>
</band>
</title>
<summary>
<band height = "60">
<crosstab>
<reportElement width = "782" y = "0" x = "0" height = "60"/>
<rowGroup name = "nameGroup" width = "100">
<bucket>
<bucketExpression class = "java.lang.String">
<![CDATA[$F{name}]]>
</bucketExpression>
</bucket>
<crosstabRowHeader>
<cellContents>
<box border = "Thin" borderColor = "black"/>
<textField>
<reportElement width = "100" y = "0" x = "0" height = "20"/>
<textElement textAlignment = "Right"
verticalAlignment = "Middle"/>
<textFieldExpression>
<![CDATA[$V{nameGroup}]]>
</textFieldExpression>
</textField>
</cellContents>
</crosstabRowHeader>
</rowGroup>
<columnGroup name = "countryGroup" height = "20">
<bucket>
<bucketExpression class = "java.lang.String">
$F{country}
</bucketExpression>
</bucket>
<crosstabColumnHeader>
<cellContents>
<box border = "Thin" borderColor = "black"/>
<textField isStretchWithOverflow = "true">
<reportElement width = "60" y = "0" x = "0" height = "20"/>
<textElement verticalAlignment = "Bottom"/>
<textFieldExpression>
<![CDATA[$V{countryGroup}]]>
</textFieldExpression>
</textField>
</cellContents>
</crosstabColumnHeader>
</columnGroup>
<measure name = "tailNumCount" class = "java.lang.Integer"
calculation = "Count">
<measureExpression>$F{country}</measureExpression>
</measure>
<crosstabCell height = "20" width = "60">
<cellContents backcolor = "#FFFFFF">
<box borderColor = "black" border = "Thin"/>
<textField>
<reportElement x = "5" y = "0" width = "55" height = "20"/>
<textElement textAlignment = "Left"
verticalAlignment = "Bottom"/>
<textFieldExpression class = "java.lang.Integer">
$V{tailNumCount}
</textFieldExpression>
</textField>
</cellContents>
</crosstabCell>
</crosstab>
</band>
</summary>
</jasperReport>
Yukarıdaki dosyanın detayları aşağıdaki gibidir -
Çapraz, <crosstab> öğesi tarafından tanımlanır.
<rowGroup> öğesi, verileri satırlara ayırmak için bir grup tanımlar. Burada, her satır farklı bir ad için verileri gösterecektir.
<bucket> ve <bucketExpression> öğeleri, <rowGroup> için grup sınırlayıcı olarak hangi rapor ifadesinin kullanılacağını tanımlar. Burada satırları isme göre ayırmak için ad alanını sınırlayıcı olarak kullandık.
<crosstabRowHeader> öğesi, bir satır başlığı olarak kullanılacak ifadeyi tanımlar. Çapraz tablonun içinde bir iç bant gibi davranan tek bir alt öğe, yani <cellContents> içerir. <crosstabRowHeader> içindeki metin alanı için değişken adı tanımlamak yerine, adı <rowGroup> a (name niteliği aracılığıyla) atadık, dolayısıyla örtük bir değişken yaratır. <crosstabRowHeader> öğesi, tüm satır için başlık hücresinin içeriğini tanımlar. Tek alt öğesi olarak tek bir <cellContents> öğesini alır.
<columnGroup> öğesi ve onun alt öğeleri, satırlar yerine sütunları etkilemesi dışında <rowGroup> öğesine benzer.
<measure> öğesi, satırlar ve sütunlar arasında yapılacak hesaplamayı tanımlar. Hesaplama özelliği ayarlanır Sayısı .
<crosstabCell> öğesi, başlık olmayan hücrelerdeki verilerin nasıl yerleştirileceğini tanımlar. Bu öğe ayrıca, tek alt öğesi olarak tek bir <crosstabCell> öğesi içerir.
Rapor doldurma için java kodları değişmeden kalır. Dosyanın içeriğiC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java aşağıda verildiği gibidir -
package com.tutorialspoint;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class JasperReportFill {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
String sourceFileName =
"C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
DataBeanList DataBeanList = new DataBeanList();
ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
JRBeanCollectionDataSource beanColDataSource =
new JRBeanCollectionDataSource(dataList);
Map parameters = new HashMap();
/**
* Passing ReportTitle and Author as parameters
*/
parameters.put("ReportTitle", "List of Contacts");
parameters.put("Author", "Prepared By Manisha");
try {
JasperFillManager.fillReportToFile(
sourceFileName, parameters, beanColDataSource);
} catch (JRException e) {
e.printStackTrace();
}
}
}
POJO dosyasının içeriği C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java aşağıdaki gibidir -
package com.tutorialspoint;
public class DataBean {
private String name;
private String country;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
Dosyanın içeriği C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java aşağıdaki gibidir -
package com.tutorialspoint;
import java.util.ArrayList;
public class DataBeanList {
public ArrayList<DataBean> getDataBeanList() {
ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();
dataBeanList.add(produce("Manisha", "India"));
dataBeanList.add(produce("Dennis Ritchie", "USA"));
dataBeanList.add(produce("V.Anand", "India"));
dataBeanList.add(produce("Shrinath", "California"));
return dataBeanList;
}
/**
* This method returns a DataBean object,
* with name and country set in it.
*/
private DataBean produce(String name, String country) {
DataBean dataBean = new DataBean();
dataBean.setName(name);
dataBean.setCountry(country);
return dataBean;
}
}
Rapor oluşturma
Ardından, yukarıdaki dosyaları normal ANT oluşturma sürecimizi kullanarak derleyip yürütelim. Build.xml dosyasının içeriği (C: \ tools \ jasperreports-5.0.1 \ test dizini altına kaydedilmiştir) aşağıda verilmiştir.
İçe aktarma dosyası - baseBuild.xml, Ortam Kurulumu bölümünden alınır ve build.xml ile aynı dizine yerleştirilmelidir.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview the
report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</target>
<target name = "compilereportdesing" description = "Compiles the JXML file and
produces the .jasper file.">
<taskdef name = "jrc" classname = "net.sf.jasperreports.ant.JRAntCompileTask">
<classpath refid = "classpath" />
</taskdef>
<jrc destdir = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Ardından komut satırı penceresini açalım ve build.xml'nin bulunduğu dizine geçelim. Son olarak, komutu yürütünant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport varsayılan hedeftir) aşağıdaki gibi -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
clean-sample:
[delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
compile:
[mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
[javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
warning: 'includeantruntime' was not set, defaulting to
[javac] Compiling 3 source files to C:\tools\jasperreports-5.0.1\test\classes
compilereportdesing:
[jrc] Compiling 1 report design files.
[jrc] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
[jrc] log4j:WARN Please initialize the log4j system properly.
[jrc] log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig
for more info.
[jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
[echo] Runnin class : com.tutorialspoint.JasperReportFill
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnvironment).
[java] log4j:WARN Please initialize the log4j system properly.
viewFillReport:
[java] log4j:WARN No appenders could be found for logger (
net.sf.jasperreports.extensions.ExtensionsEnvironment).
[java] log4j:WARN Please initialize the log4j system properly.
BUILD SUCCESSFUL
Total time: 20 minutes 53 seconds
Yukarıdaki derlemenin bir sonucu olarak, aşağıda verilen ekranda gösterildiği gibi bir JasperViewer penceresi açılır -
Burada her ülkenin ve ismin tablo halinde verildiğini görüyoruz.