vb.net writer to excel函数在一台电脑上工作,但在另一台电脑上不工作

vb.net writer to excel函数在一台电脑上工作,但在另一台电脑上不工作,vb.net,winforms,excel,oledb,Vb.net,Winforms,Excel,Oledb,我有一个vb.net函数,它使用oledb创建电子表格,然后将其视为数据库,创建表格并插入值。该函数接收文件名和数据集,如果有效,则返回文件名。这个函数在我的开发机器上运行得很好,但在其他电脑上却没有。下面是我的函数,代码有什么问题吗?有什么建议吗 编辑:没有抛出错误,生成的文件不包含任何数据 Imports System Imports System.Configuration Imports System.Data Imports System.Data.OleDb Imports Syst

我有一个vb.net函数,它使用oledb创建电子表格,然后将其视为数据库,创建表格并插入值。该函数接收文件名和数据集,如果有效,则返回文件名。这个函数在我的开发机器上运行得很好,但在其他电脑上却没有。下面是我的函数,代码有什么问题吗?有什么建议吗

编辑:没有抛出错误,生成的文件不包含任何数据

Imports System
Imports System.Configuration
Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient
Imports System.Drawing
Imports System.IO
Imports System.Net.Mail
Imports System.Text
Imports System.Web
Imports Microsoft.Office.Interop  

公共共享函数writeToExcelFile(ByVal模板作为字符串,ByVal文件名作为字符串,ByVal数据作为数据集)作为字符串
如果File.Exists(filename)存在,则
File.Delete(文件名)
如果结束
如果模板字符串.Empty和文件名字符串.Empty,则
File.Copy(模板、文件名)
如果结束
Dim connString As String=“Provider=Microsoft.Jet.OLEDB.4.0;数据源=“+filename+”“扩展属性=”“Excel 8.0;HDR=Yes;”
Dim conn作为新的OLEDB连接(connString)
尝试
康涅狄格州公开赛
Dim cmd作为新的OleDbCommand()
将每个表作为data.Tables中的DataTable
Dim tableName As String=table.tableName.Replace(“,”)
Dim tableCreate As String=“创建表[”+tableName+”](“
Dim sql As String=“插入[”+tableName+“$”()
Dim colName As String=String.Empty
对于表中的每个列作为DataColumn
colName=col.ColumnName.Replace(“#”和“num”)
如果colName.Contains(“”),则
sql++=“[”+colName.Replace(“,”)+“,”
其他的
sql+=“”+colName.Replace(“”,“”)+“”,“”
如果结束
tableCreate+=“[”+colName+“]varchar(255),”
下一个
如果tableCreate.EndsWith(“,”),则
tableCreate=tableCreate.TrimEnd(新的[Char](){,“c})
如果结束
tableCreate+=“””
cmd=新的OleDbCommand(表格创建,conn)
cmd.ExecuteNonQuery()
如果sql.EndsWith(“,”),则
sql=sql.TrimEnd(新的[Char](){,“c})
如果结束
sql+=“””
对于表中的每一行作为DataRow
将值设置为String=“values(”
对于表中的每个列作为DataColumn
尝试
值+=“'”+cleanString(行(列).ToString())。子字符串(0250)+“…”,”
捕获e作为例外
值+=“'”+cleanString(行(列).ToString())+“,”
结束尝试
下一个
如果值为.EndsWith(“,”),则
values=values.TrimEnd(新的[Char](){,“c})
如果结束
值+=“””
cmd=新的OleDbCommand(sql+值,conn)
cmd.ExecuteNonQuery()
下一个
下一个
康涅狄格州关闭
返回文件名
捕获e作为例外
抛出新异常(例如消息)
返回字符串。空
结束尝试
端函数

检查系统的区域设置与其他机器的区域设置。 如果它们不同,则尝试匹配它们

此外,在使用办公自动化时,您应该强制执行线程文化。 在调用writeToExcelFile()之前设置此选项(C#语法):


调用该方法后,恢复区域性(如果需要)。

问题不在于此代码。问题在于传入的数据集

抛出任何错误?(1)在catch块中,要么返回,要么抛出,不能同时执行这两个操作。(2) 其他用途是否具有相同版本的excel?(3) 他们是否具有读取和写入文件和模板的正确权限,旧文件是否被删除?(4) 你能添加更多的日志记录来了解目标系统上到底发生了什么吗?1)好的,我来看看我是否能在没有返回的情况下获得更多信息。2) 不,他们有2003年,我有2007年,但我正在创建一个.xls。3) 通常不传入任何内容作为模板,即创建目标文件。4) 是的,我可以,我应该在哪里添加语句?我实际上没有使用Excel automation,该导入是早期版本的遗留。无论如何,您可以检查区域设置吗?您指的是什么区域设置?电脑时钟的时区?不,是Windows 7控制面板中名为Region and Language的时区所有区域和语言设置在两台机器上看起来都一样。(都是XP)
Public Shared Function writeToExcelFile(ByVal template As String, ByVal filename As String, ByVal data As DataSet) As String
    If File.Exists(filename) Then
        File.Delete(filename)
    End If
    If template <> String.Empty AndAlso filename <> String.Empty Then
        File.Copy(template, filename)
    End If

    Dim connString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filename + ";Extended Properties=""Excel 8.0;HDR=Yes;"""
    Dim conn As New OleDbConnection(connString)

    Try
        conn.Open()

        Dim cmd As New OleDbCommand()

        For Each table As DataTable In data.Tables
            Dim tableName As String = table.TableName.Replace(" ", "")

            Dim tableCreate As String = "CREATE TABLE [" + tableName + "] ("

            Dim sql As String = "INSERT INTO [" + tableName + "$]("
            Dim colName As String = String.Empty

        For Each col As DataColumn In table.Columns
            colName = col.ColumnName.Replace("#", "num")

            If colName.Contains(" ") Then
                sql += " [" + colName.Replace("'", "") + "],"
            Else
                sql += " " + colName.Replace("'", "") + ","
            End If

            tableCreate += " [" + colName + "] varchar(255),"
        Next

        If tableCreate.EndsWith(",") Then
            tableCreate = tableCreate.TrimEnd(New [Char]() {","c})
        End If

        tableCreate += ") "

        cmd = New OleDbCommand(tableCreate, conn)
        cmd.ExecuteNonQuery()

        If sql.EndsWith(",") Then
            sql = sql.TrimEnd(New [Char]() {","c})
        End If

        sql += ") "

        For Each row As DataRow In table.Rows
            Dim values As String = " VALUES("

            For Each col As DataColumn In table.Columns
                Try
                    values += "'" + cleanString(row(col).ToString()).Substring(0, 250) + "...',"
                Catch e As Exception
                    values += "'" + cleanString(row(col).ToString()) + "',"
                End Try
            Next

            If values.EndsWith(",") Then
                values = values.TrimEnd(New [Char]() {","c})
            End If

            values += ") "
            cmd = New OleDbCommand(sql + values, conn)
            cmd.ExecuteNonQuery()
        Next
    Next
    conn.Close()
    Return filename
Catch e As Exception
    Throw New Exception(e.Message)
    Return String.Empty
End Try
End Function
System.Threading.Thread.CurrentThread.CultureInfo = new System.Globalization.CultureInfo("en-US");