2004年12月14日

关于在PB中导出Excel表的问题应该是个老问题了,大家讨论了不知道有多少年了,今天我也遇到了这个问题,上网找了半天大家说什么的都有。总结了一下,把我看到的都贴出来,呵呵。
一.
//  …  Init  docname  
//  …  GetFileOpenName  or  any  other  method  
if  dw_1.SaveAs(docname,  HTMLTable!,  True)  =  -1  then  
       MessageBox(“Warning”,  ”Unable  to  export  data.  Error  writing  to  file!”,  Exclamation!)  
       return  
end  if  
//  Convert  HTML  file  to  Excel  native  format  
OLEObject  excel  
excel  =  CREATE  OLEObject  
if  excel.ConnectToObject(docname)  =  0  then  
       excel.application.DisplayAlerts  =  FALSE  
       excel.application.workbooks(1).Parent.Windows(excel.application.workbooks(1).Name).Visible  =  True  
       excel.application.workbooks(1).saveas(docname,  39)  
       excel.application.workbooks(1).close()  
end  if  
 
DESTROY  excel  
//  done    
好久没有看PB,忘了语法都怎么用。
二.
支持导出分组带、合计带,并且支持多层嵌套报表导出,基本是所见及所得。

///////////////////////////////////////////////////////////////////////////
//
// Parameters : ad_dw : datawindow
// as_file : file name
// Returns : true/false : boolean
// Description : Save the datawindow as a excel file.
//
///////////////////////////////////////////////////////////////////////////
// author : purplekite
// date : 2003-01-23
///////////////////////////////////////////////////////////////////////////



SetPointer(HourGlass!)


//declare the local variables
long i, j, li_pos
string ls_objects, ls_obj, ls_text, ls_err, ls_sql
datastore lds_saveas //导出数据窗
datastore lds_sort //获得根据 object.x 排序的 (band = detail and visible = 1) 的 column/compute
boolean lb_return //返回值
string ls_pbver //pb 版本信息
environment env //环境变量


getenvironment(env)
ls_pbver = string(env.pbmajorrevision)


//创建排序列 datastore
lds_sort = create datastore
ls_sql = ‘column=(type=char(1) name = ztext dbname=”ztext” )’ + ‘~r~n’ + &
‘column=(type=char(1) name = zcol dbname=”zcol” )’ + ‘~r~n’ + &
‘column=(type=long name = zx dbname=”zx” )’ + ‘~r~n’
ls_sql = ‘release ‘ + ls_pbver + ‘;~r~ntable(‘ + ls_sql + ‘)’
lds_sort.create(ls_sql, ls_err)
if len(ls_err) > 0 then
lb_return = false
goto lab1
end if


//准备数据====================================================
//all controls
ls_objects = ad_dw.Describe(“datawindow.objects”)


//按~t位置作判断开始循环
do while (pos(ls_objects,”~t”) > 0)
li_pos = pos(ls_objects,”~t”)
ls_obj = left(ls_objects,li_pos – 1)
ls_objects = right(ls_objects,len(ls_objects) – li_pos)
//(column or compute ) at detail and visible
IF (ad_dw.Describe(ls_obj+”.type”) = “column” or &
ad_dw.Describe(ls_obj+”.type”) = “compute” ) AND &
(ad_dw.Describe(ls_obj+”.band”) = “detail” ) AND &
(ad_dw.Describe(ls_obj+”.visible”) = “1″ ) THEN
ls_text = ad_dw.describe(ls_obj + ‘_t.text’)
if ls_text <> ‘!’ and ls_text <> ‘?’ then
lds_sort.insertrow(0)
lds_sort.setitem(lds_sort.rowcount(), ‘ztext’, ls_text)
lds_sort.setitem(lds_sort.rowcount(), ‘zcol’, ls_obj)
lds_sort.setitem(lds_sort.rowcount(), ‘zx’, long(ad_dw.describe(ls_obj + ‘.x’)))
end if
END IF
loop


