非常好的社区!在我对 excel 表进行修改(更新)之前,我已经遇到过以下问题,但我总能找到解决方案……但……不是现在……而且最有趣的是,我一直在关注微软在其官方页面上提到的步骤(英文): https: //support.microsoft.com/en-us/kb/316934
使用 ADO.NET,您可以通过以下三种方式之一在工作簿中插入和更新记录: 直接运行命令,一次插入或更新一条记录。为此,您可以在连接上创建一个OLEDbCommand对象并将其CommandText属性设置为有效的命令以插入记录
INSERT INTO [Sheet1$] (F1, F2) 值('111', 'ABC')
或更新记录的命令
更新 [Sheet1$] SET F2 = 'XYZ' 其中 F1 = '111'
然后调用 ExecuteNonQuery 方法。
在我的程序中,我有根据作为参数传递的列收集工作表的函数和方法,以及返回空单元格的确切位置或有错误(A1、B2、C15 ...)的函数我比较有时,如果函数返回所需的内容,并且是的......它们都工作正常......那么问题将是替换函数本身......
Protected Friend Sub reemplazarDato(ByVal DColumn As String, ByVal headerCell As String, ByVal cell As String, ByVal dato As String)
Dim hoja As String = obtenerHojaActual(DColumn)
Dim comando As New OleDbCommand
comando.Connection = conexion
comando.CommandText = "UPDATE [" & hoja & "$] SET [" & cell & "]=@dato WHERE [" & headerCell & "]=@DColumn"
comando.Parameters.Add("@dato", OleDbType.Date).Value = dato
comando.Parameters.Add("@DColumn", OleDbType.VarChar).Value = DColumn
MsgBox(comando.CommandText)
MsgBox("Dato nuevo: " + comando.Parameters(0).Value + " en la columna: " + comando.Parameters(1).Value)
conexion.Open()
Try
comando.ExecuteNonQuery()
Catch ex As Exception
cajaMensaje("Error inesperado", ex.Message, My.Resources._error).ShowDialog()
End Try
conexion.Close()
comando.Dispose()
End Sub
插入这些消息框是为了验证数据是否正确插入以及查询是否正确写入。我将引用一个我现在正在尝试的示例......我正在尝试更改此 Excel 表的单元格 C2 的值:
打印程序的 mssgbox 的 commandText...
注意与微软的相似之处:UPDATE [Sheet1$] SET F2 = 'XYZ' WHERE F1 = '111'
在他们回答我“是你必须从代表列的值中删除括号”之前,不,我已经删除了它们并且它不起作用(此外,同一页面建议使用它们标记列时),我还尝试使用连接进行常规查询,但没有任何内容(同一页面还建议在编写时使用带参数的查询)...
这个奇怪的问题会是什么?
更新
在网上阅读有关该问题的信息,我发现了其他东西;您需要禁用 HDR 属性才能修改特定单元格。在连接的 String 属性中插入一个参数,以指示它是否会在某个操作上被激活或停用。
Protected Friend Property setConnection(ByVal hdr As String) As String
Set(value As String)
Try
conexion.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & value & ";Extended Properties='Excel 8.0;HDR=" & hdr & ";IMEX=0;TypeGuessRows=0;'"
Catch ex As Exception
cajaMensaje("Error inesperado", ex.Message, My.Resources._error).ShowDialog()
End Try
End Set
Get
Return conexion.ConnectionString
End Get
End Property
我还发现应该指定一个范围来修改该单元格。我做了以下但对我不起作用(它给我带来了同样的错误......)老实说,我不明白这个范围。那么方法如下:
Protected Friend Sub reemplazarDato(ByVal DColumn As String, ByVal cell As String, ByVal dato As String)
Dim hoja As String = obtenerHojaActual(DColumn)
Dim comando As New OleDbCommand
setConnection("NO") = setRuta
MsgBox(conexion.ConnectionString)
comando.Connection = conexion
comando.CommandText = "UPDATE [" & hoja & "$" & cell & ":" & cell & "] SET [" & cell & "]=@dato"
MsgBox(comando.CommandText)
comando.Parameters.Add("@dato", OleDbType.VarChar, dato.Length).Value = dato
conexion.Open()
Try
comando.ExecuteNonQuery()
Catch ex As Exception
cajaMensaje("Error inesperado", ex.Message, My.Resources._error).ShowDialog()
End Try
conexion.Close()
comando.Dispose()
End Sub
我在32 位上调试代码,并找到了问题的原因。
问题中的链接非常有帮助,尤其是How To Use ADO.NET to Retrieve and Modify Records in an Excel Workbook With Visual Basic .NET
要在Excel
UPDATE
工作表中执行此操作,我们有两种选择:带或不带表头。1. 带表头或者也叫记录更新
标题是列的名称,当它出现时,它必须通过属性在连接字符串中指示
HDR=YES
:通过这种方式,我们可以
UPDATE
像对数据库的任何查询一样进行语句:UPDATE Tabla SET campo1 = valor1, campo2 = valor2, ...
对于问题代码:
该列
C
的名称Date
是保留字,因此括号的使用是必不可少的,[
相反]
我们Name
看到它不需要它们。有趣的是它适用
Excel 8.0
于电机ACE 12.0
2. 无表头或也称为单个单元格更新
这一次,我们需要在连接字符串中设置属性
HDR=NO
:IMEX
并且TypeGuessRows
它们不能在这里使用,因为它们依赖于具有列标题的行,即它们仅在以下情况下使用HDR=YES
这里的句子
UPDATE
, 需要遵循一些规则:指定要更新的单元格范围。
代替列名,使用字母F后跟序号,表示列。
例如,要更改标题:
按单元格的名称:
必须做:
对于问题代码:
我使用
DateSerial
, 来避免日期格式的问题。即使只更新了一个单元格,也必须始终指明单元格范围。