Örnek olması açısından cok basıt gırıdleri raporlayan ve pdf cıktı verebilecek bir raporlama programı olusturalım. Bunun için wpf de yeni bir proje acalım ve aşağıdaki gibi basit bir form tasarlayalım:
Projemize raporlama işlemi için gerekli proje kutuphanelerini ekleyelim. Bu kutuphaneleri buradan bulabilirsiniz. Nasıl ekleyeceğiz kısmına gelirsek, bu üç klasörü projemizin oldugu klasorun içine kopyalayalım. Daha sonra visual studio içerisindeki projemizin sol tarafında solution kısmına sağ tıklayarak add=>exıstingProject tıklayarak kopyaladıgımız klasorlerin içerisindeki 2010 surumlü .csproj uzantılı projeyi secip tmm a basalım (bunu üçü içinde yapalım) kütüphane projeleri bizim projemizin ustune eklenmiş olucak. Solution Explorer aşağıdaki gibi olacak.
Burada DocumentView bizim projemiz. bu projeye girerek refrance kısmına sağ tıklayarak bu uc projeyi referans olarak veriyoruz.
Raporu görüntüleyecek olan penceremizi olusturuyoruz(RaporGoruntule.xaml). Window turunde olan bu pencereye bir adet DocumentViewer ve birde raporu pdf olarak kaydedecek olan kaydet butonu yerleştiriyoruz.
Rapor değişkenlerini rapor haline getirecek olan FlowDocument turunde bir sayfayı projemize ekliyoruz.(Rapor.Xaml). Bir tur sinif gibi de düsünülebilir. Kendisine gelen değişkenleri kendi üzerindeki tasarlanan alanlara yerleştirerek rapor sayfası haline getirmesi için bu sayfayı düzenleyelim.
xmlns:xrd="clr-namespace:CodeReason.Reports.Document;assembly=CodeReason.Reports"
kısmını üst tarafa ekleyelim. Burda section raporda gruplandırma tablosu olarak düşünülebilir. Her bir section içindeki table' lar ise bu section içindeki tablolardir. Eğer table içinde de satır sutun gibi tablolara ihtiyaç duyarsak table içinde TableRowGroup oluşturmamaız gerekiyor . bu bir table içindeki bır satır anlamına gelir. bunu ıkı sutun haline bölmek istersek TableCell kullanarak yapabiliriz. Kodları incelediğimizde daha iyi anlaşılır. Dikkat edilmesi gereken bir diğer hususu kodların arasındaki <xrd:InlineDocumentValue PropertyName="adi" /> kısmında verilen propertyName e verdiğiniz değişken RaporGoruntule.xaml.cs de verdiğiniz değişkenle aynı olmalı. Eger tablo çizgileri, yazının buyuklugu, fontu yada rengi ile değişiklik yapmak istersek bunları table.resources kısmından yapılabilir.
Rapor.xaml kodları:
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:xrd="clr-namespace:CodeReason.Reports.Document;assembly=CodeReason.Reports"
PageHeight="29.7cm" PageWidth="21cm" ColumnWidth="21cm"
FontSize="14" FontFamily="Georgia">
<Section Padding="40,40,40,20" FontSize="12">
<Table CellSpacing="5" Margin="0,0,0,0" BorderBrush="Black" BorderThickness="0.02cm">
<Table.Resources>
<!-- Style for header/footer rows. -->
<Style x:Key="headerFooterRowStyle" TargetType="{x:Type TableRowGroup}">
<Setter Property="FontWeight" Value="DemiBold"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="Background" Value="LightGray"/>
</Style>
<!-- Style for data rows. -->
<Style x:Key="dataRowStyle" TargetType="{x:Type TableRowGroup}">
<Setter Property="FontSize" Value="12"/>
</Style>
<!-- Style for data cells. -->
<Style TargetType="{x:Type TableCell}">
<Setter Property="Padding" Value="0.1cm"/>
<Setter Property="BorderBrush" Value="Gray"/>
<Setter Property="BorderThickness" Value="0.01cm"/>
</Style>
</Table.Resources>
<Table.Columns>
<TableColumn Width="*" />
</Table.Columns>
<TableRowGroup>
<TableRow>
<TableCell>
<Paragraph FontSize="16" TextAlignment="Center">
<Bold >
<Run Text="Ögrenci Tanıma Raporu"></Run>
</Bold>
</Paragraph>
</TableCell>
</TableRow>
</TableRowGroup>
</Table>
<Table CellSpacing="5" Margin="0,0,0,0" BorderBrush="Black" BorderThickness="0.02cm">
<Table.Resources>
<!-- Style for header/footer rows. -->
<Style x:Key="headerFooterRowStyle" TargetType="{x:Type TableRowGroup}">
<Setter Property="FontWeight" Value="DemiBold"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="Background" Value="LightGray"/>
</Style>
<!-- Style for data rows. -->
<Style x:Key="dataRowStyle" TargetType="{x:Type TableRowGroup}">
<Setter Property="FontSize" Value="12"/>
</Style>
<!-- Style for data cells. -->
<Style TargetType="{x:Type TableCell}">
<Setter Property="Padding" Value="0.1cm"/>
<Setter Property="BorderBrush" Value="Gray"/>
<Setter Property="BorderThickness" Value="0.01cm"/>
</Style>
</Table.Resources>
<Table.Columns>
<TableColumn Width="*" />
<TableColumn Width="*" />
</Table.Columns>
<TableRowGroup>
<TableRow>
<TableCell>
<Paragraph FontSize="12" TextAlignment="Right">
<Bold >
<Run Text="Adı: "></Run>
</Bold>
</Paragraph>
</TableCell>
<TableCell>
<Paragraph FontSize="12" TextAlignment="Left">
<xrd:InlineDocumentValue PropertyName="adi" />
</Paragraph>
</TableCell>
</TableRow>
</TableRowGroup>
<TableRowGroup>
<TableRow>
<TableCell>
<Paragraph FontSize="12" TextAlignment="Right">
<Bold >
<Run Text="Soyadi: "></Run>
</Bold>
</Paragraph>
</TableCell>
<TableCell>
<Paragraph FontSize="12" TextAlignment="Left">
<xrd:InlineDocumentValue PropertyName="soyadi" />
</Paragraph>
</TableCell>
</TableRow>
</TableRowGroup>
<TableRowGroup>
<TableRow>
<TableCell>
<Paragraph FontSize="12" TextAlignment="Right">
<Bold >
<Run Text="Üniversite: "></Run>
</Bold>
</Paragraph>
</TableCell>
<TableCell>
<Paragraph FontSize="12" TextAlignment="Left">
<xrd:InlineDocumentValue PropertyName="universite" />
</Paragraph>
</TableCell>
</TableRow>
</TableRowGroup>
<TableRowGroup>
<TableRow>
<TableCell>
<Paragraph FontSize="12" TextAlignment="Right">
<Bold >
<Run Text="Bölüm: "></Run>
</Bold>
</Paragraph>
</TableCell>
<TableCell>
<Paragraph FontSize="12" TextAlignment="Left">
<xrd:InlineDocumentValue PropertyName="bolum" />
</Paragraph>
</TableCell>
</TableRow>
</TableRowGroup>
<TableRowGroup>
<TableRow>
<TableCell>
<Paragraph FontSize="12" TextAlignment="Right">
<Bold >
<Run Text="Sınıf: "></Run>
</Bold>
</Paragraph>
</TableCell>
<TableCell>
<Paragraph FontSize="12" TextAlignment="Left">
<xrd:InlineDocumentValue PropertyName="sinif" />
</Paragraph>
</TableCell>
</TableRow>
</TableRowGroup>
</Table>
</Section>
</FlowDocument>
RaporGoruntule.xaml.cs kısmındaki kodları düzenlememiz gerekecek. Projemize reach Framework ile System.Printing ve itextsharp kutuphanelerini referance kısmına ekleyelım. Nerden bulacağız sorusuna gelirsek referance kısmına sağ tıklayıp add referance dedığınızde gelen ekrandan .NET kısmında gelen listeden bu frameworkleri bulabilirsiniz.
private bool _firstActive = true;
public RaporGoruntule(string ad, string soyad, string universite, string bolum, string sinif)
{
InitializeComponent();
this.Activated += (obj, sender) => Window_Activated(ad,soyad,universite,bolum,sinif);
}
private XpsDocument xps;
public void Window_Activated(string ad, string soyad,string universite, string bolum, string sinif)
{
if (!_firstActive) return;
_firstActive = false;
Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(delegate
{
try
{
ReportDocument reportDocument = new ReportDocument();
StreamReader reader = new StreamReader(@"C:\\Users\\eyrlmz\\Documents\\Visual Studio 2010\\Projects\\DocumentView\\DocumentView\\Rapor.xaml");
// bu olusturdugumuz Rapor.xaml dosyasının yolu. bunu projeye gömerek de alabilirsiniz
reportDocument.XamlData = reader.ReadToEnd();
reader.Close();
ReportData data = new ReportData();
data.ReportDocumentValues.Add("adi", ad);
data.ReportDocumentValues.Add("soyadi", soyad);
data.ReportDocumentValues.Add("universite", universite);
data.ReportDocumentValues.Add("bolum", bolum);
data.ReportDocumentValues.Add("sinif", sinif);
xps = reportDocument.CreateXpsDocument(data);
documentViewer1.Document = xps.GetFixedDocumentSequence();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + "\r\n\r\n" + ex.GetType() + "\r\n" + ex.StackTrace, ex.GetType().ToString(), MessageBoxButton.OK, MessageBoxImage.Stop);
}
}));
}
RaporGoruntule penceremize birde Pdf Kaydet butonu olusturmustuk bunun komutu ise:
ToPdfFile.InteractiveExport(xps.GetFixedDocumentSequence(), PageSize.A4, 1);
Gelelim MainWindowdan parametreleri kullanıcıdan alıp oluşturduğumuz bu rapor düzeneğine göndermeye. Forma yerleştridiğimiz textboxların ızımlerini ad,soyad.. olarak değiştirelimki birbirine karısmasın. Rapor butonunun içine ise aşağıdaki komutu yazmak yeterli;
new RaporGoruntule(ad.Text, soyad.Text, unvrsite.Text, bolum.Text, sinif.Text).Show();
Çalıstırdığımızda ekran göüntümüz;
Yukarıda anlatılan projeyi buradan indirebilirsiniz.
Hiç yorum yok:
Yorum Gönder