《数据库直接存取并修改word的脚本》由会员分享,可在线阅读,更多相关《数据库直接存取并修改word的脚本(7页珍藏版)》请在金锄头文库上搜索。
1、数据库直接存取并修改数据库直接存取并修改 wordword 的脚本的脚本/*数据库直接存取并修改 word 的脚本(word2000 版本,97 和 2002xp 没试)*/*注:里面的 sql 语句不能照搬哟,要自己修正。思路:共 3 段代码,存入时将 word 文件分段导入,导出时亦分段导出到硬盘上的一个临时文件,再用 ole 打开。再提示用户存回数据库。方法比较笨,多多包涵,刚刚完成的,比较乱,没有封装成用户对象,还用了些全局变量(为了生成临时文件)大家觉得有用的话请支持一下,随后我会完善,也希望高手多提宝贵意见,给些更好的实现方法,比如 API、VBA 之类的。如果用控件或者 VBA
2、在 word 里直接定义用户菜单就最完美了:)另外有兴趣的朋友帮忙测试一下,我测了一个 4 兆的,速度打开和存入的速度还可以接受。下一个目的:读取 word 里的标签数据和程序直接交换数据。/按钮一:读取 word 到数据库int li_i, li_j, li_looplong ll_FLengthblob lb_word, lb_tempstring sFileName, sFile/选择要导入的文件GetFileOpenName(“选择文件“,sFileName, sFile)/检查文件长度,如果超过 32765 则分段读取ll_FLength = FileLength(sFileName
3、)IF ll_FLength 32765 THENIF Mod(ll_FLength, 32765) = 0 THENli_loop = ll_FLength/32765ELSEli_loop = (ll_FLength/32765) + 1END IFELSEli_loop = 1END IFli_i = fileopen(sFileName,StreamMode!, Read!, LockRead!)if li_i 0 thenst_1.text = “文件导入中.“SetPointer(HourGlass!)if li_loop = 1 thenfileread(li_i, lb_wor
4、d)elsefor li_j = 1 to li_loopll_FLength = fileread(li_i, lb_temp)lb_word = lb_word + lb_tempnextend iffileclose(li_i)updateblob pstinfo set gwsms = :lb_word where id = :il_PstId;elsemessagebox(警告!,不能读取文件!)end ifif sqlca.sqlcode = 0 thencommit;st_1.text = SetPointer(Arrow!)messagebox(success!,success
5、!)elserollback;messagebox(failed!,failed!)SetPointer(Arrow!)end if/按钮二:直接打开数据库 word 并修改blob blb_tmp, blb_wordOLEObject ole_object ole_object = CREATE OLEObject integer li_ret, li_loop, li_ilong ll_FLengthib_wordflag = true /ib_wordflag 为真表示 word 已被打开,需要保存./取出从数据库 word 文档大文本文件SELECTBLOB gwsms INTO :b
6、lb_tmpFROM pstinfoWHERE id = :il_PstId;/判断文件长度,如超长则分段处理ll_FLength = len(blb_tmp)st_1.text = string(ll_FLength)IF ll_FLength 32765 THENIF Mod(ll_FLength, 32765) = 0 THENli_loop = ll_FLength/32765ELSEli_loop = (ll_FLength/32765) + 1END IFELSEli_loop = 1END IF/写入应用程序目录下的 word 临时文件if sqlca.sqlcode = 0 t
7、heninteger li_FileNumli_FileNum = FileOpen(gs_path + “model.doc“,StreamMode!, Write!, LockRead!, Append!)st_1.text = 文件读取中.SetPointer(HourGlass!)for li_i = 1 to li_loopblb_word = blobmid(blb_tmp,(li_i - 1)*32765+1,32765)FileWrite(li_FileNum, blb_word)nextFileClose(li_FileNum)end ifli_ret = ole_objec
8、t.ConnectToObject(“Word.application“) if li_ret 0 then MessageBox(“OLE 错误“,“OLE 无法连接! 错误号:“+String(li_ret) end if end ifole_object.Visible = trueole_object.documents.open(gs_path + “model.doc“)SetPointer(Arrow!)ole_object.DisconnectObject()destroy ole_object/按钮 2 的 losefocus 事件里的代码,目的是提示用户保存修改后的 wor
9、d,和按钮 1 实现的功能基本一样。int li_i,li_FileNum, li_j,li_looplong ll_flengthblob lb_word, lb_tempstring sFileName, sFile/如果 ib_wordflag 文 false,则说明文件已被保存,则不在触发保存事件。if ib_wordflag = false then returnli_i = messagebox(提示,您确信要保存岗位说明书吗?,Information!,OKCancel!,1)if li_i = 1 thensFileName = gs_path + “model.doc“/检查
10、文件长度,如果超过 32765 则分段读取ll_FLength = FileLength(sFileName)IF ll_FLength 32765 THENIF Mod(ll_FLength, 32765) = 0 THENli_loop = ll_FLength/32765ELSEli_loop = (ll_FLength/32765) + 1END IFELSEli_loop = 1END IFli_i = fileopen(sFileName,StreamMode!, Read!, LockRead!)if li_i 0 thenst_1.text = “文件导入中.“SetPoint
11、er(HourGlass!)if li_loop = 1 thenfileread(li_i, lb_word)elsefor li_j = 1 to li_loopll_FLength = fileread(li_i, lb_temp)lb_word = lb_word + lb_tempnextend iffileclose(li_i)updateblob pstinfo set gwsms = :lb_word where id = :il_PstId;elsemessagebox(警告!,不能读取文件!)end ifif sqlca.sqlcode = 0 thencommit;st_
12、1.text = SetPointer(Arrow!)messagebox(success!,success!)elserollback;messagebox(failed!,failed!)SetPointer(Arrow!)end ifend ifib_wordflag = false/清空应用程序目录下的 word 临时文件li_FileNum = FileOpen(gs_path + “model.doc“,StreamMode!, Write!, Shared!, Replace!)if FileWrite(li_FileNum, “) = -1 thenmessagebox(failed!,文件写入失败!)end ifFileClose(li_FileNum)/*/