Imports System.IO Imports BaseClasses.Data Imports System.Collections Imports System.Data.OleDb Imports System.Data Imports NPOI.SS.UserModel Imports NPOI.HSSF.UserModel Namespace Persons Public Enum ISDDataType ISDNotSet = 0 ISDString = 1 ISDNumber = 2 ISDDateTime = 3 ISDBoolean = 4 ISDInteger = 5 ISDError = 999 End Enum Public Class ISDWorkbook Public Worksheets As New ArrayList() Public Properties As New ISDWorkbookProperties() Private Function GenerateUniquePath(ByVal filename As String, ByVal extension As String) As String Dim suffix As Integer = 0 Dim fullpath As String Do suffix += 1 fullpath = System.Web.HttpContext.Current.Server.MapPath("../Temp/" & filename & "_" & suffix & "." & extension) Loop While System.IO.File.Exists(fullpath) Return fullpath End Function Private Function GetColumnDefinitions(ByVal cols As ArrayList, ByVal headerCells As ArrayList, ByVal dataCells As ArrayList, ByVal addType As Boolean) As String Dim result As String = "" Dim i As Integer = 0 For Each headerCell As ISDWorksheetCell In headerCells If Not result.Equals("") Then result += ", " End If result += "[" & headerCell.Text & "]" If addType Then Dim dataCell As ISDWorksheetCell = DirectCast(dataCells(i), ISDWorksheetCell) result += " varchar(" & Convert.ToString(cols(i)) & ")" End If i += 1 Next Return result End Function Private Function GetRowData(ByVal cells As ArrayList) As String Dim result As String = "" Dim value As String = "" For Each cell As ISDWorksheetCell In cells If Not result.Equals("") Then result += ", " End If value = cell.Text.Replace("'", "''") If value.Length > 255 Then value = value.Substring(0, 255) End If result += "'" & value & "'" Next Return result End Function Public Sub Save(ByVal OutputStream As System.IO.Stream, ByVal response As System.Web.HttpResponse) Dim filename As String = "Export_" & Guid.NewGuid().ToString() Dim completePathOne As String = GenerateUniquePath(filename, "xlsx") Dim completePathTwo As String = GenerateUniquePath(filename, "xls") Dim completePath As String Dim tableName As String Dim ws As ISDWorksheet = DirectCast(Me.Worksheets(0), ISDWorksheet) Dim ta As ISDTable = ws.Table tableName = ws.Name Dim rows As ArrayList = ta.Rows Dim row0 As ISDWorksheetRow = Nothing If rows.Count > 0 Then row0 = DirectCast(rows(0), ISDWorksheetRow) End If Dim row1 As ISDWorksheetRow = row0 If rows.Count > 1 Then row1 = DirectCast(rows(1), ISDWorksheetRow) End If Dim cols As ArrayList = ta.Columns Dim colDefs As String = GetColumnDefinitions(cols, row0.Cells, row1.Cells, True) Dim colNames As String = GetColumnDefinitions(cols, row0.Cells, row1.Cells, False) completePath = completePathTwo Dim hssfwb As New HSSFWorkbook() Dim format As IDataFormat = hssfwb.CreateDataFormat() Dim sh As ISheet = hssfwb.CreateSheet("Sheet1") Dim rIndex As Integer = 0 Dim r As IRow = sh.CreateRow(rIndex) Dim c As Integer = 0 Dim styles(row0.Cells.Count) As HSSFCellStyle For Each hCell As ISDWorksheetCell In row0.Cells Dim style As HSSFCellStyle = CType(hssfwb.CreateCellStyle(), HSSFCellStyle) Dim ce As ICell = r.CreateCell(c) ce.SetCellValue(hCell.Text) style.WrapText = True styles(c) = CType(hssfwb.CreateCellStyle(), HSSFCellStyle) ce.CellStyle = style c += 1 Next For rIndex = 1 To rows.Count - 1 Dim currentRow As ISDWorksheetRow = DirectCast(rows(rIndex), ISDWorksheetRow) r = sh.CreateRow(rIndex) c = 0 For i As Integer = 0 To currentRow.Cells.Count - 1 'myValue = myValue.Replace("$", "").Replace(",", "") Dim ce As ICell = r.CreateCell(c) Dim style As HSSFCellStyle = styles(i) Dim dCell As ISDWorksheetCell = DirectCast(currentRow.Cells(i), ISDWorksheetCell) Dim formatStr As String = dCell.Format If dCell.Type = ISDDataType.ISDInteger OrElse _ dCell.Type = ISDDataType.ISDNumber Then ce.SetCellType(CellType.NUMERIC) If dCell.Value IsNot Nothing Then ce.SetCellValue(Convert.ToDouble(dCell.Value)) End If If GetBuildInFormat(dCell.Format) > 0 Then style.DataFormat = HSSFDataFormat.GetBuiltinFormat(dCell.Format) Else Dim info As System.Globalization.NumberFormatInfo = System.Globalization.CultureInfo.CurrentCulture.NumberFormat If dCell.Format = "" OrElse dCell.Format Is Nothing Then formatStr = "##0.00" ElseIf dCell.Format.Contains("C") OrElse dCell.Format.Contains("c") Then formatStr = info.CurrencySymbol & "##0.00" ElseIf dCell.Format.Contains("P") OrElse dCell.Format.Contains("p") Then formatStr = "##0.00" & info.PercentSymbol ElseIf dCell.Format.Contains(info.CurrencySymbol) OrElse dCell.Format.Contains(info.PercentSymbol) Then ' use the user given display format Else formatStr = "##0.00" End If style.DataFormat = format.GetFormat(formatStr) End If ElseIf dCell.Type = ISDDataType.ISDDateTime Then If dCell.Value IsNot Nothing Then ce.SetCellType(CellType.NUMERIC) ce.SetCellValue(Convert.ToDateTime(dCell.Value)) End If If GetBuildInFormat(dCell.Format) > 0 Then style.DataFormat = HSSFDataFormat.GetBuiltinFormat(dCell.Format) Else Dim info As System.Globalization.DateTimeFormatInfo = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat ' convert the date format understood by Excel ' see http://msdn.microsoft.com/en-us/library/az4se3k1(v=vs.71).aspx Select Case dCell.Format Case "d" formatStr = info.ShortDatePattern Case "D" formatStr = info.LongDatePattern Case "t" formatStr = info.ShortTimePattern Case "T" formatStr = info.LongTimePattern Case "f" formatStr = info.LongDatePattern & " " & info.ShortTimePattern Case "F" formatStr = info.FullDateTimePattern Case "g" formatStr = info.ShortDatePattern & " " & info.ShortTimePattern Case "G" formatStr = info.ShortDatePattern & " " & info.LongTimePattern Case "M", "m" formatStr = info.MonthDayPattern Case "R", "r" formatStr = info.RFC1123Pattern Case "s" formatStr = info.SortableDateTimePattern Case "u" formatStr = info.UniversalSortableDateTimePattern Case "U" formatStr = info.FullDateTimePattern Case "Y", "y" formatStr = info.YearMonthPattern Case Else formatStr = info.ShortDatePattern End Select ' some pattern above might return t but this is not recognized by Excel, so remove it formatStr = formatStr.Replace("t", "") style.DataFormat = format.GetFormat(formatStr) End If Else ce.SetCellType(CellType.STRING) If dCell.Value IsNot Nothing Then Dim myValue As String = dCell.Text.Replace("'", "''") If myValue.Length > 255 Then myValue = myValue.Substring(0, 255) End If ce.SetCellValue(myValue) End If If GetBuildInFormat(dCell.Format) > 0 Then style.DataFormat = HSSFDataFormat.GetBuiltinFormat(dCell.Format) Else style.DataFormat = HSSFDataFormat.GetBuiltinFormat("TEXT") style.WrapText = True End If End If ce.CellStyle = style c += 1 Next Next Dim ms As New MemoryStream() hssfwb.Write(ms) Dim NPOIDownloadFileName As String = Me.Properties.Title If completePath.EndsWith(".xlsx") Then NPOIDownloadFileName += ".xlsx" Else NPOIDownloadFileName += ".xls" End If response.ClearHeaders() response.Clear() response.Cache.SetCacheability(System.Web.HttpCacheability.[Private]) response.Cache.SetMaxAge(New TimeSpan(0)) response.Cache.SetExpires(New DateTime(0)) response.Cache.SetNoServerCaching() response.AppendHeader("Content-Disposition", ("attachment; filename=""" & (NPOIDownloadFileName & """"))) response.ContentType = "application/vnd.ms-excel" OutputStream.Write(ms.ToArray(), 0, ms.ToArray().Length) Return End Sub Private Function GetBuildInFormat(ByVal format As String) As Short If format = "" OrElse format Is Nothing Then Return -1 Else Return HSSFDataFormat.GetBuiltinFormat(format) End If End Function End Class Public Class ISDWorkbookProperties Public Title As String = "" End Class Public Class ISDWorksheet Public Table As New ISDTable() Public Name As String = "" Public Sub New(ByVal name__1 As String) Name = name__1 End Sub End Class Public Class ISDTable Public Rows As New ArrayList() Public Columns As New ArrayList() End Class Public Class ISDWorksheetRow Public Cells As New ArrayList() End Class Public Class ISDWorksheetCell Public Value As Object = "" Public Type As ISDDataType = ISDDataType.ISDString Public StyleID As String = "" Public Format As String = "" Public ReadOnly Property Text() As String Get If Value Is Nothing Then Return Nothing End If Return Value.ToString() End Get End Property Public Sub New() Value = "" Type = ISDDataType.ISDString StyleID = "" End Sub Public Sub New(ByVal text__1 As Object) Value = text__1 Type = ISDDataType.ISDString StyleID = "" End Sub Public Sub New(ByVal text__1 As Object, ByVal styleID__2 As String) Value = text__1 Type = ISDDataType.ISDString StyleID = styleID__2 End Sub Public Sub New(ByVal text__1 As Object, ByVal type__2 As ISDDataType, ByVal styleID__3 As String, ByVal format__4 As String) Value = text__1 Type = type__2 StyleID = styleID__3 Format = format__4 End Sub End Class ''' ''' Base class to export data to CSV or Excel ''' Public MustInherit Class ExportDataBaseClass #Region "Properties" Protected pageSize As Integer = 5000 Protected _headerString As [String] Protected Property HeaderString() As [String] Get Return _headerString End Get Set(ByVal value As [String]) _headerString = value End Set End Property Protected MustOverride ReadOnly Property Title() As String #End Region #Region "Constructor" Protected Sub New() HeaderString = Nothing End Sub Protected Sub New(ByVal header As [String]) HeaderString = header End Sub #End Region #Region "Public Methods" ' SetsResponse header and cache Public Sub SetupResponse(ByVal response As System.Web.HttpResponse, ByVal fileName As String) response.ClearHeaders() response.Clear() response.Cache.SetCacheability(System.Web.HttpCacheability.[Private]) response.Cache.SetMaxAge(New TimeSpan(0)) response.Cache.SetExpires(New DateTime(0)) response.Cache.SetNoServerCaching() response.AppendHeader("Content-Disposition", ("attachment; filename=""" & (fileName & """"))) End Sub Public MustOverride Sub Export(ByVal response As System.Web.HttpResponse) #End Region End Class ' The ExportToCSVBaseClass class exports to CSV file and sends the file to the response stream. Public MustInherit Class ExportToCSVBaseClass Inherits ExportDataBaseClass #Region "Properties" Private _writer As StreamWriter Private Property Writer() As StreamWriter Get Return _writer End Get Set(ByVal value As StreamWriter) _writer = value End Set End Property #End Region #Region "Constructor" Protected Sub New() MyBase.New() End Sub Protected Sub New(ByVal header As [String]) MyBase.New(header) End Sub #End Region #Region "Private Methods" Protected Overridable Function WriteColumnHeader(ByVal exportRawValues As Boolean) As Boolean ' If the DisplayString is not null then, write the contents of DisplayString as column headers If MyBase.HeaderString IsNot Nothing AndAlso MyBase.HeaderString <> "" Then Writer.Write(HeaderString.Replace("""", """""")) Return True End If Return False End Function Protected separator As [String] = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator Protected Sub WriteColumnTitle(ByVal val As String) Writer.Write("""" & (val.Replace("""", """""") & """" & separator)) End Sub Protected Friend Sub WriteColumnData(ByVal val As Object, ByVal isString As Boolean) If val IsNot Nothing AndAlso (isString OrElse val.ToString().Contains(separator)) Then Writer.Write("""" & (val.ToString().Replace("""", """""") & """")) Else Writer.Write(val) End If Writer.Write(separator) End Sub Protected Friend Sub WriteNewRow() Writer.WriteLine() End Sub #End Region #Region "Public Methods" Public Sub StartExport(ByVal response As System.Web.HttpResponse, Optional ByVal exportRawValues As Boolean = False) If response Is Nothing Then Return End If Dim fileName As String = Title & ".csv" SetupResponse(response, fileName) response.ContentType = "text/plain" Writer = New StreamWriter(response.OutputStream, System.Text.Encoding.UTF8) ' First write out the Column Headers Me.WriteColumnHeader(exportRawValues) Writer.WriteLine() End Sub Public Sub FinishExport(ByVal response As System.Web.HttpResponse) Writer.Flush() ' Need to call Response.End() so nothing will be attached to a file ' System.Web.HttpResponse.End() function will throw System.Threading.ThreadAbortException ' indicating that the current response ends prematurely - that's what we want response.[End]() End Sub #End Region End Class ''' ''' The ExportToExcelBaseClass provides common functionality ''' used for exports to Excel and sends the XLS file to the response stream. ''' Public MustInherit Class ExportToExcelBaseClass Inherits ExportDataBaseClass #Region "Properties" Private _ISDexcelBook As ISDWorkbook Private Property ISDExcelBook() As ISDWorkbook Get Return _ISDexcelBook End Get Set(ByVal value As ISDWorkbook) _ISDexcelBook = value End Set End Property Private _ISDexcelSheet As ISDWorksheet Private Property ISDExcelSheet() As ISDWorksheet Get Return _ISDexcelSheet End Get Set(ByVal value As ISDWorksheet) _ISDexcelSheet = value End Set End Property Private _ISDexcelRow As ISDWorksheetRow Private Property ISDExcelRow() As ISDWorksheetRow Get Return _ISDexcelRow End Get Set(ByVal value As ISDWorksheetRow) _ISDexcelRow = value End Set End Property #End Region #Region "Constructor" Protected Sub New() MyBase.HeaderString = Nothing End Sub Protected Sub New(ByVal header As [String]) MyBase.HeaderString = header End Sub #End Region #Region "Protected Methods" ' Add column to excel book, creates style for that column set's format ' before call to this function empty row needs to be added Protected Friend Sub AddColumnToExcelBook(ByVal column As Integer, ByVal caption As String, ByVal type As ISDDataType, ByVal width As Integer, ByVal format As String) If ISDExcelRow Is Nothing Then Return End If ISDExcelRow.Cells.Add(New ISDWorksheetCell(caption, "HeaderRowStyle")) ISDExcelSheet.Table.Columns.Add(width) End Sub ' Add cell with data to existing row ' column - column number to set correct format for this cell ' name - column name ' entityType - EntityType instance, that holds types definitions for this table ' val - data value for this cell Protected Friend Sub AddCellToExcelRow(ByVal column As Integer, ByVal type As ISDDataType, ByVal val As Object, ByVal format As String) Dim styleName As [String] = "Style" 'name of the format style If ISDExcelRow Is Nothing Then Return End If ISDExcelRow.Cells.Add(New ISDWorksheetCell(val, type, (styleName & column), format)) End Sub Protected Friend Sub AddRowToExcelBook() If ISDExcelSheet Is Nothing Then Return End If ISDExcelRow = New ISDWorksheetRow() ISDExcelSheet.Table.Rows.Add(ISDExcelRow) End Sub ' calls SetupResponse to set header and cache and saves Excel file to HttpResponse Protected Friend Sub SaveExcelBook(ByVal response As System.Web.HttpResponse) Try ISDExcelBook.Save(response.OutputStream, response) Catch ex As Exception Throw ex End Try ' Need to call Response.End() so nothing will be attached to a file ' System.Web.HttpResponse.End() function will throw System.Threading.ThreadAbortException ' indicating that the current response ends prematurely - that's what we want response.[End]() End Sub ' Creates Excel Workbook that is used for Export to Excel request. Protected Friend Sub CreateExcelBook() ISDExcelBook = New ISDWorkbook() ISDExcelBook.Properties.Title = Title ISDExcelSheet = New ISDWorksheet("Sheet1") ISDExcelBook.Worksheets.Add(ISDExcelSheet) ISDExcelRow = New ISDWorksheetRow() ISDExcelSheet.Table.Rows.Add(ISDExcelRow) End Sub #End Region End Class Public Class ExportDataToCSV Inherits ExportToCSVBaseClass #Region "Properties" Private data As DataForExport = Nothing Public Shadows pageSize As Integer = 5000 Protected Overrides ReadOnly Property Title() As String Get Return data.Title End Get End Property #End Region #Region "Constructor" Private Sub New() End Sub 'don't use this one! Public Sub New(ByVal tbl As BaseTable, ByVal wc As WhereClause, ByVal orderBy As OrderBy, ByVal columns As BaseColumn()) MyBase.New() data = New DataForExport(tbl, wc, orderBy, columns) End Sub Public Sub New(ByVal tbl As BaseTable, ByVal wc As WhereClause, ByVal orderBy As OrderBy) MyBase.New() data = New DataForExport(tbl, wc, orderBy, Nothing) End Sub Public Sub New(ByVal tbl As BaseTable, ByVal wc As WhereClause, ByVal orderBy As OrderBy, ByVal columns As BaseColumn(), ByVal header As [String]) MyBase.New(header) data = New DataForExport(tbl, wc, orderBy, columns) End Sub Public Sub New(ByVal tbl As BaseTable, ByVal wc As WhereClause, ByVal orderBy As OrderBy, ByVal header As [String]) MyBase.New(header) data = New DataForExport(tbl, wc, orderBy, Nothing) End Sub #End Region #Region "Private Methods" Public Function GetDataForExport(ByVal col As BaseColumn, ByVal rec As BaseRecord) As String Dim val As [String] = "" If col.TableDefinition.IsExpandableNonCompositeForeignKey(col) Then ' Foreign Key column, so we will use DFKA and String type. val = rec.Format(col) Else Select Case col.ColumnType Case BaseColumn.ColumnTypes.Binary, BaseColumn.ColumnTypes.Image Exit Select Case BaseColumn.ColumnTypes.Currency, BaseColumn.ColumnTypes.Number, BaseColumn.ColumnTypes.Percentage val = rec.Format(col) Exit Select Case Else val = rec.Format(col) Exit Select End Select End If Return val End Function Protected Overrides Function WriteColumnHeader(ByVal exportRawValues As Boolean) As Boolean If MyBase.WriteColumnHeader(exportRawValues) Then Return True End If ' If DisplayString is null, then write out the Column's name property as the header. For Each col As BaseColumn In data.ColumnList If Not (col Is Nothing) Then If data.IncludeInExport(col) Then If Not exportRawValues Then MyBase.WriteColumnTitle(col.Name) Else Dim _isExpandableNonCompositeForeignKey As Boolean = col.TableDefinition.IsExpandableNonCompositeForeignKey(col) If _isExpandableNonCompositeForeignKey Then Dim fkColumn As ForeignKey = data.DBTable.TableDefinition.GetExpandableNonCompositeForeignKey(col) Dim name As String = fkColumn.GetPrimaryKeyColumnName(col) MyBase.WriteColumnTitle(name) Else MyBase.WriteColumnTitle(col.Name) End If End If End If End If Next Return True End Function Protected Sub WriteRows() Dim done As Boolean = False Dim totalRowsReturned As Integer = 0 ' Read pageSize records at a time and write out the CSV file. While Not done Dim recList As ArrayList = data.GetRows(pageSize) If recList Is Nothing Then Exit While End If 'we are done totalRowsReturned = recList.Count For Each rec As BaseRecord In recList For Each col As BaseColumn In data.ColumnList If col Is Nothing Then Continue For End If If Not data.IncludeInExport(col) Then Continue For End If Dim val As [String] = GetDataForExport(col, rec) MyBase.WriteColumnData(val, data.IsString(col)) Next MyBase.WriteNewRow() Next ' If we already are below the pageSize, then we are done. If (totalRowsReturned < pageSize) Then done = True End If End While End Sub #End Region #Region "Public Methods" Public Overrides Sub Export(ByVal response As System.Web.HttpResponse) If response Is Nothing Then Return End If StartExport(response) WriteRows() FinishExport(response) End Sub #End Region End Class ''' ''' The ExportDataToExcel class exports to Excel file and sends the XLS file to the response stream. ''' Public Class ExportDataToExcel Inherits ExportToExcelBaseClass #Region "Properties" Private data As DataForExport = Nothing Public Shadows pageSize As Integer = 5000 Protected Overrides ReadOnly Property Title() As String Get Return data.Title End Get End Property #End Region #Region "Constructor" Private Sub New() End Sub 'don't use this one! Public Sub New(ByVal tbl As BaseTable, ByVal wc As WhereClause, ByVal orderBy As OrderBy) MyBase.New() data = New DataForExport(tbl, wc, orderBy, Nothing) End Sub #End Region #Region "Private Methods" Public Function GetDisplayFormat(ByVal col As ExcelColumn) As String Return col.DisplayFormat End Function 'return true if type can be included in export data Protected Friend Function GetExcelDataType(ByVal col As ExcelColumn) As ISDDataType If col.DisplayColumn.TableDefinition.IsExpandableNonCompositeForeignKey(col.DisplayColumn) Then Return ISDDataType.ISDString End If Select Case col.DisplayColumn.ColumnType Case BaseColumn.ColumnTypes.Number, BaseColumn.ColumnTypes.Percentage Return ISDDataType.ISDNumber Case BaseColumn.ColumnTypes.Currency Return ISDDataType.ISDNumber Case BaseColumn.ColumnTypes.[Date] Return ISDDataType.ISDDateTime Case BaseColumn.ColumnTypes.Very_Large_String Return ISDDataType.ISDString Case BaseColumn.ColumnTypes.[Boolean] Return ISDDataType.ISDString Case Else Return ISDDataType.ISDString End Select End Function Public Function GetExcelCellWidth(ByVal col As ExcelColumn) As Integer If col Is Nothing Then Return 0 End If Dim width As Integer = 50 If col.DisplayColumn.TableDefinition.IsExpandableNonCompositeForeignKey(col.DisplayColumn) Then ' Set width if field is a foreign key field width = 100 Else Select Case col.DisplayColumn.ColumnType Case BaseColumn.ColumnTypes.Binary, BaseColumn.ColumnTypes.Image ' Skip - do nothing for these columns width = 0 Exit Select Case BaseColumn.ColumnTypes.Currency, BaseColumn.ColumnTypes.Number, BaseColumn.ColumnTypes.Percentage width = 60 Exit Select Case BaseColumn.ColumnTypes.[String] width = 255 Exit Select Case BaseColumn.ColumnTypes.Very_Large_String width = 255 Exit Select Case Else width = 50 Exit Select End Select End If Return width End Function Protected Friend Function GetValueForExcelExport(ByVal col As ExcelColumn, ByVal rec As BaseRecord) As Object Dim val As Object = "" Dim isNull As Boolean = False Dim deciNumber As Decimal If col Is Nothing Then Return Nothing End If 'DFKA value is evaluated in the ExportExcelButton_Click method in the .controls file 'if (col.DisplayColumn.TableDefinition.IsExpandableNonCompositeForeignKey(col.DisplayColumn)) '{ ' // Foreign Key column, so we will use DFKA and String type. ' val = rec.Format(col.DisplayColumn); '} 'else '{ Select Case col.DisplayColumn.ColumnType Case BaseColumn.ColumnTypes.Number, BaseColumn.ColumnTypes.Percentage, BaseColumn.ColumnTypes.Currency Dim numVal As ColumnValue = rec.GetValue(col.DisplayColumn) 'If the value of the column to be exported is nothing, add an empty cell to the Excel file If numVal.IsNull Then isNull = True Else deciNumber = numVal.ToDecimal() val = deciNumber End If Exit Select Case BaseColumn.ColumnTypes.[Date] Dim dateVal As ColumnValue = rec.GetValue(col.DisplayColumn) If dateVal.IsNull Then isNull = True Else ' Specify the default Excel format for the date field ' val = rec.Format(col.DisplayColumn, "s"); ' val += ".000"; val = rec.GetValue(col.DisplayColumn).Value End If Exit Select Case BaseColumn.ColumnTypes.Very_Large_String val = rec.GetValue(col.DisplayColumn).ToString() Exit Select Case BaseColumn.ColumnTypes.[Boolean] val = rec.Format(col.DisplayColumn) Exit Select Case Else val = rec.Format(col.DisplayColumn) Exit Select End Select '} If isNull Then Return Nothing Else Return val End If End Function #End Region #Region "Public Methods" Public Sub AddColumn(ByVal col As ExcelColumn) data.ColumnList.Add(col) End Sub Public Overrides Sub Export(ByVal response As System.Web.HttpResponse) Dim done As Boolean = False Dim val As Object If response Is Nothing Then Return End If CreateExcelBook() Dim width As Integer = 0 Dim columnCounter As Integer = 0 ' First write out the Column Headers For Each col As ExcelColumn In data.ColumnList width = GetExcelCellWidth(col) If data.IncludeInExport(col) Then AddColumnToExcelBook(columnCounter, col.ToString(), GetExcelDataType(col), width, GetDisplayFormat(col)) columnCounter += 1 End If Next ' Read pageSize records at a time and write out the Excel file. Dim totalRowsReturned As Integer = 0 While Not done Dim recList As ArrayList = data.GetRows(pageSize) If recList Is Nothing Then Exit While End If totalRowsReturned = recList.Count For Each rec As BaseRecord In recList AddRowToExcelBook() columnCounter = 0 For Each col As ExcelColumn In data.ColumnList If Not data.IncludeInExport(col) Then Continue For End If val = GetValueForExcelExport(col, rec) AddCellToExcelRow(columnCounter, GetExcelDataType(col), val, col.DisplayFormat) columnCounter += 1 Next Next ' If we already are below the pageSize, then we are done. If (totalRowsReturned < pageSize) Then done = True End If End While SaveExcelBook(response) End Sub #End Region End Class ''' ''' The DataForExport class is a support class for Exportdata. ''' It encapsulate access to data needs to be exported: ''' data rows, title, columns. ''' Class DataForExport Public ColumnList As New ArrayList() Public _tbl As BaseTable Public Property DBTable() As BaseTable Get Return _tbl End Get Set(ByVal value As BaseTable) _tbl = value End Set End Property Public _wc As WhereClause Public Property SelectWhereClause() As WhereClause Get Return _wc End Get Set(ByVal value As WhereClause) _wc = value End Set End Property Public _orderby As OrderBy Public Property SelectOrderBy() As OrderBy Get Return _orderby End Get Set(ByVal value As OrderBy) _orderby = value End Set End Property Public _join As BaseFilter Public Property SelectJoin() As BaseFilter Get Return _join End Get Set(ByVal value As BaseFilter) _join = value End Set End Property Public ReadOnly Property Title() As String Get If DBTable.TableDefinition Is Nothing Then Return "Unnamed" End If Return DBTable.TableDefinition.Name End Get End Property Private pageIndex As Integer = 0 Public Function GetRows(ByVal pageSize As Integer) As ArrayList Dim totalRows As Integer = 0 Dim recList As ArrayList = Nothing ' Read pageSize records at a time and write out the CSV file. If SelectWhereClause.RunQuery Then recList = DBTable.GetRecordList(SelectJoin, SelectWhereClause.GetFilter(), Nothing, SelectOrderBy, pageIndex, pageSize, _ totalRows) pageIndex += 1 End If Return recList End Function Public Sub New(ByVal tbl As BaseTable, ByVal wc As WhereClause, ByVal orderBy As OrderBy, ByVal columns As BaseColumn()) Me.DBTable = tbl Me.SelectWhereClause = wc Me.SelectOrderBy = orderBy Me.SelectJoin = Nothing If columns IsNot Nothing Then ColumnList.AddRange(columns) End If End Sub Public Sub New(ByVal tbl As BaseTable, ByVal wc As WhereClause, ByVal orderBy As OrderBy, ByVal columns As BaseColumn(), ByVal join As BaseFilter) Me.DBTable = tbl Me.SelectWhereClause = wc Me.SelectOrderBy = orderBy Me.SelectJoin = join If columns IsNot Nothing Then ColumnList.AddRange(columns) End If End Sub Public Function IsString(ByVal col As BaseColumn) As Boolean If col Is Nothing Then Return False End If Select Case col.ColumnType Case BaseColumn.ColumnTypes.Binary, BaseColumn.ColumnTypes.Image, BaseColumn.ColumnTypes.Currency, BaseColumn.ColumnTypes.Number, BaseColumn.ColumnTypes.Percentage Return False End Select Return True End Function Public Function IsString(ByVal col As ExcelColumn) As Boolean If col Is Nothing Then Return False End If Return IsString(col.DisplayColumn) End Function Public Function IncludeInExport(ByVal col As BaseColumn) As Boolean If col Is Nothing Then Return False End If Select Case col.ColumnType Case BaseColumn.ColumnTypes.Binary, BaseColumn.ColumnTypes.Image ' Skip - do nothing for these columns Return False End Select Return True End Function Public Function IncludeInExport(ByVal col As ExcelColumn) As Boolean If col Is Nothing Then Return False End If Return IncludeInExport(col.DisplayColumn) End Function End Class ''' ''' ExcelColumn class is used to set Excel format for BaseClolumn to be used for exporting data to Excel file. ''' Public Class ExcelColumn #Region "Constructor" ''' ''' Cretes new ExcelColumn ''' ''' BaseColumn ''' a format string from Excel's Format Cell menu. For example "dddd, mmmm dd, yyyy h:mm AM/PM;@", "#,##0.00" Public Sub New(ByVal col As BaseColumn, ByVal format As String) DisplayColumn = col DisplayFormat = format End Sub #End Region #Region "Properties" Private _column As BaseColumn Public Property DisplayColumn() As BaseColumn Get Return _column End Get Set(ByVal value As BaseColumn) _column = value End Set End Property Private _format As String Public Property DisplayFormat() As String Get Return _format End Get Set(ByVal value As String) _format = value End Set End Property #End Region #Region "Public Methods" Public Overrides Function ToString() As String Return DisplayColumn.Name End Function #End Region End Class ''' ''' This class is redundant. It is left here for backward compatibility. ''' ''' Public Class ExportData #Region "Private members" Private _exportDataToCSV As ExportDataToCSV = Nothing Private _exportDataToExcel As ExportDataToExcel = Nothing #End Region #Region "Constructor" Public Sub New(ByVal tbl As BaseTable, ByVal wc As WhereClause, ByVal orderBy As OrderBy, ByVal columns As BaseColumn()) _exportDataToCSV = New ExportDataToCSV(tbl, wc, orderBy, columns) End Sub Public Sub New(ByVal tbl As BaseTable, ByVal wc As WhereClause, ByVal orderBy As OrderBy) _exportDataToCSV = New ExportDataToCSV(tbl, wc, orderBy) _exportDataToExcel = New ExportDataToExcel(tbl, wc, orderBy) End Sub Public Sub New(ByVal tbl As BaseTable, ByVal wc As WhereClause, ByVal orderBy As OrderBy, ByVal columns As BaseColumn(), ByVal header As [String]) _exportDataToCSV = New ExportDataToCSV(tbl, wc, orderBy, columns, header) End Sub #End Region Public Sub AddColumn(ByVal col As ExcelColumn) If _exportDataToExcel IsNot Nothing Then _exportDataToExcel.AddColumn(col) End If End Sub Public Sub ExportToCSV(ByVal response As System.Web.HttpResponse) If _exportDataToCSV IsNot Nothing Then _exportDataToCSV.Export(response) End If End Sub Public Sub ExportToExcel(ByVal response As System.Web.HttpResponse) If _exportDataToExcel IsNot Nothing Then _exportDataToExcel.Export(response) End If End Sub End Class End Namespace