如何修改ArcGIS的字段属性,修改DBF文件;EXCEL修改ACCESS数据库的内容;用EXCEL修改ACCESS

分类: 365平台官方 📅 2025-07-17 01:48:33 👤 admin 👁️ 9858 ❤️ 605
如何修改ArcGIS的字段属性,修改DBF文件;EXCEL修改ACCESS数据库的内容;用EXCEL修改ACCESS

ArcGIS字段属性的方法---如果是大批量修改的,改前备份一下原数据,因为下面这3个修改方式本质上都一样,都是不可逆的,数据是黄金,多备份总没错。

1、系统内修改,如果会用VB和python,系统内修改效率最高,如果数据量太大,可能还是在数据库里update语句效率高;

2、shp格式,直接修改dbf文件。记住:用wps打开修改后可以直接保存;MS office高版本不支持直接保存,这点要吹一把wps,以前是个office2003的重度用户,都不敢升级到2007,现在发现WPS完全支持office2003特别是EXCEL.

参考这篇文章:

win10系统下如何修改ArcGIS的dbf文件_登山之猪金金金华好-GIS的博客-CSDN博客_arcgis dbf文件

3、mdb格式,用access打开后修改(如果会update语句,可以试着网上找个access查询器,在查询器里边写SQL语句改会方便一点),或者用excel链接access后修改;

下面说的是通过excel修改access的总体思路:access 导出到excel 修改完成后导回到access

尽量不要修改表结构,就是不要增加行,删除行,增加列,删除列,改改数据安全性高很多,万一arcgis改版本,改数据结构,尽管现在看都是存在一条数据中,shape存的是矢量的数据,改个属性应该问题不大,不要去改个矢量,看我的VBA中也是有几列不去updata的;

sheet3如下,这个是基本设置,前面3行要设置好了。就是告诉程序数据在哪里,要操作那个表格

excel读取access里边的某个表格,然后修改提交

查询数据=Private Sub C_select_Click()--- 把数据从access数据库中查出来 更新数据=Private Sub C_update_Click()---在excel里边修改完成后,写回到access

导入核对= Private Sub C_check_Click() ---这个函数是核对一下写入是否正确,对比数据库中的数据和查询出来的数据,对比过程是把数据再查询出来到sheet2,然后对两个sheet的数据进行比较,如果不一样标红。

不一样的原因,第一:数据库字符串长度限制,第二数据字段属性比如数字,不能改成字符,更新会失败;

下面是具体的excel数据,跟下载的区别是:没有vba、没有图片,没有按钮,其他一样的,保存一个xml格式,然后用WPS打开就行(复制到一个记事本中,然后另存为abc.xml,然后用wps打开)

缪伟光User2018-05-26T08:35:34Z2022-05-21T09:00:43ZMicrosoft2052-11.1.0.101321860069802FalseFalse

OBJECTID_1ShapeOBJECTIDTBBHDLMCZLDWMCXMMCShape_LengShape_LengthShape_Area101 甲乙01107.7292086310262563.1291520801202 sfef不能打0480.34963835363810920.7207650812303电放费dd纷纷0854.16351596292537042.9448216153404 得分纷纷01198.7863266464273417.3455450288
960060000343R5C4FalseFalseOBJECTID_1ShapeOBJECTIDTBBHDLMCZLDWMCXMMCShape_LengShape_LengthShape_Area101 甲乙01107.7292086310262563.1291520801202 sfef不能打0480.34963835363810920.7207650812303电放费dd纷纷0854.16351596292537042.9448216153404 得分纷纷01198.7863266464273417.3455450288
30353R6C4FalseFalse数据库地址:D:\testdb.mdb说明:绝对路径查询表名称test1设置主键OBJECTID_1注意事项:OBJECTID千万不能修改;第一行的名称不能修改,可以删除多列除了objectid这列,可以删除任意行除了第一行核对导入用于核对是否导入完整,有时候文本列,只输入数字,不导入,或者数字列输入文本不导入修改日志20191210基本可用20200925修改主键,查询前先看表格是否存在447023076报错,http://www.itmop.com/downinfo/445356.html,下载并安装打开属性表OBJECTID_1=主键OBJECTID_12是主键一般带*的是主键
960060000381R9C2FalseFalse

下面是具体的VBA内容

放在sheet1里边就行

Option Explicit

Sub 数据库连接()

'告诉电脑,我们要有ado,引用ado

'创建连接对象

'给对象取名字

Dim con As ADODB.Connection '声明对象变量

'创建对象变量并赋值

Set con = New ADODB.Connection

'建立数据库的连接

'dim con as new adodb.connection

'con.Open "provider=microsoft.ace.oledb.12.0;data source=" & ThisWorkbook.Path & "\学生管理.accdb"

