1. 程式人生 > 實用技巧 >但是上述介面的params變數無法在Python中實現,只能採用RESTFul形式,傳遞的引數一定要用JSON格式

但是上述介面的params變數無法在Python中實現,只能採用RESTFul形式,傳遞的引數一定要用JSON格式

LiveBos的WSDL模式下有通用的介面

1 execBizProcess(xs:string sessionId, xs:string bizProcessName, xs:string id, lbParameter[] params, lbParameter[] variables, )

  但是上述介面的params變數無法在Python中實現,只能採用RESTFul形式,傳遞的引數一定要用JSON格式,如

1 requestdata_json=json.dumps(requestdata, separators=(',',':'))

  

例項:

# -*- coding: utf-8 -*-
"""
@desc: SMS Sending though LiveBos of Apexsoft
@author: Bionw
@contact: [email protected]
@version: v0.1
"""

import requests, json, sys, getopt, time

# from urllib import request

# URL = 'http://192.168.1.1:8101/service/LBREST' # Test enviroment
URL = 'http://192.168.1.4:8101/service/LBREST' # Production enviroment
login_URL = URL + '/userService/login'
exec_URL = URL + '/biz/execProcess'
service_user_id = 'webservice'
service_user_password = '000000'

"""
Get User SessionId
"""


def get_session():
    login_data = dict(userId=service_user_id, password=service_user_password)
    r = requests.get(login_URL, login_data)
    r.encoding = 'utf-8'
    r_json = r.json()
    sessionID = r_json['sessionId']
    return  sessionID


"""
Send Sms
"""


def send_sms(phone_number,message):

    # 簡訊核心引數
    interface_name = 'TXXFS_XZDX'  # 介面名稱
    message_type = 1  # 1|簡訊;2|郵件 XXLX
    message = message  # XXNR 資訊內容
    phone_number = phone_number  # JSR 接收人
    sender = 'NAGIOS_SYS'  # FSR 傳送人
    send_date = time.strftime("%Y/%m/%d")  # PREFSRQ 預定傳送日期
    send_time = time.strftime("%H:%M:%S")  # PREFSSJ 預定傳送時間

    params = {
        'XXLX': message_type,
        'XXNR': message,
        'FSR': sender,
        'JSR': phone_number,
        'PREFSRQ': send_date
    }

    requestdata = {
        'bizProcessName': interface_name,
        'params': params
    }

    requestdata_json = json.dumps(requestdata, separators=(',', ':'))

    SMS_content = {  # post資料集
        'sessionId': get_session(),
        'requestData': requestdata_json
    }

    # print(SMS_content)

    r = requests.post(exec_URL, SMS_content)
    r.encoding = 'utf-8'
    r_json = r.json()
    if r_json['result'] == 1:
        return '傳送成功'
    else:
        return '傳送失敗'


def main(argv):
    # phone_number = ''
    # message_content = ''
    try:
        opts, args = getopt.getopt(argv, "hp:m:", ["phone=", "message="])
    except getopt.GetoptError:
        print('request.py -p <phone number> -m <message>')
        sys.exit(2)
    for opt, arg in opts:
        if opt == '-h':
            print('request.py -p <phone number> -m <message>')
            sys.exit()
        elif opt in ("-p", "--phone"):
            phone_number = arg
        elif opt in ("-m", "--message"):
            message_content = arg
    print('輸入的號碼為:', phone_number)
    print('傳送的內容為:', message_content)
    print(send_sms(phone_number,message_content))


if __name__ == '__main__':
    main(sys.argv[1:])

一、物件模型

在VBE中“幫助(H)”——“Microsoft Visual Basic 幫助(H) F1”——“Visual Basic 語言參考”——“函式” 或者在VBE下快捷鍵“F1”

地址:https://docs.microsoft.com/zh-cn/office/vba/api/overview/excel/object-model

二、Application物件(Excel頂層物件)

1、ScreenUpdating屬性

是否控制螢幕更新,False表示關閉螢幕更新,True表示開啟螢幕更新

設定ScreenUpdating=False 關閉螢幕更新,將看不到程式的執行過程,可以加快程式的執行速度,讓程式顯得更直觀,專業。

示例(為關閉螢幕更新下,會彈出對話方塊):

Sub InputTest()
    Cells.ClearContents '清除表中所有資料
    Range("A1:A10") = 100
    MsgBox "剛才在A1:A10輸入數值100,你能看到結果嗎?"
    Range("B1:B10") = 200
    MsgBox "剛才在B1:B10輸入數值200,你能看到結果嗎?"
End Sub

示例(關閉螢幕更新,看不到執行過程,程式最終執行完成才能看到最終結果)

Sub InputTest()
    Cells.ClearContents '清除表中所有資料
    Application.ScreenUpdating = False '關閉螢幕更新
    Range("A1:A10") = 100
    MsgBox "剛才在A1:A10輸入數值100,你能看到結果嗎?"
    Range("B1:B10") = 200
    MsgBox "剛才在B1:B10輸入數值200,你能看到結果嗎?"
    Application.ScreenUpdating = True '恢復螢幕更新
