ArcGis dbf读写——挂接Excel到属性表 C#
ArcMap提供了挂接Excel表格信息到属性表的功能,但是当数据量较大到以万计甚至十万计的时候这个功能就歇菜了,当然,你可以考虑分段挂接。这个挂接功能只是做了一个表关联,属性记录每个字段的信息需要通过“字段计算器”计算过来。
Excel数据写入ArcGis属性表功能开发实例中,博主见到太多使用UpdateCursor的方式,界面卡翔,效率感人。
ArcGis Shapefile的属性表信息存放在一个dbf格式(dbaseIV,dbf4,dbase4,下称dbf4)的文件中,那么,有没有一种方式可以通过直接对它的读写实现快速挂接?通过数据库连接的方式可以实现,但是对客户机的环境配置有要求,起码得有OLEDB、ODBC驱动……,这样整不爽。那么,有没有一种方式可以借由第三库或者某种方式去直接解析它呢?博主去分析了这个可能,DBF文件的结构并不复杂,找个比较成熟的轮子来研究解析最好不过,去年,博主在GitHub发现了它——“FastDBF”,地址:https://github.com/SocialExplorer/FastDBF。该库作者是老外,所以不出意外的对于中文环境下dbf文件的读写不友好,有点儿小bug,相关说明可以查找本人博客。
优点:插件方式开发下不操作ArcObject对象,并且可以使用多线程+委托的方式使挂接在子线程进行,进度传回主线程更新UI,挂接速度快且不影响ArcMap的浏览使用。

