日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

ArcGis dbf读写——挂接Excel到属性表 C#

發(fā)布時(shí)間:2023/12/20 C# 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ArcGis dbf读写——挂接Excel到属性表 C# 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

ArcMap提供了掛接Excel表格信息到屬性表的功能,但是當(dāng)數(shù)據(jù)量較大到以萬計(jì)甚至十萬計(jì)的時(shí)候這個(gè)功能就歇菜了,當(dāng)然,你可以考慮分段掛接。這個(gè)掛接功能只是做了一個(gè)表關(guān)聯(lián),屬性記錄每個(gè)字段的信息需要通過“字段計(jì)算器”計(jì)算過來。

Excel數(shù)據(jù)寫入ArcGis屬性表功能開發(fā)實(shí)例中,博主見到太多使用UpdateCursor的方式,界面卡翔,效率感人。

ArcGis Shapefile的屬性表信息存放在一個(gè)dbf格式(dbaseIV,dbf4,dbase4,下稱dbf4)的文件中,那么,有沒有一種方式可以通過直接對它的讀寫實(shí)現(xiàn)快速掛接?通過數(shù)據(jù)庫連接的方式可以實(shí)現(xiàn),但是對客戶機(jī)的環(huán)境配置有要求,起碼得有OLEDB、ODBC驅(qū)動(dòng)……,這樣整不爽。那么,有沒有一種方式可以借由第三庫或者某種方式去直接解析它呢?博主去分析了這個(gè)可能,DBF文件的結(jié)構(gòu)并不復(fù)雜,找個(gè)比較成熟的輪子來研究解析最好不過,去年,博主在GitHub發(fā)現(xiàn)了它——“FastDBF”,地址:https://github.com/SocialExplorer/FastDBF。該庫作者是老外,所以不出意外的對于中文環(huán)境下dbf文件的讀寫不友好,有點(diǎn)兒小bug,相關(guān)說明可以查找本人博客。

優(yōu)點(diǎn):插件方式開發(fā)下不操作ArcObject對象,并且可以使用多線程+委托的方式使掛接在子線程進(jìn)行,進(jìn)度傳回主線程更新UI,掛接速度快且不影響ArcMap的瀏覽使用。

  • dbf4文件格式與解析

本篇不講,可以自行百度或參考:

https://www.clicketyclick.dk/databases/xbase/format/dbf.html

需要提醒的是網(wǎng)上的格式解析說明文章都將dbf4編碼規(guī)則默認(rèn)為ANSI(中文操作系統(tǒng)下是gbk,codepage=936,在非英文操作系統(tǒng)下,這些文章寫為ASCII并不嚴(yán)謹(jǐn))去解析,而實(shí)際上ArcGis10.2之后版本生成的dbf文件默認(rèn)使用了utf-8(codepage65001)編碼。這就牽涉到了“FastDBF”在中文環(huán)境下的bug。

  • FastDBF讀寫dbf4文件

打開dbf文件,注意選擇字符編碼規(guī)則

var odbf = new DbfFile(Encoding.GetEncoding(rdoGBK.Checked ? 936 : 65001)); odbf.Open(dbfPath, FileMode.Open);

讀取記錄數(shù)、字段數(shù)、長度

var header=odbf.Header; int dbfRecordCount=Convert.ToInt32( header.RecordCount); //header.ColumnCount字段數(shù) 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(); //字段長度與小數(shù)位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掛接過程出錯(cuò)!"); } finally {dt.Dispose();orec = null;odbf.Close(); }

?

轉(zhuǎn)載于:https://www.cnblogs.com/yzhyingcool/p/10657350.html

總結(jié)

以上是生活随笔為你收集整理的ArcGis dbf读写——挂接Excel到属性表 C#的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。