Python導出SqlServerl數據字典為excel

来源:https://www.cnblogs.com/Choleen/archive/2020/03/17/12514645.html
-Advertisement-
Play Games

定義三個方法 1.定義一個獲取數據的getData()方法2.定義一個導出excel表的方法exportSqlServer()3.定義一個獲取類型typeof()的方法,用作查詢出來的數據被識別 下麵直接展示代碼 from datetime import datetime import os imp ...


定義三個方法

1.定義一個獲取數據的getData()方法
2.定義一個導出excel表的方法exportSqlServer()
3.定義一個獲取類型typeof()的方法,用作查詢出來的數據被識別

下麵直接展示代碼

from datetime import datetime
import os
import pymssql as pymssql
import xlwt


def getData():
    connect= pymssql.connect(host, 'sa', 密碼, 資料庫名);
    cur = connect.cursor();
    query = '''
 SELECT
     tableName       =  D.name  , # 我合併單元格是按照這裡的表的重覆合併的,若用case whern end 結構,則不能合併,會出錯
     tableIntroduce     =  isnull(F.value,''),
     sort   = A.colorder,
     fieldName     = A.name,
     catogary       = B.name,
     bytes = A.Length,
     lengths       = COLUMNPROPERTY(A.id,A.name,'PRECISION'),
     scales   = isnull(COLUMNPROPERTY(A.id,A.name,'Scale'),0),
     isOrNotNull     = Case When A.isnullable=1 Then '√'Else '' End,
		   primarays       = Case When exists(SELECT 1 FROM sysobjects Where xtype='PK' and parent_obj=A.id and name in (
                      SELECT name FROM sysindexes WHERE indid in( SELECT indid FROM sysindexkeys WHERE id = A.id AND colid=A.colid))) then '√' else '' end,
     defauts     = isnull(E.Text,''),
		  annotations   = isnull(G.[value],'')
 FROM
     syscolumns A
 Left Join
     systypes B
 On
     A.xusertype=B.xusertype
 Inner Join
     sysobjects D
 On
     A.id=D.id  and D.xtype='U' and  D.name<>'dtproperties'
 Left Join
     syscomments E
 on
     A.cdefault=E.id
 Left Join
 sys.extended_properties  G
 on
     A.id=G.major_id and A.colid=G.minor_id
 Left Join

 sys.extended_properties F
 On
     D.id=F.major_id and F.minor_id=0
     --where d.name='OrderInfo'    --如果只查詢指定表,加上此條件
 Order By
     A.id,A.colorder'''


    cur.execute(query)
    data = cur.fetchall()  # 元組類型
    return data

def exportExcel(name):
    data = getData()
    myExcel = xlwt.Workbook('encoding=utf-8')
    # 定義表的寬
    sheet1 = myExcel.add_sheet(name, cell_overwrite_ok=True)
    sheet1.col(0).width = 300 * 20
    sheet1.col(1).width = 400 * 20
    sheet1.col(2).width = 100 * 20
    sheet1.col(3).width = 300 * 20
    sheet1.col(4).width = 256 * 20
    sheet1.col(5).width = 180 * 20
    sheet1.col(6).width = 180 * 20
    sheet1.col(7).width = 100 * 20
    sheet1.col(8).width = 100 * 20
    sheet1.col(9).width = 100 * 20
    sheet1.col(10).width = 180 * 20
    sheet1.col(11).width = 800 * 20

    # 設置居中
    a1 = xlwt.Alignment()
    a1.horz = 0x02
    a1.vert = 0x01
    style = xlwt.XFStyle()  # 賦值style為XFStyle為初始化樣式
    style.alignment = a1

    today = datetime.today()  # 獲取當前日期,得到一個datetime對象如:(2019, 7, 2, 23, 12, 23, 424000)
    today_date = datetime.date(today)  # 將獲取到的datetime對象僅取日期如:2019-7-2
    items = ['數據表', '表名', '欄位序號', '欄位', '類型', '占用位元組數', '長度', '小數點', '是否為空', '是否為主鍵', '預設值','註釋']
    for col in range(len(items)):
        sheet1.write(0, col, items[col])
    # 合併第二列的name,從content獲取第一列數據,[("Choleen","xxx"),()]
    first_col = []
    for i in range(len(data)):
        first_col.append(data[i][0])
    print("first_col:", first_col)
    # 去掉重覆的列數據,並順序不變
    nFirst_col = list(set(first_col))
    nFirst_col.sort(key=first_col.index)
    print("nFirst_col:", nFirst_col)
    row = 1
    for i in nFirst_col:
        count = first_col.count(i)  # 計算重覆的元素個數
        mergeRow = row + count - 1  # 合併後的上行數,
        sheet1.write_merge(row, mergeRow, 0, 0, i, style)  # 第一列
        sheet1.write_merge(row, mergeRow, 1, 1, i, style)
        row = mergeRow + 1  # 從下一行開始寫入

    # 獲取data[i]中的第二個元素,迴圈寫入
    for row in range(len(data)):
        for col in range(1, len(data[row])):
            result = data[row][col]
            str = typeof(result) # 獲取類型
            if str == None: # 不能識別的類型,需要轉換
                result = result.decode('utf-8')
            sheet1.write(row + 1, col, result, style)

    fileName = name + '.xls'
    rootPath = os.path.dirname(os.path.abspath('ExportSqlServer.py')) + '\\'
    print(rootPath)
    flag = os.path.exists(rootPath + fileName)
    if flag:
        os.remove(rootPath + fileName)
        myExcel.save(fileName)
    else:
        myExcel.save(fileName) 


