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 ? 936 : 65001));
odbf.Open(dbfPath, FileMode.Open);

读取记录数、字段数、长度

var header=odbf.Header;
int dbfRecordCount=Convert.ToInt32( header.RecordCount);
//header.ColumnCount字段数
for (int i = 0; i < header.ColumnCount; i++)
{this.dataGridView2.Rows.Add();
//字段名this.dataGridView2[0, i].Value = header[i].Name;
//字段类型this.dataGridView2[2, i].Value = header[i].ColumnType.ToString();
//字段长度与小数位if (header[i].DecimalCount!=0){this.dataGridView2[3, i].Value = header[i].Length.ToString() + "," + header[i].DecimalCount;}elsethis.dataGridView2[3, 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(0);int i = 1;while (orec != null){DataRow[] dataRows = dt.Select(linkFieldNameExcel + "=" + "'" + orec[prms.linkFieldIndexShp].ToString() + "'");if (dataRows.Count() > 0){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();
}

 

转载于:https://www.cnblogs.com/yzhyingcool/p/10657350.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JQuery. Parse XML children recursively. How? - Stack Overflow

JQuery. Parse XML children recursively. How? - Stack OverflowJQuery. Parse XML children recursively. How?

presto领读 查询引擎翻译

原文链接&#xff1a;https://prestodb.io/docs/current/overview/concepts.html#data-sources 最近在看presto-分布式SQL查询引擎的代码&#xff0c;使用翻译工具翻译了一版&#xff0c;有些概念比较难以理解&#xff0c;整理如下&#xff1a; 一、概览 虽然很容易理解语句和…

VisualStudioAddIn2017.vsix的下载安装和使用

本加载项是用于Visual Studio的&#xff0c;下载以后按照如下步骤进行安装&#xff1a; 完全退出Visual Studio把下载了的文件解压缩&#xff0c;会产生一个VisualStudioAddIn2017.vsix文件双击该文件&#xff0c;按照提示安装重启Visual Studio安装完成后的使用方法&#xff0…

Presto基本概念

Presto基本概念 Presto是Facebook开源的MPP SQL引擎&#xff0c;旨在填补Hive在速度和灵活性&#xff08;对接多种数据源&#xff09;上的不足。相似的SQL on Hadoop竞品还有Impala和Spark SQL等。这里我们介绍下Presto的基本概念&#xff0c;为后续的笔记做基础。 Operator …

2019春第六周编程总结

这个作业属于哪个课程C语言程序设计Ⅱ这个作业要求在哪里https://edu.cnblogs.com/campus/zswxy/MS/homework/2829我在这个课程的目标是利用指针知识解决相关实际问题在具体哪方面帮我实现目标设计密码开锁、交换变量解决问题以及电码加密参考文献C语言基础、http://www.w3scho…

昨天7月21号,笑笑又生病了

21号从上午就开始发烧,中午吃了安瑞克烧退了,但是下午6点左右又开始发烧了,再次吃安瑞克,效果不是太好,还是烧,睡了觉之后烧退了。晚上十点又开始发烧&#xff0c;吃美林悬浮液烧还是没退&#xff0c;又吃安瑞克&#xff0c;还是烧&#xff0c;到了一点钟,烧,但稍微好一点 22号…

Exchange企业实战技巧(26)在Outlook中打开多个邮箱

工作中&#xff0c;有时要需要让某个用户在outlook中同时打开多个exchange邮箱&#xff0c;对于outlook2010来说&#xff0c;是支持多个Exchange邮箱用户账户的并存&#xff0c;而outlook2007则不支持。那该功能有没其他实现方法呢&#xff1f;答案是有的。 如果你的Exchange是…

sql 为什么要用where 1=1或者where 1 =0 ?

一、不用where 11 在多条件查询中的困扰   举个例子&#xff0c;如果您做查询页面&#xff0c;并且&#xff0c;可查询的选项有多个&#xff0c;同时&#xff0c;还让用户自行选择并输入查询关键词&#xff0c;那么&#xff0c;按平时的查询语句的动态构造&#xff0c;代码…

Java元数据总结:Java注释的使用和定义

元数据从metadata一词译来&#xff0c;就是“关于数据的数据”的意思。越来越的开源框架都提供了“元数据”支持了&#xff0c;其实也就是注释支持。今天系统学习一下Java注释(Java元数据)。本文内容不限于Javadoc的注释。  1.什么是Java元数据&#xff0c;有什么作用?  元…

