vb.net将数据广义写入excel

时间:2011-03-14 16:28:45

标签: vb.net excel oledb

我需要在VB.NET中从头开始创建一个excel文件,给出一个来自asp.net的DataTable。 我可以为特定文件执行此操作,但我不知道如何为常规数据库执行此操作。 也就是说,在我使用“CREATE TABLE ...”的地方,我不知道如何告诉它用于表中数据的类型。

DataTable派生自FoxPro数据库。 (我不知道这是否重要。)

我调用类似如下的表:

<%
return_value =  make_excel( sql_table, excel_filename)
%>

make_excel定义为

Option Explicit On 
'Option Strict On

Imports System
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.Page
Imports System.IO
Imports Microsoft.VisualBasic
Imports System.Diagnostics
Imports System.Data
Imports System.Data.OleDb


Public Class clsCommon
    Inherits Page

    ' buncha other stuff defined in here.

    Public Shared Function make_excel(ByVal sqlTable As DataTable, ByVal xls_fn As String) As Boolean
        Dim conn As System.Data.OleDb.OleDbConnection
        Dim ds As System.Data.DataSet
        Dim cmd As New System.Data.OleDb.OleDbCommand()

        conn = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & xls_fn & "';Extended Properties=Excel 8.0;")
        conn.Open()

        cmd.Connection = conn
        cmd.CommandText = "CREATE TABLE MyTable ( Admin  char(20), first_name char(20));"
        cmd.ExecuteNonQuery()

        cmd.CommandText = "INSERT INTO MyTable ( Admin, first_name ) VALUES ('true', 'Bob')"
        cmd.ExecuteNonQuery()

        conn.Close()

        Return True
    End Function

End Class

我需要做的是运行上面的sqlTable中的值,检查它们的类型,然后构建sql来编写它们。指针?

2 个答案:

答案 0 :(得分:1)

您是否查看了copyfromrecordset函数?你需要做一些工作并稍微改变一下方法,但这可能是你可以研究的东西。有一篇MS文章here(对不起,这篇文章是基于VBA的,但它应该作为指导帮助。)

答案 1 :(得分:0)

我有解决问题的办法。我对它作为一般解决方案并不满意,但它对我目前正在处理的案例运作良好。

在此解决方案中,我创建了一个excel文件的模板,其中包含我要使用的列标题。当我在正向代码中进行选择时,我会根据需要更改字段的名称(或删除我不想要的任何字段)。

公共共享函数TestXL(ByVal resp As HttpResponse,ByVal sqlTable As DataTable,ByVal xls_template_fn As String,ByVal xls_fn As String)As Boolean     Dim conn As System.Data.OleDb.OleDbConnection     Dim ds As System.Data.DataSet     Dim cmd As New System.Data.OleDb.OleDbCommand()

Dim r As DataRow
Dim c As DataColumn
Dim i As Integer
Dim sql As String
dim str as string

If File.Exists(xls_template_fn) Then
    try 
      If File.Exists(xls_fn) Then
        File.Delete(xls_fn)
      Else
        File.Copy(xls_template_fn, xls_fn)
      End If
    catch ex1 as Exception
      File.Copy(xls_template_fn, xls_fn)
    End Try
Else
    resp.Write("Unable to locate template file: " & xls_template_fn)
    Return False
End If

conn = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & xls_fn & "';Extended Properties=Excel 8.0;")
conn.Open()


cmd.Connection = conn
cmd.CommandText = sql


For Each r In sqlTable.Rows
    sql = "INSERT INTO MyTable ("
    For i = 0 To sqlTable.Columns.Count - 1
        sql = sql & " " & sqlTable.Columns(i).ColumnName & ","
    Next
    sql = Left(sql, sql.Length - 1) & " ) VALUES ( "
    For i = 0 To sqlTable.Columns.Count - 1
    str = r(i).toString()
        dim str2 as string = str.replace("'", "''")
        sql = sql & " '" & str2 & "',"
    Next
    sql = Left(sql, sql.Length - 1) & " );"


    'resp.Write(sql & "<br/>")

    cmd.CommandText = sql
    cmd.ExecuteNonQuery()
Next

conn.Close()

Return True

结束功能

请注意,工作表的名称是oledb调用表的名称。

有其他方法可以实现此目的:

http://blogs.msdn.com/b/erikaehrli/archive/2009/01/30/how-to-export-data-to-excel-from-an-asp-net-application-avoid-the-file-format-differ-prompt.aspx

如果我不得不重新审视这个问题,我可能会从那里开始。