Bladeren bron

Added report export to Excel and RTF

Kenric Nugteren 1 jaar geleden
bovenliggende
commit
68e4b15bcc
2 gewijzigde bestanden met toevoegingen van 44 en 28 verwijderingen
  1. 7 1
      inabox.wpf/Reports/PreviewWindow.xaml
  2. 37 27
      inabox.wpf/Reports/PreviewWindow.xaml.cs

+ 7 - 1
inabox.wpf/Reports/PreviewWindow.xaml

@@ -4,6 +4,7 @@
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:wpf="clr-namespace:InABox.Wpf"
+        xmlns:reports="clr-namespace:InABox.Wpf.Reports"
         xmlns:preview="clr-namespace:FastReport.Preview;assembly=FastReport"
         xmlns:design="clr-namespace:FastReport.Design.StandardDesigner;assembly=FastReport"
         xmlns:editor="clr-namespace:RoslynPad.Editor;assembly=RoslynPad.Editor.Windows"
@@ -30,7 +31,12 @@
                  Margin="0" Padding="0">
 
                 <Button x:Name="PrintButton" ToolTip="Print Report" Click="PrintButton_Click" ToolBar.OverflowMode="Never" VerticalAlignment="Top"/>
-                <Button x:Name="SaveButton" ToolTip="Save As PDF" Click="SaveButton_Click" ToolBar.OverflowMode="Never" VerticalAlignment="Top"/>
+                <Button x:Name="SavePDFButton" ToolTip="Save as PDF" Click="SaveButton_Click" ToolBar.OverflowMode="Never" VerticalAlignment="Top"
+                        Tag="{x:Static reports:ReportExportType.PDF}"/>
+                <Button x:Name="SaveRTFButton" ToolTip="Save as RTF" Click="SaveButton_Click" ToolBar.OverflowMode="Never" VerticalAlignment="Top"
+                        Tag="{x:Static reports:ReportExportType.RTF}"/>
+                <Button x:Name="SaveExcelButton" ToolTip="Save as Spreadsheet" Click="SaveButton_Click" ToolBar.OverflowMode="Never" VerticalAlignment="Top"
+                        Tag="{x:Static reports:ReportExportType.Excel}"/>
                 <!--<Button x:Name="EmailButton" ToolTip="Email Report" Click="EmailButton_Click" ToolBar.OverflowMode="Never"/>-->
                 <Separator x:Name="ExportSeparator" />
                 <Button x:Name="FirstButton" ToolTip="First Page" Click="FirstButton_Click" ToolBar.OverflowMode="Never" VerticalAlignment="Top"/>

+ 37 - 27
inabox.wpf/Reports/PreviewWindow.xaml.cs

@@ -49,7 +49,10 @@ namespace InABox.Wpf.Reports
             modelIsPopulated = false;
 
             PrintButton.Content = ImageUtils.CreatePreviewWindowButtonContent("Print",Wpf.Resources.print);
-            SaveButton.Content = ImageUtils.CreatePreviewWindowButtonContent("Save",Wpf.Resources.save);
+            SavePDFButton.Content = ImageUtils.CreatePreviewWindowButtonContent("Save PDF", Wpf.Resources.save);
+            SaveRTFButton.Content = ImageUtils.CreatePreviewWindowButtonContent("Save RTF", Wpf.Resources.save);
+            SaveExcelButton.Content = ImageUtils.CreatePreviewWindowButtonContent("Save Excel", Wpf.Resources.save);
+
             foreach (var def in ReportUtils.ExportDefinitions)
             {
                 var button = new Button();
@@ -154,10 +157,7 @@ namespace InABox.Wpf.Reports
             {
                 try
                 {
-                    if (_report == null)
-                    {
-                        _report = ReportUtils.SetupReport(_template, _model, ShouldPopulate && !modelIsPopulated);
-                    }
+                    _report ??= ReportUtils.SetupReport(_template, _model, ShouldPopulate && !modelIsPopulated);
                     return null;
                 }
                 catch (Exception e)
@@ -170,10 +170,7 @@ namespace InABox.Wpf.Reports
                 {
                     if (s.Result == null)
                     {
-                        if (Designer.Report == null)
-                        {
-                            Designer.Report = _report;
-                        }
+                        Designer.Report ??= _report;
                         action();
                         CloseLoading();
                     }
@@ -280,25 +277,37 @@ namespace InABox.Wpf.Reports
             }
         }
 
-        private byte[] ExportReport(ReportExportType type)
+        private class Exporter
         {
-            var _exporters = new Dictionary<ReportExportType, ExportBase>
-            {
-                { ReportExportType.PDF, new PDFExport() },
-                { ReportExportType.HTML, new HTMLExport() },
-                { ReportExportType.RTF, new RTFExport() },
-                { ReportExportType.Excel, new Excel2003Document() },
-                { ReportExportType.Text, new TextExport() },
-                { ReportExportType.Image, new ImageExport() }
-            };
-            byte[] result = null;
-            using (var ms = new MemoryStream())
+            public Type Export { get; }
+
+            public string FileExtension { get; }
+
+            public string FileFilter { get; }
+
+            public Exporter(Type export, string fileExtension, string fileFilter)
             {
-                _report.Export(_exporters[type], ms);
-                result = ms.GetBuffer();
+                Export = export;
+                FileExtension = fileExtension;
+                FileFilter = fileFilter;
             }
+        }
 
-            return result;
+        private static readonly Dictionary<ReportExportType, Exporter> _exporters = new Dictionary<ReportExportType, Exporter>
+        {
+            { ReportExportType.PDF, new Exporter(typeof(PDFExport), ".pdf", "PDF Files (*.pdf)|*.pdf") },
+            { ReportExportType.HTML, new Exporter(typeof(HTMLExport), ".html", "HTML Files (*.html)|*.html") },
+            { ReportExportType.RTF, new Exporter(typeof(RTFExport), ".rtf", "RTF Files (*.rtf)|*.rtf") },
+            { ReportExportType.Excel, new Exporter(typeof(Excel2003Document), ".xls", "Excel Files (*.xls)|*.xls") },
+            { ReportExportType.Text, new Exporter(typeof(TextExport), ".txt", "Text Files (*.txt)|*.txt") },
+            { ReportExportType.Image, new Exporter(typeof(ImageExport), ".jpg", "JPEG Files (*.jpg, *.jpeg)|*.jpg;*.jpeg") }
+        };
+
+        private byte[] ExportReport(ReportExportType type)
+        {
+            using var ms = new MemoryStream();
+            _report.Export(Activator.CreateInstance(_exporters[type].Export) as ExportBase, ms);
+            return ms.GetBuffer();
         }
 
         private void Refresh()
@@ -316,11 +325,12 @@ namespace InABox.Wpf.Reports
 
         private void SaveButton_Click(object sender, RoutedEventArgs e)
         {
+            var exporter = _exporters[(ReportExportType)((Button)sender).Tag];
             var dlg = new SaveFileDialog();
-            dlg.Filter = "PDF Files (*.pdf)|*.pdf";
-            dlg.FileName = Path.ChangeExtension(Report.FileName, ".pdf");
+            dlg.Filter = exporter.FileFilter;
+            dlg.FileName = Path.ChangeExtension(Report.FileName, exporter.FileExtension);
             if (dlg.ShowDialog() == true)
-                Report.Export(new PDFExport(), dlg.FileName);
+                Report.Export(Activator.CreateInstance(exporter.Export) as ExportBase, dlg.FileName);
         }