//the last control
ls_obj = ls_objects
IF (ad_dw.Describe(ls_obj+”.type”) = “column” or &
ad_dw.Describe(ls_obj+”.type”) = “compute” ) AND &
(ad_dw.Describe(ls_obj+”.band”) = “detail” ) AND &
(ad_dw.Describe(ls_obj+”.visible”) = “1″ ) THEN
ls_text = ad_dw.describe(ls_obj + ‘_t.text’)
if ls_text <> ‘!’ and ls_text <> ‘?’ then
lds_sort.insertrow(0)
lds_sort.setitem(lds_sort.rowcount(), ‘ztext’, ls_text)
lds_sort.setitem(lds_sort.rowcount(), ‘zcol’, ls_obj)
lds_sort.setitem(lds_sort.rowcount(), ‘zx’, long(ad_dw.describe(ls_obj + ‘.x’)))
end if
END IF
//如果没有列则跳出
if lds_sort.rowcount() < 1 then goto lab1
//根据 object.x 排序
lds_sort.setsort(‘zx A’)
lds_sort.sort()


//创建导出 datastore
lds_saveas = create datastore
ls_sql = ”
for i = 1 to lds_sort.rowcount()
ls_obj = lds_sort.getitemstring(i, ‘zcol’)
ls_sql += ‘column=(type=char(1) dbname=”‘ + ls_obj + ‘” )’ + ‘~r~n’
next
ls_sql = ‘release ‘ + ls_pbver + ‘;~r~ntable(‘ + ls_sql + ‘)’
lds_saveas.create(ls_sql, ls_err)
if len(ls_err) > 0 then
lb_return = false
goto lab1
end if


//向 lds_saveas 中写数据
for i = 1 to ad_dw.rowcount()
yield()//释放消息队列, 如果数据量较大, 可以使用这个函数
lds_saveas.insertrow(0)
for j = 1 to lds_sort.rowcount()
ls_obj = lds_sort.getitemstring(j, ‘zcol’)
if ad_dw.describe(ls_obj + ‘.type’) = ‘column’ then
ls_text = ad_dw.describe(‘evaluate(~’LookUpDisplay(‘ + ls_obj + ‘)~’, ‘ + string(i) + ‘)’)
else
ls_text = ad_dw.describe(‘evaluate(~” + ls_obj + ‘~’,’ + string(i) + ‘)’)
end if
lds_saveas.setitem(i, j, ls_text)
next
next


lds_saveas.insertrow(1)
for i = 1 to lds_sort.rowcount()
lds_saveas.setitem(1, i, lds_sort.getitemstring(i, ‘ztext’))
next
//准备数据完毕====================================================


//saveas datawindow
lb_return = (lds_saveas.saveas(as_file, excel!, false) = 1)


lab1:
destroy lds_sort
destroy lds_saveas
SetPointer(Arrow!)
return lb_return

支持导出分组带、合计带,并且支持多层嵌套报表导出,基本是所见及所得。

///////////////////////////////////////////////////////////////////////////
//
// Parameters : ad_dw : datawindow
// as_file : file name
// Returns : true/false : boolean
// Description : Save the datawindow as a excel file.
//
///////////////////////////////////////////////////////////////////////////
// author : purplekite
// date : 2003-01-23
///////////////////////////////////////////////////////////////////////////



SetPointer(HourGlass!)


//declare the local variables
long i, j, li_pos
string ls_objects, ls_obj, ls_text, ls_err, ls_sql
datastore lds_saveas //导出数据窗
datastore lds_sort //获得根据 object.x 排序的 (band = detail and visible = 1) 的 column/compute
boolean lb_return //返回值
string ls_pbver //pb 版本信息
environment env //环境变量


getenvironment(env)
ls_pbver = string(env.pbmajorrevision)


//创建排序列 datastore
lds_sort = create datastore
ls_sql = ‘column=(type=char(1) name = ztext dbname=”ztext” )’ + ‘~r~n’ + &
‘column=(type=char(1) name = zcol dbname=”zcol” )’ + ‘~r~n’ + &
‘column=(type=long name = zx dbname=”zx” )’ + ‘~r~n’
ls_sql = ‘release ‘ + ls_pbver + ‘;~r~ntable(‘ + ls_sql + ‘)’
lds_sort.create(ls_sql, ls_err)
if len(ls_err) > 0 then
lb_return = false
goto lab1
end if


//准备数据====================================================
//all controls
ls_objects = ad_dw.Describe(“datawindow.objects”)


