2011-03-29 89 views
0

我有一个vb.net函数,它使用oledb创建一个电子表格,然后把它当作一个数据库,创建表格和插入值。该函数接受一个文件名和一个数据集,并在文件名返回时返回文件名。该功能在我的开发机器上很好地工作,但不是其他PC​​。下面是我的功能,代码有什么问题吗?有什么建议么?vb.net写作excel函数在一个pc上工作,但不在另一个

编辑:没有错误被抛出,结果文件不包含任何数据。

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 

....

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 
+0

是否引发了任何错误? – N0Alias 2011-03-29 19:32:19

+0

请参阅上面的编辑。 – MAW74656 2011-03-29 19:33:31

+0

(1)在你的catch块中返回或抛出,你不能同时执行这两个操作。 (2)其他用途是否具有相同版本的Excel? (3)他们是否具有读取和写入文件和模板的正确权限,旧文件是否被删除? (4)您是否可以添加更多日志记录以准确找出目标系统上发生的情况? – 2011-03-29 19:44:43

回答

0

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

0

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

另外,使用Office Automation时,应强制将线程的文化设置为en-US。 只调用writeToExcelFile()(C#语法)之前设置这样的:

System.Threading.Thread.CurrentThread.CultureInfo = new System.Globalization.CultureInfo("en-US"); 

调用该方法后,还原文化(如果需要)。

+0

我实际上并未使用Excel自动化,导入是早期版本的遗留物。 – MAW74656 2011-03-29 19:47:26

+0

无论如何,你能检查区域设置吗? – Adi 2011-03-29 20:02:37

+0

你指的是哪些区域设置? PC时钟的时区? – MAW74656 2011-03-29 20:18:26