注册 登录
编程论坛 VFP论坛

在程序中如何根据字符长度确定字体大小?

王咸美 发布于 2021-11-09 13:37, 2399 次点击
在程序中如何根据字符长度确定字体大小,如字符长度超过12则字号设为8,其它为11号字。如在附件“学校日课总表2”中 自习2[蒋亚晨] 字号设为8,数学[蒋亚晨] 字号设为10,请高手帮忙,万分感谢!!!
只有本站会员才能查看附件,请 登录


*!* 生成学校日课总表任课教师姓名
CLEAR ALL
CLOSE ALL
SET TALK OFF
SET SAFETY OFF
CLOSE TABLES all
SET COMPATIBLE OFF

cCurrentProcedure = SYS(16,1)
nPathStart = AT(":",cCurrentProcedure)- 1
nLenOfPath = RAT("\", cCurrentProcedure) - (nPathStart)
mypath=SUBSTR(cCurrentProcedure, nPathStart, nLenofPath)
SET Default TO (mypath)


USE jsrkb20190101 IN 0 ALIAS jsrkb20190101
USE kb20190101 IN 0 ALIAS kb20190101
*!*    日课总表字段扩大
SELECT kb20190101
zds=FCOUNT()
jls=RECCOUNT()
GO top
FOR i=3 TO zds
rdx=field(i)
*IF LEN(&rdx)<15
*ALTER table rkzb alter &rdx C(15)
*ENDIF
ENDFOR
COPY STRUCTURE TO jsb
*!*    日课总表逐条记录处理
SELECT kb20190101
DIMENSION jsmain(zds)
jsmain=""
FOR x=1 TO jls &&逐条记录
* WAIT "正在处理 "+ALLTRIM(STR(x))+"//"+ALLTRIM(STR(jls)) WINDOW nowait
GO x
jsmain(1)=ALLTRIM(nj)
jsmain(2)=ALLTRIM(bj)
    FOR y=3 TO zds &&记录中每个字段
    rdy=field(y)
    rdy0=&rdy
        SELECT jsrkb20190101
        LOCATE FOR nj=jsmain(1) AND bj=jsmain(2)
        IF FOUND()
            q=0
            FOR z=3 TO zds
            rdz=field(z)
            IF rdz=ALLTRIM(rdy0)
            q=1
            EXIT
            ENDIF
            ENDFOR
            IF q=1
            *jsmain(y)=ALLTRIM(rdy0)+CHR(10)+ALLTRIM(&rdz)
            *jsmain(y)=ALLTRIM(&rdz)
            jsmain(y)=ALLTRIM(rdy0)+"["+ALLTRIM(&rdz)+"]"
            ELSE
            jsmain(y)=ALLTRIM(rdy0)
            ENDIF
        ELSE
        jsmain(y)=ALLTRIM(rdy0)
        ENDIF
    SELECT kb20190101   
    ENDFOR



*!*    结果输出到jsb
    INSERT INTO jsb FROM ARRAY jsmain
ENDFOR
*select jsb
*browse

*!* 生成每天日课总表
FOR m=1 TO 5
  SELECT jsb
  wjm=mypath+"\kbmb_"+STR(m,1)+".doc"
  FileName=mypath+"\学校日课总表"+STR(m,1)+".doc"   
  wordapp=CREATEOBJECT("word.application")
  wordapp.visible=.t.
  WordTable=wordapp.application.Documents.Open(wjm)
  FOR i=m*6-3 TO m*6+2
    FOR k=4 TO reccount()+3
      GO k-3
      WordCellText=EVALUATE(FIELD(i))
      IF EMPTY(WordCellText) OR ISNULL(WordCellText)
        WordCellText=" "
      ENDIF
      
      
      WordTable.Tables.item(1).Cell(k,i-6*(m-1)).Range.Text=WordCellText
      WordTable.Tables.item(1).Cell(k,i-6*(m-1)).Range.Font.Bold=.f.
      
      IF LEN("+WordCellText+")>12
       WordTable.Tables.item(1).Cell(k,i-6*(m-1)).Range.Font.Size=8
     ENDIF
     
    ENDFOR
  ENDFOR
  WordApp.Documents(1).SaveAs(FileName)  &&自动保存文件
  WordApp.quit
  RELEASE WordApp
ENDFOR
RETURN

[此贴子已经被作者于2021-11-9 13:42编辑过]

14 回复
#2
吹水佬2021-11-09 14:43
找了一些相关函数,不知有无帮助
TXTWIDTH()
FONTMETRIC()
AFONT()
SYSMETRIC()
#3
王咸美2021-11-09 15:29
只有本站会员才能查看附件,请 登录
#4
王咸美2021-11-09 15:32
IF LEN("+WordCellText+")>12
       WordTable.Tables.item(1).Cell(k,i-6*(m-1)).Range.Font.Size=8
ENDIF
这几句不起作用,代码怎样改请高手赐教,万分感谢!!!
#5
xuminxz2021-11-09 16:45
WordTable.Tables.item(1).Cell(k,i-6*(m-1)).Range.Font.Size=8
range并不选择对象
            WordTable.Tables.Item(1).Cell(k,i-6*(m-1)).Range.select()
            Wordapp.selection.Font.Size=8
就可以了,但这样要不断选择有点慢。
把你原来语句放在单元格赋值前就可以了,这样更好。

程序代码:
        If Len(WordCellText)>12
                WordTable.Tables.Item(1).Cell(k,i-6*(m-1)).Range.select()
                Wordapp.selection.Font.Size=8
            Endif
            WordTable.Tables.Item(1).Cell(k,i-6*(m-1)).Range.Text=WordCellText
            WordTable.Tables.Item(1).Cell(k,i-6*(m-1)).Range.Font.Bold=.F.


[此贴子已经被作者于2021-11-9 17:28编辑过]

#6
王咸美2021-11-09 18:46
这样表格所有内容都是8号字了。我想要的是:当字段内容超过12个字符时,设置单元格字号为8号字。
#7
xuminxz2021-11-09 20:40
回复 6楼 王咸美
WordCellText=EVALUATE(FIELD(i))改为
WordCellText=alltrim(EVALUATE(FIELD(i))
#8
radiofan2021-11-09 21:49
我是事先实测每行能够容纳各个字体的数量,然后判断是否满足该字体的需求。比如:5号字体,一行最多能够容纳多少字符……
#9
王咸美2021-11-10 10:36

只有本站会员才能查看附件,请 登录
#10
王咸美2021-11-10 10:38
上面占两行的内容,如何缩小字号,代码如何写,望高手赐教,万分感谢!!!
#11
吹水佬2021-11-10 11:19
回复 10楼 王咸美
设置文字自适应表格单元可以自动调整文字宽度,但如果文字不满格会自动加宽字间隔
#12
王咸美2021-11-10 19:41
增加下列两行代码问题可解决,但代码不具备通用性。
IF “自习1" $ WordCellText OR "自习2" $ WordCellText
   WordTable.Tables.item(1).Cell(k,i-6*(m-1)).Range.Font.Size=8
ENDIF
#13
radiofan2021-11-12 20:10
word啊
#14
laowan0012021-11-12 20:18
为啥不用VFP打印呢?
如果想分享电子文档,可以打印到PDF
在VFP里控制打印多方便啊

[此贴子已经被作者于2021-11-12 20:19编辑过]

#15
wengjl2021-11-13 11:08
以下是引用王咸美在2021-11-10 19:41:17的发言:

增加下列两行代码问题可解决,但代码不具备通用性。
IF “自习1" $ WordCellText OR "自习2" $ WordCellText
   WordTable.Tables.item(1).Cell(k,i-6*(m-1)).Range.Font.Size=8
ENDIF


你的学科名称一般是2个汉字,当自习1 时,长度超过4个字节了,把上面的IF换成 判断长度 应该有通用性了。
1