- dbf4文件格式与解析
本篇不讲,可以自行百度或参考:
https://www.clicketyclick.dk/databases/xbase/format/dbf.html
需要提醒的是网上的格式解析说明文章都将dbf4编码规则默认为ANSI(中文操作系统下是gbk,codepage=936,在非英文操作系统下,这些文章写为ASCII并不严谨)去解析,而实际上ArcGis10.2之后版本生成的dbf文件默认使用了utf-8(codepage65001)编码。这就牵涉到了“FastDBF”在中文环境下的bug。
- FastDBF读写dbf4文件
打开dbf文件,注意选择字符编码规则
var odbf = new DbfFile(Encoding.GetEncoding(rdoGBK.Checked ? : ));
odbf.Open(dbfPath, FileMode.Open);
读取记录数、字段数、长度
var header=odbf.Header;
int dbfRecordCount=Convert.ToInt32( header.RecordCount);
//header.ColumnCount字段数
for (int i = ; i < header.ColumnCount; i++)
{
this.dataGridView2.Rows.Add();
//字段名
this.dataGridView2[, i].Value = header[i].Name;
//字段类型
this.dataGridView2[, i].Value = header[i].ColumnType.ToString();
//字段长度与小数位
if (header[i].DecimalCount!=)
{
this.dataGridView2[, i].Value = header[i].Length.ToString() + "," + header[i].DecimalCount;
}
else
this.dataGridView2[, i].Value = header[i].Length.ToString();
}
从DataTable中匹配记录挂接,Excel装入DataTable可以使用epplus,不讲。
var odbf = new DbfFile(Encoding.GetEncoding(prms.encode));
DbfRecord orec;
try
{
odbf.Open(prms.dbfPath, FileMode.Open);
orec = odbf.Read();
int i = ;
while (orec != null)
{
DataRow[] dataRows = dt.Select(linkFieldNameExcel + "=" + "'" + orec[prms.linkFieldIndexShp].ToString() + "'");
if (dataRows.Count() > )
{
DataRow dr = dataRows.First();
foreach (var item in prms.updateFieldPrms)
{ string content=dr[item.fieldNamesExcel].ToString();
int byteCount= Encoding.GetEncoding(prms.encode).GetByteCount(content);
if (byteCount<=item.fieldLength)
{
orec[item.fieldNameDbf] = content;
}
}
odbf.Update(orec);
}
orec = odbf.ReadNext();
ProgressChanged(this, i);
i++;
}
}
catch (Exception)
{
throw new Exception("dbf挂接过程出错!");
}
finally
{
dt.Dispose();
orec = null;
odbf.Close();
}
ArcGis dbf读写——挂接Excel到属性表 C#的更多相关文章
- ArcGis——好好的属性表,咋就乱码了呢?
我就瞎说一下,反正你也不懂. ——见到许多ArcGis属性表乱码的问题,也见过各种哭笑不得的解说 目录 第一节 字符编码那些事儿→字符编码简述 第二节 都是编码惹的祸→ArcGis属性表出错原因 第三 ...
- ArcGis 属性表.dbf文件使用Excel打开中文乱码的解决方法
2019年4月 拓展: ArcGis——好好的属性表,咋就乱码了呢? 2019年3月27日补充: 在ArcMap10.3+(根据官网描述应该是,作者测试使用10.5,可行)以后的版本,可以使用ArcT ...
- 如何将Excel表批量赋值到ArcGIS属性表
情景再现 现需要将Excel表信息批量赋值(不是挂接)到Shp文件的属性表,两张表的字段.记录数一模一样,至于为什么会出现这样的问题,咱也不敢问,只有想个法子把它搞定! 原始的Excel信息表共57列 ...
- ArcGIS自定义脚本-通过txt/excel/dbf/table生成多边形要素类
ArcGIS自定义脚本-通过txt/excel/dbf/table生成多边形要素类 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:读取文本文件,常见多边形要素 ...
- 解析ArcGis的字段计算器(二)——有玄机的要素Geometry属性,在属性表标记重复点线面
这里所说的重复是指完成重复的,不是叠在一起的两个或多个要素,这种应该叫做“压盖”或“重叠”.重复往往是在合并多Shpfile文件时不小心重复导入造成的. 这里提供一种可能的解决办法,数据无价,请备份! ...
- ArcGIS学习记录—属性表的编辑与修改
原文地址: ArcGIS问题:属性表的编辑与修改 - Silent Dawn的日志 - 网易博客 http://gisman.blog.163.com/blog/static/344933882009 ...
- Arcgis for Javascript之featureLayer图和属性互操作性
说明:主要实现加载FeatureLayer并显示属性表,而要实现联动属性表与地图,首先,看看实施后的效果: 显示效果 如上图所看到的,本文章主要实现了下面几个功能:1.FeatureLayer属性表的 ...
- Arcgis for Javascript之featureLayer图和属性的互操作
说明:主要实现加载FeatureLayer与显示属性表,并实现属性表与地图的联动,首先,看看实现后的效果: 显示效果 如上图所示,本文章主要实现了以下几个功能:1.FeatureLayer属性表的分页 ...
- C# 读写xml、excel、word、ppt、access
C# 读写xml.excel.word.access 这里只是起个头,不做深入展开,方便以后用到参考 读写xml,主要使用.net 的xml下的document using System;using ...
随机推荐
- Swift构造
构造就是将结构体.类或枚举的实例准备好以便使用的过程.这个过程包括: (1)为实例中的每个存储属性设置初始值. (2)执行必要的准备和初始化工作. 实例的构造过程是通过构造器来完成的. 可以在结构体. ...
- 运行SSIS包的六种方式
注意: 1~5都需要SSIS安装在对应的机器上. 一.直接在Data Tool里运行 右键选择要运行的包,然后直接选择运行包 二.使用SQL Server的Job作业 可以选择:a. File Sys ...
- console.table(),在控制台以表格形式输出对象
今天给大家安利一个属性,console.table(). 它的作用在控制台以表格的形式显示object.这样看起来是不是更方便了呢. var aaa = [ {index:0,name:"1 ...
- 洛谷-p4555
题意:给你一个串,问你以i结尾的回文串加上以i+1开头的回文串的最大长度 解题思路:回文自动机板子题,记录下每次正着添加字符的时候,当前字符能够到达的最大回文子串的长度和倒着添加字符的时候,能够到达的 ...
- SIM 800C指令笔记
拨号ATD137xxxxxxxx; 挂断-对方挂断收到NO CARRIER消息 挂断-主动挂断ATH 接电话ATA 打入电话消息RING 设置来电电话号码显示AT+CLIP=1显示消息格式:+CLIP ...
- selenium跳过webdriver检测并模拟登录淘宝
目录 简介 编写思路 使用教程 演示图片 源代码 @(文章目录) 简介 模拟登录淘宝已经不是一件新鲜的事情了,过去我曾经使用get/post方式进行爬虫,同时也加入IP代理池进行跳过检验,但随着大型网 ...
- html简单的知识
分布式版本控制git pwd查询当前目录 ls ls -la git config --global user.name xxx git config --global user. ...
- App Inventor2项目部署到本地
介绍App Inventor App Inventor 原是Google实验室(Google Lab)的一个子计划,该项目是一个完全在线开发的Android编程环境,抛弃复杂的程式代码而使用积木式的堆 ...
- 在IIS上搭建Exceptionless日志收集框架
系统环境要求 .NET 4.6.1,如果已安装过VS请忽略.Java Sdk1.8+,Win10环境下配置Java 环境变量参考,ElasticSearch 5.1,它是一个基于Lunce搜索服务器. ...
- Python网络爬虫精要
目的 学习如何从互联网上获取数据.数据科学必须掌握的技能之一. 本文所用到的第三方库如下: requests, parsel, selenium requests负责向网页发送HTTP请求并得到响应, ...