'MsgBox "连接成功"

With con

.Provider = "microsoft.ace.oledb.12.0"

.ConnectionString = ThisWorkbook.Path & "\miaotest.mdb"

.Open

End With

MsgBox "连接成功-数据库连接1"

End Sub

Sub 插入记录()

Dim con As ADODB.Connection '声明对象变量

'创建对象变量并赋值

Set con = New ADODB.Connection

'建立数据库的连接

With con

.Provider = "microsoft.ace.oledb.12.0"

.ConnectionString = ThisWorkbook.Path & "\miaotest.mdb"

.Open

End With

MsgBox "连接成功-插入"

'insert into 表名(列1,列2)values(值1,值2,值3)

Dim sql As String

sql = "insert into 院系(院系编号,院系名,电话) values('A09','人文学院','9999')"

con.Execute (sql)

'释放空间变量

con.Close '关闭连接

Set con = Nothing '释放空间

End Sub

Sub 删除记录()

Dim con As New ADODB.Connection

con.Open "provider=microsoft.ace.oledb.12.0;data source=" & ThisWorkbook.Path & "\miaotest.mdb"

'Dim sql As String

'sql = "delete from 院系 where 院系编号=''"

Dim sql As String

'sql = "update 院系 set 电话='' where 院系名 =''"

Dim str As String

str = InputBox("输入性别", "提示")

sql = "update 学生 set 班级='2班' where 性别='" & str & " '"

con.Execute (sql)

con.Close '关闭连接

Set con = Nothing '释放空间

End Sub

Sub 简单查询()

Dim con As New ADODB.Connection

Dim str As String

str = Sheet2.Cells(1, 2) ' ThisWorkbook.Path & "\miaotest.mdb"

con.Open "provider=microsoft.ace.oledb.12.0;data source=" & str

Dim sql, stable As String

stable = Sheet2.Cells(2, 2)

sql = "select * from " & stable

'获取记录集

Dim rs As New ADODB.Recordset

Set rs = con.Execute(sql)

'获取字段名

Dim i As Integer

For i = 0 To rs.Fields.Count - 1

Cells(1, i + 1) = rs.Fields(i).Name

Next

'将记录集rs的记录返回到工作表中

Range("A2").CopyFromRecordset rs

rs.Close: Set rs = Nothing

con.Close: Set con = Nothing

End Sub

Sub 更新表()

Dim con As New ADODB.Connection

Dim stable1, stable2, ssql, scl As String

Dim i, j As Integer

Dim sql, sql1, sqlfield, stable As String

Dim str, sa1, sa2, zhujian As String

checktable

str = Sheet2.Cells(1, 2) ' ThisWorkbook.Path & "\miaotest.mdb"

stable = Sheet2.Cells(2, 2)

zhujian = Sheet2.Cells(3, 2)

con.Open "provider=microsoft.ace.oledb.12.0;data source=" & str

'select * into abcd from abc where 1<>1

sqlfield = ""

' For i = 1 To Sheets("Sheet1").Cells(1, Columns.Count).End(xlToLeft).Column - 1

j = Cells(1, Columns.Count).End(xlToLeft).Column

For i = 1 To j

If Sheet1.Cells(1, i) <> "" Then

sqlfield = sqlfield + "," + Cells(1, i)

Else: Exit For

End If

Next

sqlfield = Right(sqlfield, Len(sqlfield) - 1)

sql = "select " & sqlfield & " into " & stable & "_173 from " & stable & " where 1<>1"

Debug.Print sql

con.Execute (sql)

'插入数据

sql1 = "INSERT INTO " & stable & "_173" & " SELECT * FROM [Excel 8.0;Database=" _

& ThisWorkbook.FullName & ";].[" & ActiveSheet.Name & "$" & Range("A1").CurrentRegion.Address(0, 0) & "]"

Debug.Print sql1

con.Execute (sql1)

sql = "select * from " & stable & "_173"

Dim rs As New ADODB.Recordset

Set rs = con.Execute(sql)

stable1 = stable

stable2 = stable & "_173"

sa1 = zhujian '"OBJECTID"

sa2 = zhujian '"OBJECTID"

scl = ""

' Set rs = CurrentDb.OpenRecordset("SELECT * FROM " & stable1)

For i = 0 To rs.Fields.Count - 1

If rs.Fields(i).Name <> "Shape" And rs.Fields(i).Name <> sa1 Then

scl = scl & stable1 & "." & rs.Fields(i).Name & "=" & stable2 & "." & rs.Fields(i).Name & ","

End If

Next

scl = Left(scl, Len(scl) - 1)

