ssis脚本任务dynamic地从SQL Server数据库导出到Excel工作表

我正在尝试创build一个SSIS包,将从SQL Server中的表中select所有值到Excel中的表中。 该表是在运行时创build的,因为每次运行它都会更改。 我可以在Excel表格中创build新表格,但是在那里获取数据时遇到了很多麻烦。

我不能做一个openrowset查询,因为我工作的公司不会允许它。 它不能通过数据任务stream完成,因为我不知道在开始的头是什么。

我已经尝试了一些脚本任务,但无法弄清楚如何获得它的Excel表

有没有人有任何示例代码或任何将告诉我如何dynamic地从SQL Server导出到Excel?

  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) 

到目前为止,我需要从dt插入到Excel中,我只是有麻烦,我认为这将工作,我不知道。 如果有人有一个更好的想法,我很乐意听到它

这里有一个快速,简单和肮脏的方法来从数据表复制到Excel,而不必遍历数据表的每一列/行:

 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