Emulator Error: Could not load OpenGLES emulati...

为什么80%的码农都做不了架构师&#xff1f;>>> 模拟器提示警告&#xff1a;Emulator Error: Could not load OpenGLES emulation library: Could not load DLL! 亲测可用&#xff1a; 从SDK\tools\lib目录下将一下四个dll文件复制到SDK\tools&#xff0c;重启模…

C++中的模板展开问题

在c中使用模板的目的是&#xff1a;减少代码量&#xff0c;相同功能的代码只写一份&#xff0c;根据传入不同的参数&#xff0c;实现相同的功能。 优点&#xff1a;减少了程序开发者的工作 量&#xff0c;只写一份相同功能的代码 缺点&#xff1a;编译器在展开时&#xff0c;每…

请教设计模式大牛们几点

我在做一个3D场景编辑器&#xff0c;假如所有物体从ObjectX而来&#xff0c;现在在此对象层&#xff0c;不知道如何设计出较好的结构来。问题如下&#xff1a; 1&#xff1a;每个物体都可以被单独的设置各种效果——阴影、多重纹理贴图、反射。 也可以设置一些动画&#xff1…

关于.net的垃圾回收和大对象处理_标记

CLR垃圾回收器根据所占空间大小划分对象。大对象和小对象的处理方式有很大区别。比如内存碎片整理 —— 在内存中移动大对象的成本是昂贵的&#xff0c;让我们研究一下垃圾回收器是如何处理大对象的&#xff0c;大对象对程序性能有哪些潜在的影响。 大对象堆和垃圾回收 在.Net …

TiKV 源码解析系列 - Raft 的优化

这篇文章转载TiDB大牛 唐刘 的博客&#xff1a;https://mp.weixin.qq.com/s?__bizMzI3NDIxNTQyOQ&mid2247484544&idx1&sn7d8e412ecc5aaeb3f9b7cf391bdcf398&chksmeb1623eadc61aafcefcfbdf36b388a5f96d3009d21641eb6ac67c57317d6c397ddeb58fc7d06&scene21#…

IE9 Preview 4的CSS3支持。

1、完美支持了box-shadow&#xff0c;无需前缀。【哈哈说曹操曹操到&#xff0c;还剩下text-shadow未支持了。】 2、有了支持CSS3 Gradient的迹象&#xff0c;但是很神奇的是IE9现在支持的是-webkit-gradient的写法&#xff0c;不过尚不支持color-stop。嗯&#xff0c;相信下个…

三篇文章了解 TiDB 技术内幕——说存储

此文转载了 申砾 PingCAP 的文章&#xff1a;https://mp.weixin.qq.com/s?__bizMzI3NDIxNTQyOQ&mid2247484822&idx1&sn5434362800d8dcc0ca69d2f3f3260173&chksmeb1622fcdc61abea428f74b26a24bc589d524dd3b666d9b124809300f488d00b33a315a87792&scene21#we…

复制数组方法总结

为什么80%的码农都做不了架构师&#xff1f;>>> 在java中&#xff0c;对数组复制有多种 1.通过循环来复制 比如用for循环 int a[]{1,2,3}; int b[]new int[a.length]; for(int i0;i<a.length;i){ b[i]a[i]; } 2.直接复制 int a[]{1,2,3}; int b[]a…

JS/Cs相互调用

js调用cs中函数的方法 在前台js代码里写上<%method();%>举例:cs文件中写的有public void method(){....执行某些操作.}这个函数,然后在前台页面的js里面调用.<script type"text/javascript"><%method();%></script>在cs中调用js函数法一:C…

学习进度_第六周

第六周主要就是针对结对开发项目&#xff0c;又赶上清明节假期&#xff0c;所以学习时间打了些折扣。 编程时间&#xff1a;课上3小时课下5小时。 博客1篇。转载于:https://www.cnblogs.com/flw0322/p/10680226.html

PostgreSQL体系架构

PostgreSQL 使用客户机/服务器&#xff08;C/S&#xff09;的模式提供服务&#xff0c;一个PostgreSQL会话由下列相关的进程&#xff08;程序&#xff09;组成&#xff1a; (1)一个服务器端进程。该进程管理数据库文件&#xff0c;接受客户端与数据库的连接&#xff0c;且代表…