Delphi中使用python指令碼讀取Excel資料

來源:互聯網
上載者:User

標籤:

Delphi中使用python指令碼讀取Excel資料
2007-10-18 17:28:22
標籤:Delphi Excel python
原創作品,允許轉載,轉載時請務必以超連結形式標明文章 原始出處 、作者資訊和本聲明。否則將追究法律責任。http://seewind.blog.51cto.com/249547/46669
前段時間,在正式項目中使用Python來讀取Excel表格的資料。具體需求是,項目資料庫中有些資料需要根據Excel表格裡面的資料進行一些調整,功能應該比較簡單。為了學習Python,決定使用Delphi+Python來實現。Delphi中是使用PythonForDelphi控制項來加入Python引擎的。實現整個功能用了大半天時間。
delphi項目方面,需要先修改資料表的封裝類,使它能在Python中出現並使用,簡單操作資料表。改了幾個地方:
學控制項中的Delphi modules工程,在項目中引入Python引擎,加入一個Delphi模組。
將表操作基類改成從TComponent中繼承過來@[email protected],目的是為了能在py指令碼中直接使用published的屬性;新實現一個該基類的封裝類,繼承自WrapDelphiClasses.TPyDelphiComponent,並註冊到Delphi模組中。
新加個菜單,調用外部的PY指令碼。貪簡單,只在該功能的地方加這些代碼,在呼叫指令碼前,註冊了具體的表封裝對象。
Python方面,有兩個自己寫的指令碼,其中一個是使用win32com封裝Excel操作的pyExcel.py,簡陋的代碼,夠用就行。另一個是實現具體的功能的指令碼,代碼入下:
import time
from pyExcel import PYExcel
import types
from Delphi import *
lDEHs = {}
CR = chr(10)# + chr(13)
CRCR = CR + CR
def AddSpace(aStr):
CR_R = chr(10)
SPACESTR = ‘ ‘
return aStr.replace(CR_R, CR_R+SPACESTR)
pass
def setDEFZ(uKW):
deb.Edit()
s1 = deb.DEFZ
uGZNR = AddSpace(s1.decode(‘gbk‘))
uGZNR = u‘【工作內容】%s‘ %(uGZNR)

uDEFZ = u‘%s%s【附註說明】%s【勘誤記錄】%s%s‘ \
%(uGZNR, CRCR, CRCR, uKW, CRCR)
deb.DEFZ = uDEFZ.encode(‘gbk‘)
deb.Post()
pass
def setDEFZByXls():
global CR, lDEHs
col_DEH = ‘A‘
col_KW = ‘B‘
iRow = 0
iEmpty = 0
xl1 = PYExcel()
if xl1.FindBook(‘Sheet1‘):
while (iEmpty<10):
iRow += 1
try:
sDEH = str(xl1.getRangeValue(col_DEH + str(iRow)))
pass
except:
sDEH = None
pass
if not sDEH or (sDEH==‘‘) or (sDEH==‘None‘):
iEmpty += 1
elif deb.Locate(‘DEH‘, sDEH):
lDEHs.setdefault(sDEH, sDEH)
s2 = AddSpace(xl1.getRangeValue(col_KW + str(iRow)))
setDEFZ(s2)
def setOthers():
global lDEHs

deb.First()
while not deb.Eof():
if not lDEHs.has_key(deb.deh):
lDEHs.setdefault(deb.deh, deb.deh)
try:
setDEFZ(u‘‘)
except:
pass

deb.Next()
setDEFZByXls()
setOthers()
在編寫調試這個指令碼用了大半的時間,其中碰到些問題:
編碼問題。好在前段時間剛理解Unicode的含義,現在在實際中解決了這個問題。Delphi中的String儲存的中文資訊,通常都是使用系統的預設字元集來編碼的。從Delphi中取出String如:s1 = deb.DEFZ,s1這時的編碼是系統預設字元集(gbk)。在py指令碼中使用代碼:s1.decode(‘gbk‘)進行解碼,得到Unicode字串。儲存回Delphi中時,再將Unicode使用gbk編碼:deb.DEFZ = uDEFZ.encode(‘gbk‘)。
PythonforDelphi控制項,使用Delphi的Rtti技術,py指令碼中能直接使用部分published的屬性,簡化了許多工作量。不過published的方法、過程和數組屬性還是不能直接使用,需要在對應的封裝類中自己封裝。
使用PyScripter工具編寫該指令碼,很方便。不過當前好象還沒有什麼好的方法來調試以這種運行方式啟動並執行指令碼。現在PyScripter支援遠端偵錯功能,以後有空要想辦法解決這個問題。


本文出自 “seewind” 部落格,請務必保留此出處http://seewind.blog.51cto.com/249547/46669

Delphi中使用python指令碼讀取Excel資料

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.