user2615302
user2615302

Reputation: 194

ssis script task to dynamically export from a SQL Server database to an Excel sheet

I am trying to create a SSIS package that will select all the value from a table in SQL Server to a table in Excel. The table is created on the run because it will change every time I run it. I can create the new table in the Excel sheet but I am having a lot of trouble getting the data in there.

I cannot do an openrowset query because the company I work for will not allow it. It cannot be done through the data task flow because i don't know what the headers at the start.

I have tried some script tasks but cannot figure out how to get it to the Excel sheet

Does anyone have any sample code or anything that will show me how to export from SQL Server to Excel dynamically?

    Dim cn As New OleDbConnection
    Dim sqlcn As New SqlConnection
    Dim adapter As New OleDbDataAdapter
    Dim dtset As New DataSet
    Dim dt As New DataTable
    Dim cmd As New OleDbCommand
    Dim sqlcmd As New SqlCommand
    Dim dr As DataRow

    cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Excel 8.0;Database=E:\sheet.xls;" + "HDR=Yes;Readonly=False;IMEX=0;"
    sqlcn.ConnectionString = "Data Source=DB_NAME;Initial Catalog=Main;Integrated Security=True"
    cn.Open()
    sqlcn.Open()


    Dim da As New SqlDataAdapter("Select * from Temp_Totals", sqlcn)
    da.Fill(dt)

So far now I need to insert in to the Excel from the dt and I just am having trouble with that I think this will work I am not sure. If some one has a better idea I would love to hear it

Upvotes: 1

Views: 5547

Answers (1)

Tim Taber
Tim Taber

Reputation: 101

Here's a quick, down and dirty way to copy from a datatable to excel without having to iterate through each column/row of the datatable:

Private Sub ExportToExcel(ByVal dt As DataTable, ByVal outputPath As String)
    Dim xlApp As Application = CreateObject("Excel.Application") 
    Dim xlWorkbook As Workbook = xlApp.Workbooks.Add(Type.Missing)
    Dim sheetIndex As Integer = 0
    Dim col, row As Integer
    Dim xlSheet As Worksheet
    Dim rawData(dt.Rows.Count, dt.Columns.Count - 1) As Object

    For col = 0 To dt.Columns.Count - 1
        rawData(0, col) = dt.Columns(col).ColumnName
    Next

    For col = 0 To dt.Columns.Count - 1
        For row = 0 To dt.Rows.Count - 1
            rawData(row + 1, col) = dt.Rows(row).ItemArray(col).ToString
        Next
    Next

     Dim finalColLetter As String = String.Empty
    Dim colCharset As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Dim colCharsetLen As Integer = colCharset.Length

    If dt.Columns.Count > colCharsetLen Then
        finalColLetter = colCharset.Substring((dt.Columns.Count - 1) \ colCharsetLen - 1, 1)
    End If

    finalColLetter += colCharset.Substring((dt.Columns.Count - 1) Mod colCharsetLen, 1)


    xlSheet = CType(xlWorkbook.Sheets.Add(xlWorkbook.Sheets(sheetIndex), Type.Missing, 1, XlSheetType.xlWorksheet), Worksheet)

    xlSheet.Name = dt.TableName


    Dim xlRange As String = String.Format("A1:{0}{1}", finalColLetter, dt.Rows.Count + 1)
    xlSheet.Range(xlRange, Type.Missing).Value2 = rawData


    Dim firstrow As Range = CType(xlSheet.Rows(1, Type.Missing), Range)
    firstrow.Font.Bold = True
    firstrow.Select()
    firstrow.AutoFilter(1, Type.Missing, XlAutoFilterOperator.xlAnd, Type.Missing, True)
    xlSheet.Application.ActiveWindow.SplitRow = 1
    xlSheet.Application.ActiveWindow.FreezePanes = True
    xlSheet.Columns.EntireColumn.AutoFit()
    xlSheet.Range("A1").Select()
    xlSheet.PageSetup.Orientation = XlPageOrientation.xlLandscape
    With xlSheet.PageSetup
        .Zoom = False
        .FitToPagesWide = 1
        .FitToPagesTall = False
        .BottomMargin = 0.25
        .TopMargin = 0.25
        .LeftMargin = 0.25
        .RightMargin = 0.25
        .HeaderMargin = 0
        .FooterMargin = 0
    End With
    firstrow = Nothing
    xlSheet = Nothing


    For Each xls As Worksheet In xlWorkbook.Worksheets
        If xls.Name.Contains("Sheet") = True Then xls.Delete()
    Next

    xlWorkbook.SaveAs(outputPath, XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing)
    xlWorkbook.Close(True, Type.Missing, Type.Missing)
    xlWorkbook = Nothing


    xlApp.Quit()
    xlApp = Nothing


    GC.Collect()
    GC.WaitForPendingFinalizers()

End Sub

Upvotes: 2

Related Questions