1

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

我无法进行openrowset查询,因为我工作的公司不允许。它不能通过数据任务流来完成,因为我不知道一开始的标题是什么。

我已经尝试了一些脚本任务,但无法弄清楚如何将其放入 Excel 工作表

有没有人有任何示例代码或任何可以告诉我如何从 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)

到目前为止,我需要从 插入到 Excel 中dt,我只是遇到了麻烦,我认为这会起作用,我不确定。如果有人有更好的主意,我很想听听

4

1 回答 1

2

这是一种从数据表复制到 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
于 2013-07-31T02:22:45.277 回答