End Sub

2、DisplayAlterts屬性

是否顯示警告對話方塊,False為不顯示,True為顯示

Sub delSht()
    Dim sht As Worksheet
    Application.DisplayAlerts = False '不顯示警告資訊
    For Each sht In Worksheets
        If sht.Name = ActiveSheet.Name Then '判斷sht是不是活動工作表
            sht.Delete '刪除sht代表的工作表
        End If
    Next
    Application.DisplayAlerts = True '恢復顯示警告資訊
End Sub

3、EnableEvents屬性

啟用或禁用事件,False為禁用(不讓事件發生),True為啟用

什麼是事件?能被Excel認識的一個操作動作,例如“開啟工作簿”、“關閉工作簿”等

  • 示例1:編寫一個程式,當選中工作表的單元格時,自動在單元格中寫入該單元格的地址
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Target.Value = Target.Address
End Sub
  • 示例2:選中活動單元格,記錄對應單元格地址,並將活動單元格向下移動一個單元格
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Target.Value = Target.Address
    Application.EnableEvents = False '禁用事件
    Target.Offset(1, 0).Select '選中活動單元格下面的一個單元格
    Application.EnableEvents = True '啟用事件
End Sub

4、WorksheetFunction屬性

使用WorksheetFunction呼叫Excel內建函式

  • 示例1:統計A1:A50單元格中數值大於1000的單元格有多少個?
Sub CountTest()
    Dim mycount As Integer, rng As Range
    For Each rng In Range("A1:B50")
        If rng.Value > 1000 Then mycount = mycount + 1
    Next
    MsgBox "A1:B50中大於1000的單元格個數為:" & mycount
End Sub
  • 示例2:統計A1:A50單元格中數值大於1000的單元格有多少個?使用COUNTIF函式
Sub CountTest()
    Dim mycount As Integer
    mycount = Application.WorksheetFunction.CountIf(Range("A1:B50"), ">1000")
    MsgBox "A1:B50中大於1000的單元格個數為:" & mycount
End Sub

5、給Excel梳妝打扮

  • Excel工作表介面相關命令

  • Excel介面

6、Application的常用屬性

三、Workbook物件

Workbook工作簿

Workbooks工作簿集合

1、怎麼引用工作簿

引用工作簿,就是指明工作簿的位置及名稱,共有兩種方式

方式一:利用索引號引用工作簿,Workbook.Item(3),這裡的Item可以省略,即Workbook(3)

方式二:利用工作簿名稱引用 ,Workbook("Book1")或Workbook("Book1.xls"),如果本地檔案顯示拓展名(且檔案已經儲存),則檔名必須帶拓展名,否則會報錯。

2、Workbook名片資訊

Sub wbMsg()
    Range("B2") = ThisWorkbook.Name     '返回當前工作簿名稱 練習 -副本.xlsm
    Range("B3") = ThisWorkbook.Path     '返回當前工作簿路徑 C:\Users\ThinkPad\Desktop
    Range("B4") = ThisWorkbook.FullName '返回當期工作簿帶名稱的路徑 C:\Users\ThinkPad\Desktop\練習 - 副本.xlsm
End Sub

3、建立工作簿

  • 使用方法:Workbooks.Add

  如果不帶任何引數,將建立包含一定數目空白工作表的新工作簿(數目由SheetsInNewWorkbook屬性決定)

  • 也可以給Add方法設定引數(引數表示現有Excel名稱的字串,選用該引數,新建的工作簿將以該檔案作為模板)

  Workbooks.Add "C:\Program Files\Microsoft Office\Templates\2052\ADDRESS\ADDRESS.XLS"

  • 也可以通過引數指定新建工作簿中包含的工作型別

  Workbooks.Add xlWBATChart '新建圖表工作表

  • Excel一共有4種類型的工作表

  可以在插入對話方塊裡看到(選中工作表名稱——滑鼠右鍵單擊——插入——即可顯示),如圖(包含引數說明):

  

4、開啟工作簿

使用Workbooks的Open方法(引數名要寫含路徑的名稱)

Sub OpenFile()
    Workbooks.Open Filename:="F:\Book1.xls"
End Sub

引數名成可以省略不寫(Open除了Filename引數外,還有14個引數,讓使用者決定以何種方式開啟指定的檔案,可以通過系統的幫助來檢視更多的資訊)

Sub OpenFile()
    Workbooks.Open "F:\Book1.xls"
End Sub

5、啟用工作簿

同事開啟多個工作簿,但是同一時間只能有一個視窗是活動的,呼叫Workbooks物件的Active方法可以啟用一個工作簿。

Sub JhWb()
    Workbooks("Book1.xls").Activate '啟用工作簿
End Sub

6、儲存工作簿

儲存工作簿呼叫Workbooks的Save方法

Sub SaveWb()
    ThisWorkbook.Save   '儲存程式碼所在的工作簿
End Sub

如果想將檔案另存為一個新的檔案,或者第一次儲存一個新建的工作簿,就用SaveAs方法。

引數指定檔案儲存的路徑及檔名如果省略路徑,則預設將檔案儲存在當前資料夾中

