复杂报表另存为的技巧一例
向上级部门上报报表是很常见的,其中不乏有复杂报表,最近,在客户需求中有这样一例,每月都需上报报表(国家统一格式),虽然本地已有了MIS,但每月上报不得不将报表打印出来,通过邮局邮寄给上级部门,现想将报表导出成单一的文件(常见文件格式,最好能用Office打开),通过邮件上报。起初,马上就想到了数据窗口的Saveas(),但是细分析,报表格式复杂,Saveas根本实现不了,于是想到了编程写入Excel中,同样,由于格式复杂,VBA的编程量也很大,如合并列、拆分列等,于是想到了先生成WMF文件,再贴到WORD中的办法,(上级部门不要求数据可编辑),实现效果很好。代码如下
if dw_1.rowcount() = 0 then return
int li_ret,value
oleObject lo_Word //ole对象
string docname,named
value = GetFileSaveName("另存为
docname, named, "DOC
"Word文档(*.DOC), *.DOC")
IF value <> 1 THEN
return
end if
if FileExists(docname) then
if messagebox('提示','文件已经存在要覆盖吗?',question!,yesno!,2) = 1 then
filedelete(docname)
else
return
end if
end if
//生成WMF临时文件,这种方法不完美,应该取Windows的临时目录和空的临时文件ID
if fileexists("C:\\windows\emp\\yyglgzyb.wmf") then
filedelete("C:\\windows\emp\\yyglgzyb.wmf")
dw_1.SaveAs("C:\\windows\emp\\yyglgzyb.wmf
//打开Word文件
lo_Word = CREATE OLEObject
li_Ret = lo_Word.ConnectToObject("
IF li_Ret <> 0 THEN
//没有打开则新建
li_Ret = lo_Word.ConnectToNewObject("word.application")
if li_Ret <> 0 then
MessageBox('OLE错误','OLE无法连接,错误ID:' + string(li_Ret)+'可能是Word安装不正确!') return
end if
END IF
/////////////////////VBA,设置纸张为A3横向/////////////////////////////
lo_word.Documents.Add()lo_Word.ActiveDocument.PageSetup.LineNumbering.Active = False
lo_Word.ActiveDocument.PageSetup.Orientation = 1
//以下注释行为设置页边距,可以不用,使用缺省值。
//lo_Word.ActiveDocument.PageSetup.TopMargin = CentimetersToPoints(3.17)
//lo_Word.ActiveDocument.PageSetup.BottomMargin = CentimetersToPoints(3.17)
//lo_Word.ActiveDocument.PageSetup.LeftMargin = CentimetersToPoints(2.54)
//lo_Word.ActiveDocument.PageSetup.RightMargin = CentimetersToPoints(2.54)
//lo_Word.ActiveDocument.PageSetup.Gutter = CentimetersToPoints(0)
//lo_Word.ActiveDocument.PageSetup.HeaderDistance = CentimetersToPoints(1.5)
//lo_Word.ActiveDocument.PageSetup.FooterDistance = CentimetersToPoints(1.75)
lo_Word.ActiveDocument.PageSetup.PageWidth = 1190.55
lo_Word.ActiveDocument.PageSetup.PageHeight = 841.9
lo_Word.ActiveDocument.PageSetup.FirstPageTray = 0
lo_Word.ActiveDocument.PageSetup.OtherPagesTray = 0
lo_Word.ActiveDocument.PageSetup.SectionStart = 2
lo_Word.ActiveDocument.PageSetup.OddAndEvenPagesHeaderFooter = False
lo_Word.ActiveDocument.PageSetup.DifferentFirstPageHeaderFooter = False
lo_Word.ActiveDocument.PageSetup.VerticalAlignment = 0
lo_Word.ActiveDocument.PageSetup.SuppressEndnotes = False
lo_Word.ActiveDocument.PageSetup.MirrorMargins = False
lo_Word.ActiveDocument.PageSetup.TwoPagesOnOne = False
lo_Word.ActiveDocument.PageSetup.GutterOnTop = False
lo_Word.ActiveDocument.PageSetup.CharsLine = 99
lo_Word.ActiveDocument.PageSetup.LinesPage = 42
///////////////////////////////////////////////////////////////////////
////////////////////////VBA,插入图片//////////////////////////////
lo_Word.ActiveDocument.Shapes.AddPicture("C:\\windows\emp\\yyglgzyb.wmf
lo_Word.ActiveDocument.saveas(docname)
lo_Word.DisconnectObject()
浙温_zhj(343097430) 21:33:00
Word操作之二
向word模板写数据
ole_object.Documents.open(ls_file)
// 定义书签
string ls_bookmark[]
ls_bookmark = {'name', 'sbrq', 'money', 'qx', 'dyrq'}
//====================================================================
if isvalid(w_temp_wait) then
w_temp_wait.st_1.text = '正在写入数据......'
end ifinteger i, j, li_column_count
long ll_row, ll_cc
string ls_temp
ll_row = dw_1.getrow()
li_column_count = integer(dw_1.object.datawindow.column.count)
for i = 1 to li_column_count - 1//不要第一列(序号字段)
// 获得显示值
ls_temp = 'evaluate("LookUpDisplay(#' + string(i + 1) + ')
ls_temp = dw_1.describe(ls_temp)
// messagebox('', dw_1.describe(ls_temp))
// 获得汉字个数
ll_cc = gf_chinesecount(ls_temp)
// 写入数据
ole_object.selection.goto(true,0,0,ls_bookmark[i])
ole_object.selection.typetext(ls_temp)
for j = 1 to ll_cc
ole_object.Selection.TypeBackspace()
next
next
if isvalid(w_temp_wait) then
w_temp_wait.st_1.text = '正在打印 Word 文档......'
end if
//======================打印 Word 模板, 退出==========================
ole_object.activedocument.printout(false)
ole_object.documents.close(false)
ole_object.quit()
ole_object.disconnectobject()
destroy ole_object
// 关闭提示窗口
close(w_temp_wait)
messagebox('', '打印成功')下载本文