//按~t位置作判断开始循环
do while (pos(ls_objects,”~t”) > 0)
li_pos = pos(ls_objects,”~t”)
ls_obj = left(ls_objects,li_pos – 1)
ls_objects = right(ls_objects,len(ls_objects) – li_pos)
//(column or compute ) at detail and visible
IF (ad_dw.Describe(ls_obj+”.type”) = “column” or &
ad_dw.Describe(ls_obj+”.type”) = “compute” ) AND &
(ad_dw.Describe(ls_obj+”.band”) = “detail” ) AND &
(ad_dw.Describe(ls_obj+”.visible”) = “1″ ) THEN
ls_text = ad_dw.describe(ls_obj + ‘_t.text’)
if ls_text <> ‘!’ and ls_text <> ‘?’ then
lds_sort.insertrow(0)
lds_sort.setitem(lds_sort.rowcount(), ‘ztext’, ls_text)
lds_sort.setitem(lds_sort.rowcount(), ‘zcol’, ls_obj)
lds_sort.setitem(lds_sort.rowcount(), ‘zx’, long(ad_dw.describe(ls_obj + ‘.x’)))
end if
END IF
loop


//the last control
ls_obj = ls_objects
IF (ad_dw.Describe(ls_obj+”.type”) = “column” or &
ad_dw.Describe(ls_obj+”.type”) = “compute” ) AND &
(ad_dw.Describe(ls_obj+”.band”) = “detail” ) AND &
(ad_dw.Describe(ls_obj+”.visible”) = “1″ ) THEN
ls_text = ad_dw.describe(ls_obj + ‘_t.text’)
if ls_text <> ‘!’ and ls_text <> ‘?’ then
lds_sort.insertrow(0)
lds_sort.setitem(lds_sort.rowcount(), ‘ztext’, ls_text)
lds_sort.setitem(lds_sort.rowcount(), ‘zcol’, ls_obj)
lds_sort.setitem(lds_sort.rowcount(), ‘zx’, long(ad_dw.describe(ls_obj + ‘.x’)))
end if
END IF
//如果没有列则跳出
if lds_sort.rowcount() < 1 then goto lab1
//根据 object.x 排序
lds_sort.setsort(‘zx A’)
lds_sort.sort()


//创建导出 datastore
lds_saveas = create datastore
ls_sql = ”
for i = 1 to lds_sort.rowcount()
ls_obj = lds_sort.getitemstring(i, ‘zcol’)
ls_sql += ‘column=(type=char(1) dbname=”‘ + ls_obj + ‘” )’ + ‘~r~n’
next
ls_sql = ‘release ‘ + ls_pbver + ‘;~r~ntable(‘ + ls_sql + ‘)’
lds_saveas.create(ls_sql, ls_err)
if len(ls_err) > 0 then
lb_return = false
goto lab1
end if


//向 lds_saveas 中写数据
for i = 1 to ad_dw.rowcount()
yield()//释放消息队列, 如果数据量较大, 可以使用这个函数
lds_saveas.insertrow(0)
for j = 1 to lds_sort.rowcount()
ls_obj = lds_sort.getitemstring(j, ‘zcol’)
if ad_dw.describe(ls_obj + ‘.type’) = ‘column’ then
ls_text = ad_dw.describe(‘evaluate(~’LookUpDisplay(‘ + ls_obj + ‘)~’, ‘ + string(i) + ‘)’)
else
ls_text = ad_dw.describe(‘evaluate(~” + ls_obj + ‘~’,’ + string(i) + ‘)’)
end if
lds_saveas.setitem(i, j, ls_text)
next
next


lds_saveas.insertrow(1)
for i = 1 to lds_sort.rowcount()
lds_saveas.setitem(1, i, lds_sort.getitemstring(i, ‘ztext’))
next
//准备数据完毕====================================================


//saveas datawindow
lb_return = (lds_saveas.saveas(as_file, excel!, false) = 1)


lab1:
destroy lds_sort
destroy lds_saveas
SetPointer(Arrow!)
return lb_return

都是好长的东东,好好学习一下吧。我自己的就写了一句,当然不能和这些大哥相比了。只是为了简单而已。
dw_biaobiao.SaveAsAscii(“c:\ljy\报表.xls“)
调用的SaveAsAscii来进行转换,只是为了一时之需,改天还要好好研究一下高手们的东东。