Sub SaveWb()
    ThisWorkbook.SaveAs Filename:="D:\test.xls"
End Sub

使用SaveAs方法將工作簿另存為新檔案後,將自動關閉原檔案,開啟新檔案,如果希望繼續保留原檔案不開啟新檔案,可以用SaveCopyAs方法

Sub SaveWb()
    ThisWorkbook.SaveCopyAs Filename:="D:\test.xls"
End Sub

7、關閉工作簿

關閉工作簿使用Workbooks的Close方法,如果不帶引數,則關閉所有開啟的工作簿

Sub CloseWb()
    Workbooks.Close '關閉所有開啟的工作簿
End Sub

如果想關閉指定的工作簿,需要指定引數

Sub CloseWb()
    Workbooks("Book1.xls").Close  '關閉Book1.xls
End Sub

如果關閉之前被更改過的內容沒有儲存,關閉工作簿前Excel會詢問使用者是否儲存更改,如果不想顯示該對話方塊,可以給Close方法設定引數:

Sub CloseWb()
    Workbooks("Book1.xls").Close savechanges:=True '關閉並儲存Book1.xls
End Sub

關閉並儲存的引數savechanges也可以省略不寫:

Sub CloseWb()
    Workbooks("Book1.xls").Close True '關閉Book1.xls
End Sub

8、ThisWorkbook與ActiveWorkbook

同是Application物件的屬性,同是返回Workbook物件,但二者並不是等同的。

ThisWorkbook是對程式所在的工作簿的引用

ActiveWorkbook是對活動工作簿的引用

新建的工作簿總會成為活動工作簿

Sub wb()
    Workbooks.Add
    MsgBox "程式碼所在的工作簿為:" & ThisWorkbook.Name & Chr(13) _
            & "當前活動工作簿為:" & ActiveWorkbook.Name
    ActiveWorkbook.Close savechanges:=False
End Sub

四、Worksheet物件

Worksheet表示一張普通的工作表,Worksheets表示多個Worksheet物件的集合。

1、引用工作表

可以使用工作表的索引號或者標籤名稱引用它

Worksheets.Item (1)     '引用工作表裡的第一張工作表
Worksheets (1)          '引用工作表裡的第一張工作表
Worksheets ("Sheet1")   '引用工作簿裡標籤名稱為"Sheet1"的工作表

  因為程式碼名稱只能在【屬性視窗】裡修改,不會隨著工作表標籤名稱或索引號的變化而變化。因此,當工作表的索引號或標籤名稱經常變化時,使用程式碼名稱引用工作表會更方便。

  使用程式碼名稱引用工作表,只需直接寫程式碼名稱

  例如:第一張工作表的A1單元格輸入100,程式碼為:Sheet1.Range("A1")=100

  檢視工作表的程式碼名稱,可以讀取它的CodeName屬性,如果想知道活動工作表的程式碼名稱,程式碼為:

Sub ShowShtCode()
    MsgBox ActiveSheet.CodeName
End Sub

2、新建工作表

新建工作表使用Worksheets的Add方法

  • 不帶任何引數,將在活動工作表新建一張工作表

  Worksheets.Add

  • 可以用引數給新建的工作表指定位置

  Worksheets.Add before:=Worksheets(1) '在第一張工作表前插入一張新的工作表

  Worksheets.Add after:=Worksheets(1) ‘在第一張工作表後插入一張新的工作表

  • 還可以同時插入多張工作表

  Worksheets.Add Count:=3 '在活動工作表前插入3張工作表,Count引數的預設值為1

  • 可以同時使用多個引數,不同引數之間用英文逗號隔開
Sub shtAdd()
    Worksheets.Add after:=Worksheets(1), Count:=3
End Sub

  在最後一張工作表後插入兩張工作表

Sub shtAdd()
    '在最後一個工作表後插入兩張工作表
    Worksheets.Add before:=Worksheets(Worksheets.Count), Count:=2
End Sub
  • Add方法有哪些引數?請看VBE的提示

  

3、更改工作表標籤名稱

  • 更改工作表標籤名稱,設定工作表Name屬性

  Worksheets(2).Name="工資表" '更改第二張工作表的標籤名稱為“工資表”

  • 新建工作表時在程式中更改標籤名稱
Sub shtAdd()
    Worksheets.Add Before:=Worksheets(1)
    ActiveSheet.Name = "工資表"
End Sub
  • 新建工作表同時指定它的標籤名稱
Sub shtAdd()
    '在第一張工作表前插入一個名稱為“工資表”的工作表
    Worksheets.Add(before:=Worksheets(1)).Name = "工資表"
End Sub
  • 如果同時新增多張工作表(即Count引數值大於1),並不能使用一句程式碼同時命名

4、刪除工作表

刪除工作表使用Worksheets物件的Delete方法

Worksheets("Sheet1").Delete '刪除Sheet1工作表

5、啟用工作表

啟用工作表可以使用Activate方法和Select方法

Worksheets(1).Activate '啟用第一張工作表
Worksheets(1).Select '啟用第一張工作表

6、複製工作表

複製工作表使用Copy方法