PB在计算列中获取上一行数据

1、获取上一行计算列: Describe( "evaluate( '计算列名', "+string(getrow()-1)+ ") ")

2、获取上一行字段值:字段名[-1]

<think>我们正在处理一个关于PowerBuilder9的问题:如何将数据窗口对象的计算行导出到Excel。根据用户提供的引用,我们可以参考几种导出方法。特别要注意的是,用户需要导出的是“计算行”,这通常是在数据窗口中通过表达式计算得出的行(比如合计行、汇总行等)。在PowerBuilder中,数据窗口的导出功能(如SaveAs)默认会导出所有行,包括明细行和计算行。但是,有时用户可能发现计算行没有导出,这通常是因为计算行不在数据窗口的主缓冲区中(例如,它可能位于脚注区或汇总区,而SaveAs默认只导出主缓冲区?)。实际上,数据窗口的SaveAs方法会导出数据窗口控件中当前显示的所有数据,包括计算计算行(如分组汇总行、合计行等),只要这些行在数据窗口控件中是可见的。但是,我们需要注意:1.引用[1]提供了一个快速导出工具,但它是针对整个数据窗口的,且特别提到“原样导出”,包括格式。因此,如果计算行在数据窗口中可见,那么它应该会被导出。2.引用[2]和[3]提供了两种导出方法,其中引用[2]的方法是先将数据窗口保存为HTML,然后转换为Excel;引用[3]是直接使用SaveAs方法保存为Excel格式。这两种方法都是导出数据窗口的全部内容(包括计算行),前提是计算行在数据窗口中是可见的。3.引用[4]是直接从数据库管理工具中导出查询结果,不涉及数据窗口对象,所以不适用。4.引用[5]是关于从Excel导入到数据窗口,与导出相反。因此,我们可以尝试以下方法:方法1:使用数据窗口的SaveAs方法直接导出在PowerBuilder9中,可以使用数据窗口控件的SaveAs方法将数据导出为Excel格式。代码示例如下(参考引用[3]):stringls_path//让用户选择保存路径if GetFileSaveName("选择保存位置",ls_path, "","ExcelFiles(*.xls),*.xls", "xls")=1 then//使用Excel!格式,第三个参数为True表示带格式导出(但注意,SaveAs的格式参数可能不支持所有格式,计算行会作为数据导出)ifdw_1.SaveAs(ls_path, Excel!, True) =1thenmessagebox("成功","导出完成!")elsemessagebox("错误", "导出失败!")endifendif但是,这里有一个问题:SaveAs方法在导出Excel时,对于计算行(比如在分组尾或汇总区的行)是否能够导出?实际上,SaveAs方法会导出数据窗口控件中当前显示的所有数据行(包括明细行和计算行),因为计算行也是数据窗口对象的一部分。但是,请注意,如果计算行不在数据窗口的主缓冲区(Primary!)中,而是位于其他缓冲区(如Filter!),那么默认情况下SaveAs只导出主缓冲区的数据。不过,计算行通常位于主缓冲区?实际上,计算行(如合计行)通常是在数据窗口的脚注(footer)或分组尾(trailer)中,这些行在数据窗口控件中是可见的,并且SaveAs会导出它们。方法2:使用OLE方式导出(如引用[2]的方法)如果直接使用SaveAs方法不能导出计算行,我们可以尝试先将数据窗口保存为HTML(因为HTML会保留所有的行和格式),然后通过OLE将HTML转换为Excel格式。这种方法较为复杂,但可以保留更多的格式。方法3:使用第三方DLL(如引用[1]的工具)用户也可以考虑使用第三方工具,该工具声称可以快速导出并保持原样。如果这个工具支持导出计算行,那么这是一个好选择。但需要下载并集成该DLL。针对用户的问题,我们首先推荐使用PowerBuilder自带的SaveAs方法,因为这是最直接的方式。如果计算行在数据窗口中是可见的,那么它应该会被导出。但是,如果计算行没有导出,可能是因为:1.计算行不在主缓冲区?实际上,计算行是数据窗口对象的一部分,在导出时会被包含。2.可能是数据窗口对象的设置问题,比如计算行所在的区域设置为不可见,或者在导出时没有被渲染出来。因此,我们建议先尝试直接使用SaveAs方法导出,如果不行,再考虑其他方法。另外,用户提到的是“计算行”,我们还需要确认这个计算行是数据窗口中的计算(每一行都有计算值)还是单独的计算行(比如合计行)。如果是计算,那么它作为的一部分,导出没有问题。如果是单独的计算行(比如在分组尾或脚注的汇总行),那么SaveAs方法也会导出。根据PowerBuilder的文档,SaveAs方法会导出数据窗口控件中当前显示的所有数据。因此,只要计算行在数据窗口控件中是可见的,就应该会被导出。步骤:1.确保在导出前,数据窗口控件中已经显示了计算行(例如,如果计算行在分组尾,那么需要确保分组尾区域是展开的)。2.使用SaveAs方法导出为Excel格式。如果用户发现计算行没有导出,可以尝试将数据窗口的格式改为Tab文本(Text!)或CSV,然后查看导出的文本文件中是否有计算行。如果有,说明问题可能是Excel格式导出时的特定问题,这时可以尝试使用HTML格式导出,然后再转换为Excel(如引用[2]的方法)。因此,我们给出以下代码示例(直接导出):示例代码:stringls_savepathinteger li_ret//让用户选择保存路径li_ret= GetFileSaveName("保存为Excel",ls_savepath, "","ExcelFiles (*.xls),*.xls","xls")ifli_ret =1then//使用Excel!格式,第三个参数为True表示带格式导出(包括头、标签等)ifdw_1.SaveAs(ls_savepath, Excel!, True) =1thenmessagebox("提示","导出成功!")elsemessagebox("错误","导出失败!")end ifelsemessagebox("提示","用户取消了操作")end if如果上述方法不能导出计算行,我们可以尝试使用HTML格式导出,然后通过OLE转换为Excel(如引用[2]),但这种方法需要安装Excel。引用[2]的代码示例:string docname//获取文件名if GetFileSaveName("保存为HTML", docname,"", "HTML Files(*.htm),*.htm","htm") <>1then return//先保存为HTMLifdw_1.SaveAs(docname, HTMLTable!,True)= -1 thenMessageBox("警告!","无法输出数据.文件写入错误!",Exclamation!)returnend if//将HTML转换为ExcelOLEObjectexcelexcel= CREATEOLEObjectifexcel.ConnectToObject(docname) =0thenexcel.application.DisplayAlerts= FALSEexcel.application.workbooks(1).Parent.Windows(excel.application.workbooks(1).Name).Visible= Trueexcel.application.workbooks(1).saveas(docname,39)//39代表Excel97-2003格式(.xls)excel.application.workbooks(1).close()end ifDESTROYexcel注意:这种方法需要客户端安装有Excel,且OLE操作可能较慢。综上所述,我们优先推荐使用SaveAs直接导出为Excel。如果计算行没有导出,再尝试其他方法。另外,用户也可以考虑使用引用[1]的第三方工具,该工具声称无需安装Excel且速度快,但需要集成DLL。因此,回答如下:</think>### 将PowerBuilder 9数据窗口计算行导出到Excel的方法 在PowerBuilder 9中导出数据窗口计算行到Excel,需确保计算行在数据窗口控件中可见且被识别为有效数据行。以下是两种可靠方法: #### 方法1:使用SaveAs函数直接导出(推荐) ```powerbuilder string ls_path // 让用户选择保存路径 if GetFileSaveName("保存Excel", ls_path, "", "Excel Files (*.xls),*.xls", "xls") = 1 then // 关键:确保计算行在数据窗口中可见 dw_1.Object.DataWindow.Export.PDF.Distill.ExcludeHidden = "no" // 包含隐藏内容 // 导出为Excel格式(含计算行) if dw_1.SaveAs(ls_path, Excel!, True) = 1 then messagebox("成功", "计算行已导出到Excel") else messagebox("错误", "导出失败,请检查数据窗口") end if end if ``` **注意事项**: 1. `Export.PDF.Distill.ExcludeHidden`属性确保计算行(可能位于脚注/汇总区域)被包含[^2][^3] 2. 第三个参数`True`表示保留标题和格式 3. 此方法要求计算行已在数据窗口中渲染完成(如调用了`AcceptText()`和`Update()`) #### 方法2:通过HTML中转(兼容复杂格式) ```powerbuilder string ls_htmlpath, ls_xlspath // 步骤1:先导出为HTML if GetFileSaveName("保存HTML", ls_htmlpath, "", "HTML Files (*.htm),*.htm", "htm") = 1 then dw_1.SaveAs(ls_htmlpath, HTMLTable!, True) // 步骤2:转换为Excel OLEObject excel excel = CREATE OLEObject if excel.ConnectToNewObject("Excel.Application") = 0 then excel.Workbooks.Open(ls_htmlpath) ls_xlspath = ls_htmlpath + ".xls" excel.ActiveWorkbook.SaveAs(ls_xlspath, 39) // 39=Excel97-2003格式 excel.Quit() messagebox("成功", "已转换为Excel: " + ls_xlspath) else messagebox("错误", "Excel未安装") end if DESTROY excel end if ``` **优势**:可完美保留计算行的样式和位置[^2] --- ### 关键技巧 1. **计算行可见性**: - 分组汇总行需展开分组 - 脚注行需设置`dw_1.Object.DataWindow.Export.PDF.Distill.ExcludeHidden = "no"` 2. **数据刷新**: ```powerbuilder dw_1.AcceptText() // 接受编辑内容 dw_1.Update() // 更新计算字段 ``` 3. **动态计算行**: 若计算行依赖脚本生成,需在导出前执行: ```powerbuilder dw_1.Object.DataWindow.Calculate = "1" // 强制重新计算 ``` > **注意**:直接导出可能忽略位于"footer"区域的计算行,此时建议使用方法2的HTML中转方案[^2][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值