我需要在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来编写它们。指针?
答案 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调用表的名称。
有其他方法可以实现此目的:
如果我不得不重新审视这个问题,我可能会从那里开始。