2011-03-14 61 views
1

我需要在VB.NET中从头开始创建一个excel文件,并从asp.net提供一个DataTable。 我可以为特定文件执行此操作,但我不知道如何为通用数据库执行此操作。 也就是说,我在哪里使用“CREATE TABLE ...”,我不知道如何告诉它哪些类型用于表中的数据。vb.net将数据广泛写入excel

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

我注意到的一件事是,事情不喜欢字段名称“密码”。 – elbillaf 2011-03-16 12:37:36

回答

0

我有问题的解决方案。作为一种通用的解决方案,我并不高兴,但对于我目前正在处理的案例来说,它的效果已经足够好了。

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

公共共享功能TestXL(BYVAL RESP作为HttpResponse对象,BYVAL SQLTABLE作为数据表,BYVAL xls_template_fn作为字符串,BYVAL xls_fn作为字符串)为布尔 昏暗康恩作为System.Data.OleDb.OleDbConnection 昏暗DS作为System.Data。数据集 昏暗CMD作为新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

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

+0

我注意到这个问题已经解决 - 不知道我错过了它 - 在另一个Stackoverflow线程:http://stackoverflow.com/questions/150339/generating-an-excel-file-in-aspnet – elbillaf 2011-03-17 20:55:33

1

你看过copyfromrecordset函数吗?您需要完成一些工作,并稍稍改变方法,但这可能是您可以研究的问题。 MS文章可用here(对不起,本文基于VBA,但它应该有助于指导)。

+0

感谢您的留言。我开始尝试使用ADO,就像我之前用VBA做过类似的事情一样;然而,我无法弄清楚用什么进口来获得这些方法,因此也走了这条路。尽管如此,这种特殊的方法对我来说并不熟悉 - 非常感谢。 – elbillaf 2011-03-15 12:27:31