这次要修改的是css样式表。只是简单的讨论如何修改,我还没有那么多时间去详细研究,最近内部有考试,要考JBulider,天,就给4天时间去学习,真是郁闷。
不多说了,赶紧写笔记吧。
先看我们如何得到自己的css。在自己的Blog首页察看源代码,发现如下的句子。href=”/skins/AnotherEon001/style.css”。hoho~~相对路径,小case.在浏览器中输入http://www.donews.net//skins/AnotherEon001/style.css,回车就看见自己的css了。内容如下:body {
 font-size : 0.7em;
 font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;
 margin-left : 30px;
 margin-right: 30px;
 margin-top: 10px;
 margin-bottom: 10px;
 padding: 30px;
 padding-bottom: 10px;
 padding-top: 10px;
 background-color: #D9D6CB;
}
img
{
 border: 0px;
}
td
{
 font-size: 0.7em;
}
a{ 
 color : #223355;
 text-decoration: none;
}


a:hover { 
 text-decoration: underline;
}


h1 { 
 margin : 0px;
 padding-top : 5px;
 font-size : 1.8em;
}


h1 a:visited,
h1 a:active,
h1 a:link,
h1 a:hover {
 color : #FFF;
 /*margin-left : 10px;*/
 margin-top : 10px;
 text-decoration : none;
}


h2 {
 margin-top : 10px;
 font-size : 1em;
}


h5
{
 margin: 0px;
 padding: 0px;
}


#top {
 background-color : #20375f;
 height: 75px;
 vertical-align: middle; 
}


#top td
{
 color: white;
}


#sub
{
 text-align: right;
 background-color: black;
 color: #CCCCCC;
 font-size: 0.8em;
 padding: 4px;
}


.headermaintitle
{
 font-family: “Trebuchet MS”;
}


#tagline {  
 color : #FFFFFF;
 font-size : 1em;
 margin : 0px;
 background-color : #0000FF;
 padding : 5px;
}


p.date img {
 vertical-align : middle;
}


p.date {
 font-size : 1.2em;
 font-weight : bold; 
 margin-bottom : 0px;
 padding : 2px 0px;
 color : #AAAAAA;
 text-align: right;
}


p.date span {
 background-color : #FFF;
}
p.date a
{
 color: #888888;
}


blockquote {
 background-color: #EEEEEE;
 border: 0px;
 border-left: 18px solid #CCCCCC;
 padding: 4px;
 margin: 0px;
 
}


#leftmenu {
 position : relative;
 left : 0px;
 width : 180px;
 height: 100%; 
 padding: 0px;
 padding-bottom : 5px;
}


#leftmenu h3 {
 font-size : 1em;
 margin : 0px;
 padding : 4px;
 border-bottom : 1px solid #BBBBBB; 
}


#leftmenu ul {
 list-style : none;
 margin : 0px; 
 padding : 0px;
 margin-left : 8px;
 margin-bottom : 10px;
}


#leftmenu li {
 display : inline;
}


#leftmenu a:active,
#leftmenu a:visited,
#leftmenu a:link {
 display : block;
 color : #000;
 text-decoration : none; 
 margin-right : 0px;
 padding : 2px;
}


#leftmenu a:hover {
 background-color : #CCD5E0;
}


#main {
}


#footer {
 margin : 0px; 
 padding-top : 5px;
 text-align : center;
 font-size : 0.7em;
}


input.text {
 width : 300px; 
}


textarea {
 width : 300px;
 height : 200px; 
}


#comments h4 span {
 color : #999;
}


#comments h4 {
 margin : 0px;
 font-size : 0.9em;
}


p {
 margin : 0px;
 margin-bottom: 14px;
}


h3 {
 font-size : 1.2em;
 border-bottom : 1px solid #AAA;
}


#relatedlinks ul {
 list-style : none;
 margin-left : 10px;
 padding : 0px;
}


.post
{
 border: 1px solid #CCCCCC;
 border-bottom-width: 2px;
 border-right-width: 2px;
 padding: 4px;
 margin-bottom: 28px;
}
.post h5, .post h2
{
 font-size: 14px;
 margin: 0px;
 margin-bottom: 4px;
}
.post .postfoot
{
 margin: 0px;
 margin-top: 14px;
 color: #AAAAAA;
 border-top: 1px solid #DDDDDD;
 font-size: 0.8em;
}
pre
{
 margin: 0px;
 margin-left: 22px;
 font-size: 1.0em;
}
.Textbox, textarea
{
 border: 1px solid #AAAAAA;
 width: 100%;
}
.button
{
 border: 1px solid #AAAAAA;
 background-color: #CCD4E0;
}
input, textarea
{
 font-family: Verdana, Geneva, Arial, Sans-Serif;
 font-size: 10px;
}


