Tuesday, 30 August 2011 09:21
XLS Report Silverlight
The sample demonstrates how to work with MarkerDesign in Silverlight via Spire.XLS.

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Report.App">
<Application.Resources>
</Application.Resources>
</Application>
using System;
using System.Windows;
using System.Windows.Browser;
using Spire.License;
namespace Report
{
public partial class App : Application
{
public App()
{
this.Startup += this.Application_Startup;
this.Exit += this.Application_Exit;
this.UnhandledException += this.Application_UnhandledException;
InitializeComponent();
}
private void Application_Startup(object sender, StartupEventArgs e)
{
LicenseProvider.SetLicenseKey("your license key in license.elic.xml");
this.RootVisual = new MainPage();
}
private void Application_Exit(object sender, EventArgs e)
{
}
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
// If the app is running outside of the debugger then report the exception using
// the browser's exception mechanism. On IE this will display it a yellow alert
// icon in the status bar and Firefox will display a script error.
if (!System.Diagnostics.Debugger.IsAttached)
{
// NOTE: This will allow the application to continue running after an exception has been thrown
// but not handled.
// For production applications this error handling should be replaced with something that will
// report the error to the website and stop the application.
e.Handled = true;
Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
}
}
private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
{
try
{
string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");
String exp = "throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");";
HtmlPage.Window.Eval(exp);
}
catch (Exception)
{
}
}
}
}
Partial Public Class App
Inherits Application
public Sub New()
InitializeComponent()
End Sub
Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) _
Handles Me.Startup
Me.RootVisual = New MainPage()
End Sub
Private Sub Application_Exit(ByVal o As Object, ByVal e As EventArgs) Handles Me.Exit
End Sub
Private Sub Application_UnhandledException(ByVal sender As object, _
ByVal e As ApplicationUnhandledExceptionEventArgs) Handles Me.UnhandledException
' If the app is running outside of the debugger then report the exception using
' the browser's exception mechanism. On IE this will display it a yellow alert
' icon in the status bar and Firefox will display a script error.
If Not System.Diagnostics.Debugger.IsAttached Then
' NOTE: This will allow the application to continue running after an exception has been thrown
' but not handled.
' For production applications this error handling should be replaced with something that will
' report the error to the website and stop the application.
e.Handled = True
Deployment.Current.Dispatcher.BeginInvoke( _
New Action(Of ApplicationUnhandledExceptionEventArgs)(AddressOf ReportErrorToDOM), e)
End If
End Sub
Private Sub ReportErrorToDOM(ByVal e As ApplicationUnhandledExceptionEventArgs)
Try
Dim errorMsg As String = e.ExceptionObject.Message + e.ExceptionObject.StackTrace
errorMsg = errorMsg.Replace(""""c, "'"c).Replace(ChrW(13) & ChrW(10), "\n")
System.Windows.Browser.HtmlPage.Window.Eval( _
"throw new Error(""Unhandled Error in Silverlight Application " + errorMsg + """);")
Catch
End Try
End Sub
End Class
<UserControl x:Class="Report.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="600" d:DesignWidth="500"
xmlns:dataInput="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.Input" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data" >
<Grid x:Name="LayoutRoot" Background="#FF003399" Height="450" Width="500" VerticalAlignment="Top" HorizontalAlignment="Center" Loaded="LayoutRoot_Loaded">
<Grid.RowDefinitions>
<RowDefinition Height="40" MaxHeight="40" MinHeight="40" />
<RowDefinition />
<RowDefinition Height="30" MaxHeight="30" MinHeight="30" />
</Grid.RowDefinitions>
<dataInput:Label HorizontalAlignment="Center" Name="labelTitle" VerticalAlignment="Center" Content="Countries List" Foreground="White" FontWeight="Bold" FontSize="16" Grid.ColumnSpan="2" />
<data:DataGrid AutoGenerateColumns="True" Grid.Row="1" HorizontalAlignment="Stretch" Name="dataGrid" VerticalAlignment="Stretch" Margin="1" />
<Button Content="Generate" Grid.Row="2" HorizontalAlignment="Right" Margin="0,0,2,0" Name="buttonGenerate" VerticalAlignment="Center" Width="75" IsEnabled="False" Click="buttonGenerate_Click" />
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using Spire.Xls;
namespace Report
{
public partial class MainPage : UserControl
{
public class Country
{
public String Name { get; set; }
public String Capital { get; set; }
public String Continent { get; set; }
public double Area { get; set; }
public long Population { get; set; }
}
private SaveFileDialog saveFileDialog = null;
private List dataSource = null;
private Workbook template = null;
public MainPage()
{
InitializeComponent();
this.saveFileDialog = new SaveFileDialog();
this.saveFileDialog.Filter = "Excel workbooks (*.xls) |*.xls";
}
private void LayoutRoot_Loaded(object sender, RoutedEventArgs e)
{
Assembly assembly = this.GetType().Assembly;
foreach (String name in assembly.GetManifestResourceNames())
{
if (name.EndsWith(".DatatableSample.xls"))
{
using (Stream stream = assembly.GetManifestResourceStream(name))
{
Workbook workbook = new Workbook();
workbook.LoadFromStream(stream);
Worksheet sheet = workbook.Worksheets[0];
this.dataSource = new List();
foreach (CellRange row in sheet.Rows)
{
if (row != null && row.Cells != null && row.Cells.Length == 5
&& !row.Cells[0].IsBlank)
{
if (row.Cells[0].Row == 1)
{
continue;
}
this.dataSource.Add(new Country()
{
Name = row.Cells[0].Value,
Capital = row.Cells[1].Value,
Continent = row.Cells[2].Value,
Area = row.Cells[3].NumberValue,
Population = Convert.ToInt64(row.Cells[4].NumberValue)
});
}
else
{
break;
}
}
this.dataGrid.ItemsSource = this.dataSource;
}
this.buttonGenerate.IsEnabled = true;
}
else if(name.EndsWith(".MarkerDesignerSample.xls"))
{
using (Stream stream = assembly.GetManifestResourceStream(name))
{
this.template = new Workbook();
this.template.LoadFromStream(stream);
}
}
}
}
private void buttonGenerate_Click(object sender, RoutedEventArgs e)
{
Worksheet worksheet = this.template.Worksheets[0];
this.template.MarkerDesigner.AddParameter("Variable1", 1234.5678);
this.template.MarkerDesigner.AddArray("Country", dataSource.ToArray());
this.template.MarkerDesigner.Apply();
worksheet.AllocatedRange.AutoFitRows();
worksheet.AllocatedRange.AutoFitColumns();
bool? result = this.saveFileDialog.ShowDialog();
if (result.HasValue && result.Value)
{
using (Stream stream = this.saveFileDialog.OpenFile())
{
this.template.SaveToStream(stream);
}
}
}
}
}
Imports System
Imports System.IO
Imports System.Net
Imports System.Reflection
Imports System.Windows
Imports System.Windows.Controls
Imports Spire.Xls
Partial Public Class MainPage
Inherits UserControl
Public Class Country
Public Property Name() As [String]
Get
Return m_Name
End Get
Set(ByVal value As [String])
m_Name = Value
End Set
End Property
Private m_Name As [String]
Public Property Capital() As [String]
Get
Return m_Capital
End Get
Set(ByVal value As [String])
m_Capital = Value
End Set
End Property
Private m_Capital As [String]
Public Property Continent() As [String]
Get
Return m_Continent
End Get
Set(ByVal value As [String])
m_Continent = Value
End Set
End Property
Private m_Continent As [String]
Public Property Area() As Double
Get
Return m_Area
End Get
Set(ByVal value As Double)
m_Area = Value
End Set
End Property
Private m_Area As Double
Public Property Population() As Long
Get
Return m_Population
End Get
Set(ByVal value As Long)
m_Population = Value
End Set
End Property
Private m_Population As Long
End Class
Private saveFileDialog As SaveFileDialog = Nothing
Private dataSource As List(Of Country) = Nothing
Private xlsTemplate As Workbook = Nothing
Public Sub New()
InitializeComponent()
Me.saveFileDialog = New SaveFileDialog()
Me.saveFileDialog.Filter = "Excel workbooks (*.xls) |*.xls"
End Sub
Private Sub LayoutRoot_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Dim assembly As Assembly = Me.[GetType]().Assembly
For Each name As [String] In assembly.GetManifestResourceNames()
If name.EndsWith(".DatatableSample.xls") Then
Using stream As Stream = assembly.GetManifestResourceStream(name)
Dim workbook As New Workbook()
workbook.LoadFromStream(stream)
Dim sheet As Worksheet = workbook.Worksheets(0)
Me.dataSource = New List(Of Country)()
For Each row As CellRange In sheet.Rows
If row IsNot Nothing AndAlso row.Cells IsNot Nothing AndAlso row.Cells.Length = 5 AndAlso Not row.Cells(0).IsBlank Then
If row.Cells(0).Row = 1 Then
Continue For
End If
Me.dataSource.Add(New Country() With { _
.Name = row.Cells(0).Value, _
.Capital = row.Cells(1).Value, _
.Continent = row.Cells(2).Value, _
.Area = row.Cells(3).NumberValue, _
.Population = Convert.ToInt64(row.Cells(4).NumberValue) _
})
Else
Exit For
End If
Next
Me.dataGrid.ItemsSource = Me.dataSource
End Using
Me.buttonGenerate.IsEnabled = True
ElseIf name.EndsWith(".MarkerDesignerSample.xls") Then
Using stream As Stream = assembly.GetManifestResourceStream(name)
Me.xlsTemplate = New Workbook()
Me.xlsTemplate.LoadFromStream(stream)
End Using
End If
Next
End Sub
Private Sub buttonGenerate_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Dim worksheet As Worksheet = Me.xlsTemplate.Worksheets(0)
Me.xlsTemplate.MarkerDesigner.AddParameter("Variable1", 1234.5678)
Me.xlsTemplate.MarkerDesigner.AddArray("Country", dataSource.ToArray())
Me.xlsTemplate.MarkerDesigner.Apply()
worksheet.AllocatedRange.AutoFitRows()
worksheet.AllocatedRange.AutoFitColumns()
Dim result As System.Nullable(Of Boolean) = Me.saveFileDialog.ShowDialog()
If result.HasValue AndAlso result.Value Then
Using stream As Stream = Me.saveFileDialog.OpenFile()
Me.xlsTemplate.SaveToStream(stream)
End Using
End If
End Sub
End Class
Published in
Silverlight