PowerBuilder使用python程序导入excel文件
应用场景:
PB主要应用于数据库管理系统,经常需要数据的导入导出的操作,而PB提供的importfile函数,仅支持Text! 、CSV!、XML!、DBase2!、DBase3!的文格式。没错,不支持excel文件。当然可以通过DDE,OLE等方法对excel进行操作,不过确实不够友好。
本文介绍python编写一个“excel文件另存为带制表符的txt的小程序’,并在PB中调用它。
一、python程序的编写,这里用的是xlrd包读取excel文件
from xlrd import open_workbook
import win32gui
import win32api
workbook = open_workbook('test.xlsx')
i = 0
# 获取sheet名称列表
worksheets = workbook.sheet_names()
# 获取表格数据,这里只取第一个sheet的数据,需要多个sheet,可以进行拓展
worksheet = workbook.sheet_by_name(worksheets[0])
# 给数据添加制表符和换行
info = ''
for rownum in range(worksheet.nrows):
for x in worksheet.row_values(rownum):
info += str(x) + '\t'
info += '\n'
print(info)
# 写入txt文本
txtfile = open('test.txt', 'w')
txtfile.write(info)
txtfile.close()
# 读取系统窗口列表信息
# 按窗口名称获取窗口句柄
# 给PB开发的应用窗口发送一个参数1,通知执行结束
hWndList = []
win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList)
for hwnd in hWndList:
clsname = win32gui.GetClassName(hwnd)
title = win32gui.GetWindowText(hwnd)
if (title.find('PB开发助手') >= 0):
win32api.SendMessage(hwnd, 1600, 2, 1)
二、使用pyinstaller、py2exe之类的工具,将python程序打包成exe程序。操作比较简单,这里就不介绍了。
*网上有很多例子是使用pandas处理的excel,起初也用这个方式做了,结果打包的时候发现体积太大(近60MB),改用xlsd大概6M左右。
三、PB应用在相应的窗口中,使用run()来调用前面做好的exe程序,然后添加自定义事件:pbm_other,响应Python程序发送的程序结束消息。例子用的API函数接收
function long GlobalGetAtomName(long ATOM,ref string lpBuffer,integer nSize) Library "kernel32.dll" Alias for "GlobalGetAtomNameA"
function long GlobalDeleteAtom(long ATOM) Library "kernel32.dll"
*Python做的程序如果需要运行参数,比如指定excel文件名称,那可以使用sys库来接收参数。例如:
from xlrd import open_workbook
import win32gui
import win32api
import sys
def exceltotxt(excel_dir, txt_dir):
workbook = open_workbook(excel_dir)
i = 0
# 获取sheet名称列表
worksheets = workbook.sheet_names()
# 获取表格数据,这里只取第一个sheet的数据,需要多个sheet,可以进行拓展
worksheet = workbook.sheet_by_name(worksheets[0])
# 给数据添加制表符和换行
info = ''
for rownum in range(worksheet.nrows):
for x in worksheet.row_values(rownum):
info += str(x) + '\t'
info += '\n'
print(info)
# 写入txt文本
txtfile = open(txt_dir, 'w')
txtfile.write(info)
txtfile.close()
# 读取系统窗口列表信息
# 按窗口名称获取窗口句柄
# 给PB开发的应用窗口发送一个参数1,通知执行结束
hWndList = []
win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList)
for hwnd in hWndList:
clsname = win32gui.GetClassName(hwnd)
title = win32gui.GetWindowText(hwnd)
if (title.find('PB开发助手') >= 0):
win32api.SendMessage(hwnd, 1600, 2, 1)
exceltotxt(sys.argv[1], sys.argv[2])