python3 从MDB及GDB文件中导出EXCEL属性表

本文主要介绍如何使用pypyodbc库读写MDB文件、ogr库打开GDB文件、openpyxl库写入EXCEL文件。

具体实现代码中标注的很清楚,就不再赘述了。

#  coding:utf-8
#  design by @bill_love_3
import openpyxl
import pypyodbc

try:
    from osgeo import ogr
except ImportError:
    import ogr
import sys


class ExportCBDKXX(object):  # 导出承包地块信息表 dkbm,cbfbm,htmj,cbfmc,cbfzjhm,cbfdz,lxdh,gsshr mdb size:94908KB
    def __init__(self):
        self.gdb = ''  # gdb对象
        self.lis_mdb = []  # mdb查询结果
        self.dic_mdb = {}  # mdb过程字典
        self.list_ac = []  # 过程列表
        self.tup_gdb = ()  # gdb属性元组
        self.lis_gdb = []  # gdb属性列表
        self.lis_res = []  # 结果列表

    def Read_mdb(self, path):  # 读取MDB属性数据
        # 通过驱动连接MDB;Uid=;Pwd=;用户名;密码 可缺省
        conn = pypyodbc.connect(r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + path + ";Uid=;Pwd=;")
        # 建立数据库游标
        cursor = conn.cursor()
        # 数据库的SQL语句 是核心,读还是写都和SQL有关
        SQL_value = "select a.dkbm,a.cbfbm,a.htmj,b.cbfmc,b.cbfzjhm,b.cbfdz,b.lxdh,b.gsshr from CBDKXX a left join " \
                    "CBF b on (a.cbfbm=b.cbfbm) where dkbm is not null"  # CBDKXX 关联 CBF 查询承包方信息
        # 游标执行
        cursor.execute(SQL_value)  # type [(),(),()]
        # cursor.commit() 写入需要提交 读取可缺省
        # 读取的信息保存到类属性lis_mdb中
        self.lis_mdb = cursor.fetchall()
        # print(self.lis_mdb)

        conn.close()

    def Read_shp(self, path):  # 读取GDB图形属性
        ogr.UseExceptions()  # 使用ogr特定异常
        driver = ogr.GetDriverByName("OpenFileGDB")  # 获取驱动
        try:
            gdb = driver.Open(path, 0)  # 打开gdb文件
        except Exception as e:
            print(e)
            sys.exit()
        self.gdb = gdb
        # gdb对象的GetLayerByName方法确定图层(layer)
        layer = self.gdb.GetLayerByName("农村土地承包经营权_192639宗")
        # 获取要素数量
        FeatureCount = layer.GetFeatureCount()
        # 开始遍历要素 (按行)
        for ae in range(FeatureCount):
            oFeature = layer.GetNextFeature()
            oDefn = layer.GetLayerDefn()
            iFieldCount = oDefn.GetFieldCount()
            # 开始遍历字段 (按列)
            for iField in range(iFieldCount):
                oFieldDefn = oDefn.GetFieldDefn(iField)
                a = oFieldDefn.GetNameRef()
                c = oFeature.GetFieldAsString(iField).rstrip(' ')
                dict_ab: dict = {a: c}
                # 将{字段名称:字段值}写入list_ac列表
                self.list_ac.append(dict_ab)
        # 通过list_ac列表处理数据,整理形成[[(),(),()],[(),(),()]]元组矩阵方便写入excel
        try:
            aa = int(len(self.list_ac) / FeatureCount)
        except ZeroDivisionError:
            aa = 0
        for iii in range(FeatureCount):
            # print(iii)
            # print(self.list_ac[iii * aa: (iii + 1) * aa])
            b = self.list_ac[iii * aa: (iii + 1) * aa]
            # print(b)
            for ii in range(len(b)):
                i = b[ii]
                # print(i)
                for k, v in i.items():
                    # print(k, v)
                    if k == 'ZDDM':
                        self.tup_gdb = self.tup_gdb + (v,)
                    elif k == 'BDCDYH':
                        self.tup_gdb = self.tup_gdb + (v,)
                    elif k == 'ZL':
                        self.tup_gdb = self.tup_gdb + (v,)
                    elif k == 'ZDMJ':
                        self.tup_gdb = self.tup_gdb + (v,)
                    elif k == 'DKBM':
                        self.tup_gdb = self.tup_gdb + (v,)
                        self.lis_gdb.append(self.tup_gdb)
                        self.tup_gdb = ()
                    break

    def Save_excel(self, path):  # 写入excel方法
        # 按需求处理数据
        for t in range(len(self.lis_mdb)):
            tk = self.lis_mdb[t][0]
            tv = self.lis_mdb[t][1:8]
            self.dic_mdb[tk] = tv
        for l in range(len(self.lis_gdb)):
            ll = self.lis_gdb[l][4]
            try:
                aa = self.lis_gdb[l][0:5] + self.dic_mdb[ll]
                self.lis_res.append(aa)
            except KeyError:
                pass
        # 创建workbook:excel文件对象
        workbook = openpyxl.Workbook()

        # 添加一个工作表
        sheet = workbook.create_sheet('总表', 0)
        sheet['A1'] = '宗地代码'
        sheet['B1'] = '不动产单元号'
        sheet['C1'] = '坐落'
        sheet['D1'] = '宗地面积'
        sheet['E1'] = '地块编码'
        sheet['F1'] = '承包方编码'
        sheet['G1'] = '合同面积'
        sheet['H1'] = '承包方名称'
        sheet['I1'] = '承包方证件号码'
        sheet['J1'] = '承包方地址'
        sheet['K1'] = '联系电话'
        sheet['L1'] = '审核人'

        # 写入数据
        # print(len(self.lis_res))
        for row in self.lis_res:
            sheet.append(row)

        # 保存工作簿
        workbook.save(path)

    def Complete(self, path1, path2, path3):
        self.Read_mdb(path1)
        print('Read_mdb')  # 打印步骤1
        self.Read_shp(path2)
        print('Read_shp')  # 打印步骤2
        self.Save_excel(path3)
        print('Save_excel')  # 打印步骤3


if __name__ == "__main__":
    path1 = r'C:\Users\Documents\土地承包经营权.mdb'
    path2 = r'C:\Users\Documents\农经权核查.gdb'
    path3 = 'C:\\Users\\Documents\\承包地块信息汇总表.xlsx'
    myExp = ExportCBDKXX()
    myExp.Complete(path1, path2, path3)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值