ssql = "update " & stable1 & "," & stable2 & " set " & scl & " where " & stable1 & "." & sa1 & "=" & stable2 & "." & sa2

Debug.Print ssql

con.Execute (ssql)

rs.Close: Set rs = Nothing

con.Close: Set con = Nothing

con.Open "provider=microsoft.ace.oledb.12.0;data source=" & str

Sheet3.UsedRange.ClearContents

stable = Sheet2.Cells(2, 2)

sql = "select * from " & stable2

'获取记录集

Set rs = con.Execute(sql)

'获取字段名

For i = 0 To rs.Fields.Count - 1

Sheet3.Cells(1, i + 1) = rs.Fields(i).Name

Next

'将记录集rs的记录返回到工作表中

Sheet3.Range("A2").CopyFromRecordset rs

rs.Close: Set rs = Nothing

con.Close: Set con = Nothing

con.Open "provider=microsoft.ace.oledb.12.0;data source=" & str

sql = "drop table " & stable & "_173"

' Debug.Print sql

con.Execute (sql)

con.Close: Set con = Nothing

MsgBox "数据更新完毕"

End Sub

Sub checktable() '检查数据表是否存在()

Dim mydata As String

Dim mytable, sql As String

Dim con As New ADODB.Connection

Dim rs As New ADODB.Recordset

mydata = Sheet2.Cells(1, 2) ' ThisWorkbook.Path & "\miaotest.mdb"

mytable = Sheet2.Cells(2, 2) & "_173"

With con

.Provider = "microsoft.ace.oledb.12.0"

.Open mydata

End With

'利用connection对象的openschema方法产生数据表记录集

Set rs = con.OpenSchema(adSchemaTables)

'利用循环查询判断是否存在该数据表

' Do While Not rs.EOF

' 'rs!table_name=rs("table_name")

' If LCase(rs!table_name) = LCase(mytable) Then

' MsgBox "数据表《" & mytable & "》存在"

' GoTo hhh

' End If

' rs.MoveNext

'

' Loop

' MsgBox "数据表《" & mytable & "》不存在"

'利用recordset 对象的find方法查找数据表并判断是否存在

'find 方法会直接将光标定位到找的记录,如果没有找的,则将光标移动到eof

rs.Find "table_name='" & mytable & "'"

If rs.EOF Then

Else

sql = "drop table " & mytable

'Debug.Print sql

con.Execute (sql)

End If

hhh:

rs.Close

con.Close

Set rs = Nothing

Set con = Nothing

End Sub

Sub 错误捕捉()

Dim mydata As String

Dim mytable As String

Dim con As New ADODB.Connection

mydata = Sheet2.Cells(1, 2) ' ThisWorkbook.Path & "\miaotest.mdb"

mytable = Sheet2.Cells(2, 2) & "_173"

With con

.Provider = "microsoft.ace.oledb.12.0"

.Open mydata

End With

On Error Resume Next '遇到错误,继续往下执行

'删除数据表

con.Execute "drop table " & mytable

If Err.Number <> 0 Then

MsgBox Err.Description

Else

MsgBox "该表存在"

End If

con.Close

Set con = Nothing

End Sub

Private Sub C_select_Click()

Sheet1.UsedRange.ClearContents

简单查询

End Sub

Private Sub C_update_Click()

C_select.Visible = False

更新表

End Sub

Private Sub C_check_Click()

Dim con As New ADODB.Connection

Dim stable1, stable2, ssql, scl As String

Dim i, j, il, cl As Integer

Dim sql, sql1, sqlfield, stable As String

Dim str, sa1, sa2 As String

il = Cells(Rows.Count, 1).End(xlUp).Row

cl = Cells(1, Columns.Count).End(xlToLeft).Column

For i = 1 To il

For j = 1 To cl

If Sheet1.Cells(i, j) <> Sheet3.Cells(i, j) Then

Sheet1.Cells(i, j).Interior.ColorIndex = 3

Else

' Sheet1.Cells(i, j).Font.ColorIndex = 3

Sheet1.Cells(i, j).Interior.Pattern = xlNone

End If

Next

Next

End Sub

Private Sub Worksheet_Activate()

Sheet1.C_select.Visible = True

End Sub

下面这段短的放在thisworkbook中 --就是防止导出误点,改着改着又点一次导出就覆盖刚才修改的内容;所以设置一下,点导出后,把导出按钮隐藏;再次打开这个表格就又看到了;

Private Sub Workbook_open()

Sheet1.C_select.Visible = True

End Sub

具体操作很简单,第一导出数据点一下,第二自行修改,第三导入数据点一下,然后点一下核对数据看看有没有红色的,如果有红色的,那就自己找找原因修改一下。改access数据前建议先备份一下,毕竟这个过程不可逆。

相关文章