def typeof(variate):
    type = None
    if isinstance(variate, int):
        type = "int"

    elif isinstance(variate, str):
        type = "str"
    elif isinstance(variate, float):
        type = "float"
    elif isinstance(variate, list):
        type = "list"
    elif isinstance(variate, tuple):
        type = "tuple"
    elif isinstance(variate, dict):
        type = "dict"
    elif isinstance(variate, set):
        type = "set"
    return type

if __name__ == '__main__':
    print("這是sqlServer導出的數據字典");
    # response = chardet.detect(b'\xe7\x94\xa8\xe6\x88\xb7\xe8\xa1\xa8')
    # print(response)
    exportExcel("user表")
在編寫代碼過程中出現了,中文亂碼。python3會自動轉換未unicode,我們來看下轉換過程:
     UTF-8/GBK --》 decode 解碼 --》 Unicode
  Unicode --》 encode 編碼 --》 GBK / UTF-8 

 這裡的代碼是Unicode,要轉換成明文,就需要decode方法,只能是unicode的格式才能,若是int,str類型則會報錯 

明文 -- encode --》Unicode--》gbk,utf-8
明文 《-- decode -- Unicode 《-- gbk,utf-8

so,這樣就可以了,完成操作。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡介: Java web項目中,在後端隨機生成一個驗證碼,繪製成圖像,併在圖像上添加兩條幹擾線,發送到瀏覽器,供用戶使用。 本片博文內容包括,功能實現的邏輯步驟,Java實現代碼,生成的驗證碼圖片展示。 步驟一:生成一個包含四個字元的字元串 使用一個數組char[]+一個Random對象實現該功能。 ...
  • 1.模型管理 :web線上流程設計器、預覽流程xml、導出xml、部署流程 2.流程管理 :導入導出流程資源文件、查看流程圖、根據流程實例反射出流程模型、激活掛起 3.運行中流程:查看流程信息、當前任務節點、當前流程圖、作廢暫停流程、指派待辦人 4.歷史的流程:查看流程信息、流程用時、流程狀態、查看 ...
  • oracle的jdk下載需要登錄,https://blog.csdn.net/qq_40298231/article/details/98485608 安裝JDK,傻瓜式操作 配置環境變數 右擊“我的電腦”-->"屬性"-->"高級系統設置"-->"高級"-->"環境變數" 在系統變數里新建"JAV ...
  • 一、 1.下載安裝chrome+chrome driver 2.selenium​操作主要分為兩類: (1)得到UI元素 find_element_by_id:通過id值來獲取元素 find_elements_by_name(下麵都同理) find_elements_by_xpath find_el ...
  • 本篇博客主要詳細介紹朴素貝葉斯模型。首先貝葉斯分類器是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類器。而朴素貝葉斯分類器是貝葉斯分類器中最簡單,也是最常見的一種分類方法。並且,朴素貝葉斯演算法仍然是流行的十大挖掘演算法之一,該演算法是有監督的學習演算法,解決的是分類問題。該演算法的優點 ...
  • 100個不同類型的python語言趣味編程題 在求解的過程中培養編程興趣,拓展編程思維,提高編程能力。 第一部分:趣味演算法入門;第六題 問題分析: ​ 牛頓迭代法是取x0之後,在這個基礎上,找到比x0更接近的方程的根,一步一步迭代,從而找到更接近方程的近似根。 ​ 設r是f(x)=0的根,選取x0作 ...
  • 依賴註入 不同數據類型的註入方式 除了通過 setter 註入、構造器註入還可以通過類似的 和 進行註入,具體參看官方文檔的例子,使用 "命名空間註入" Bean 作用域 | Scope | Description | | : | : | | "singleton" | (Default) Scop ...
  • Spring 框架 簡介 Spring框架是由於軟體開發的複雜性而創建的 目的:解決企業應用開發的複雜性 功能:使用基本的JavaBean代替EJB,並提供了更多的企業應用功能 範圍:任何Java應用 優點: 開源的免費的框架(容器) Spring是一個輕量級、非入侵式的框架 控制反轉(IOC)和麵 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...