.Framework
{
 border: 1px solid black;
 background-color: #EEEEEE;
}
.MainCell
{
 border-left: 1px solid #DDDDDD;
 border-bottom: 1px solid #DDDDDD;
 padding: 10px;
 background-color: White;
 vertical-align: top;
}
#LeftCell
{
 width: 200px;
 vertical-align: top;
}
.FooterCell
{
 vertical-align: top;
}


span.highlight
{
 background-color:Yellow;  
}

没什么好说的,有一点html语言的应该都能看懂吧?那我们改什么呢?我也不是很懂,但我看我的首页底下的字太小了,就改一下这个吧。看下自己首页的代码,找到要改的东西。
<tr>
  <td class=“FooterCell”>  
<p id=”footer”> <–看这个标记我们要改的就是“footer“
 Powered by:
 <br />
 <a id=”Footer1_Hyperlink2″ NAME=”Hyperlink1″ href=”http://scottwater.com/blog”> <img src=”images/100×30_Logo.gif” alt=”" border=”0″ /></a>
 <a id=”Footer1_Hyperlink3″ NAME=”Hyperlink1″ href=”http://ASP.NET”><img src=”images/PoweredByAsp.Net.gif” alt=”" border=”0″ /></a>
 <br />
 Copyright &copy; Benny


  </td>
 </tr>
打开css样式表,找到footer,看看写的是什么。#footer {
 margin : 0px; 
 padding-top : 5px;
 text-align : center;
 font-size : 0.7em;
}
就改下大小吧,#footer {
 margin : 0px; 
 padding-top : 5px;
 text-align : center; //文本位置
 font-size : 0.9em;//文字大小<–我们改的这个
}
然后把这些粘贴到定制css中,保存就好了。
好了,这些就是更改css的简单步骤,我也在学习中,呵呵,估计下次还写css相关的东西。

2004年12月11日

刚建好自己的blog 时发现和别人的有好大的差别,到google上一搜才知道大家都往里面添加了好多代码来实现不同的功能.本来我是觉得没有必要的,可想想加点东西也方便自己吧,就用google找了点代码加进去.原以为很简单的东西,用的时候才发现原来不是那么简单.就把自己在修改时遇到的东西写出来,希望能方便一下大家.
1.添加天气预报
<p><b>今日天气</b><br>
<CENTER><iframe width=157 height=240 frameborder=0 scrolling=NO src=’http://appnews.qq.com/cgi-bin/news_qq_search?city=%BC%C3%C4%CF’></iframe></CENTER>
就解释一点,city后面的代码是城市代码.可以通过百度查出来,具体方法:在百度中输入城市名称,这里为”济南”,回车后看地址栏”http://www.baidu.com/baidu?wd=%BC%C3%C4%CF&cl=3“看见wd=后的东西了,就是济南的代码.
2.添加钟表
<embed src=”http://www.clocklink.com/Clocks/0001P-Blue.swf?Place=济南&TimeZone=CCT” width=”200″ height=”200″ wmode=”transparent” type=”application/x-shockwave-flash”>
具体的钟表样式可以从www.clocklink.com查到,还可以更改颜色,地名,只要稍微知道点html应该都能看懂
3.MSN,QQ状态
MSN
这个MSN状态稍微麻烦点,大家往下看
<A HREF=”http://osi.hshh.org:8088/message/msn/FLASHBENNY@hotmail.com“>
<IMG SRC=”http://osi.hshh.org:8088/msn/FLASHBENNY@hotmail.com
align=”absmiddle” border=”0″ ALT=”MSN Online Status Indicator”
onerror=”this.onerror=null;this.src=’http://osi.hshh.org/msnunknown.gif’;”>
</A>
橙色部分为你的MSN帐号.注意:在MSN中要在隐私中去掉”只有位于我的”允许名单”上的人才可以查看我的状态或向我发送消息”前面的钩,不然是没有办法显示你的MSN状态的.
QQ
QQ的状态比较简单,因为腾讯自己就有这种服务.大家可以到http://is.qq.com/webpresence/code.shtml去找自己喜欢的,我就不多说了.
好了,暂时就先说这么多,等我研究完了怎么自定义样式后在讨论吧.

过了这么久才自己去申请BLOG完全是无奈.不过总算可以免了自己申请免费空间的麻烦了.小小的庆祝一下.不知道以后会往上面写什么,也不知道会有谁看见这个小地方,但有个自己的窝的感觉就是好啊!