注册 登录
编程论坛 VFP论坛

参考帖子:“vfp9报表保存为高分辨率图片”,输出的图片中文字段乱码,请问如何解决?

yafengliang 发布于 2021-05-14 17:02, 3456 次点击
#Defin PixelFormat32bppARGB  0x26200A
Declare Long GdipCreateBitmapFromScan0 In GDIPlus.Dll Long, Long, Long, Long, String@, Long@
Declare Long GdipGetImageGraphicsContext In GDIPlus.Dll Long, Long@
Declare Long GdipSaveImageToFile In GDIPlus.Dll Long, String@, String@, Long
Declare Long GdipDisposeImage In GDIPlus.Dll Long
Declare Long GdipDeleteGraphics In GDIPlus.Dll Long

oRL = Createobject("ReportListener")
oRL.ListenerType = 3
Report Form xxx.frx Object oRL

Local nWidth, nHeight, hBitmap, hGraphics, cFile, bmpGUID
nWidth =  oRL.GetPageWidth()/4
nHeight = oRL.GetPageHeight()/4   && 分辨率太大图片好象有点不正常,情况不明。

For aa = 1 To oRL.PageTotal

    hBitmap = 0
    GdipCreateBitmapFromScan0(nWidth, nHeight, 0, PixelFormat32bppARGB, 0, @hBitmap)
    If hBitmap == 0
        ? "创建Bitmap失败"
        Return
    Endif
    hGraphics = 0
    GdipGetImageGraphicsContext(hBitmap, @hGraphics)
    If hGraphics == 0
        GdipDisposeImage(hBitmap)
        ? "获取Graphics失败"
        Return
    Endif
    oRL.OutputPage(aa, hGraphics, 1, 0,0,nWidth,nHeight, 0,0,nWidth,nHeight)
    cFile = "D:\报表" + Alltrim(Str(aa)) + ".png"
    bmpGUID = 0h06F47C55041AD3119A730000F81EF32E
    GdipSaveImageToFile(hBitmap, Strconv(cFile+0h00,5),@bmpGUID,0)
    GdipDisposeImage(hBitmap)
    GdipDeleteGraphics(hGraphics)
Endfor
25 回复
#2
吹水佬2021-05-14 19:49
没见到报表和数据表文件
#3
yafengliang2021-05-14 23:25
报表都能正常运行的,数据来自sql。本坛有说是字体问题,但改成宋体也一样。字段是英文或数字则正常显示,就中文不行。不是字段的中文部分也正常。
#4
yafengliang2021-05-14 23:25
是否缺少什么设置?
#5
radiofan2021-05-15 08:58
sql字段类型?
#6
yafengliang2021-05-15 10:29
回复 5楼 radiofan
字段在sql中类型是varchar和char。这两种只要中文的地方就乱码,网上有的说是域控件高度,我调高也不行。不知还有碰到这种情况的没?

[此贴子已经被作者于2021-5-15 10:33编辑过]

#7
吹水佬2021-05-15 11:06
以下是引用yafengliang在2021-5-14 23:25:05的发言:

报表都能正常运行的,数据来自sql。本坛有说是字体问题,但改成宋体也一样。字段是英文或数字则正常显示,就中文不行。不是字段的中文部分也正常。

随便取出一条记录一个字段的表大家测试一下就OK了
#8
yafengliang2021-05-15 12:57
回复 7楼 吹水佬
#Defin PixelFormat32bppARGB  0x26200A
Declare Long GdipCreateBitmapFromScan0 In GDIPlus.Dll Long, Long, Long, Long, String@, Long@
Declare Long GdipGetImageGraphicsContext In GDIPlus.Dll Long, Long@
Declare Long GdipSaveImageToFile In GDIPlus.Dll Long, String@, String@, Long
Declare Long GdipDisposeImage In GDIPlus.Dll Long
Declare Long GdipDeleteGraphics In GDIPlus.Dll Long

CREATE CURSOR tt (编号 C(10), 名称 C(100),数量 I)
FOR i = 1 TO 3
    INSERT INTO tt VALUES ("vfp-001", "大家好,欢迎来到编程论坛", i)
     INSERT INTO tt VALUES ("vfp-002", "VFP学习模块学习模块学习模块", i)
      INSERT INTO tt VALUES ("vfp-003", "感谢你的付出", i)
ENDFOR

oRL = Createobject("ReportListener")
oRL.ListenerType = 3
Report Form c_打印图片 Object oRL

Local nWidth, nHeight, hBitmap, hGraphics, cFile, bmpGUID
nWidth =  oRL.GetPageWidth()/4
nHeight = oRL.GetPageHeight()/4    && 分辨率太大图片好象有点不正常,情况不明。

For aa = 1 To oRL.PageTotal

    hBitmap = 0
    GdipCreateBitmapFromScan0(nWidth, nHeight, 0, PixelFormat32bppARGB, 0, @hBitmap)
    If hBitmap == 0
        ? "创建Bitmap失败"
        Return
    Endif
    hGraphics = 0
    GdipGetImageGraphicsContext(hBitmap, @hGraphics)
    If hGraphics == 0
        GdipDisposeImage(hBitmap)
        ? "获取Graphics失败"
        Return
    Endif
    oRL.OutputPage(aa, hGraphics, 1, 0,0,nWidth,nHeight, 0,0,nWidth,nHeight)
    cFile = "D:\报表" + Alltrim(Str(aa)) + ".png"
    bmpGUID = 0h06F47C55041AD3119A730000F81EF32E
    GdipSaveImageToFile(hBitmap, Strconv(cFile+0h00,5),@bmpGUID,0)
    GdipDisposeImage(hBitmap)
    GdipDeleteGraphics(hGraphics)
Endfor
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录


另外:能不能设置一个文件包含多页,不要一页一个文件?谢谢

[此贴子已经被作者于2021-5-15 13:01编辑过]

#9
吹水佬2021-05-15 15:01
给个报表文件测试不了的,报表文件还可以自己建。
主要是数据表文件,乱码的是数据表的东西吧?
#10
吹水佬2021-05-15 15:06
以下是引用yafengliang在2021-5-15 12:57:55的发言:

另外:能不能设置一个文件包含多页,不要一页一个文件?谢谢

图片可以拼接,不知页数多时效果会怎样
#11
yafengliang2021-05-15 15:58
上面直接用临时表也乱码,就是上面图片所示。
#12
yafengliang2021-05-15 16:07
回复 9楼 吹水佬
在8楼,有加入生成临时表的代码,用我上传的报表文件,也出现中文字段乱码,就是8楼贴图所示。

[此贴子已经被作者于2021-5-15 17:08编辑过]

#13
radiofan2021-05-15 19:52
只有本站会员才能查看附件,请 登录
#14
xuminxz2021-05-15 20:44
把这个勾去掉。
只有本站会员才能查看附件,请 登录
#15
吹水佬2021-05-15 22:35
奇怪!用提供的报表文件,原来vfp-001记录的名称结果是空的,改来改去也改不出汉字,最后改到名称全都是空的。
只有本站会员才能查看附件,请 登录

但随便新建一个报表文件又可以了
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2021-5-15 22:37编辑过]

#16
吹水佬2021-05-15 22:39
预览正常的,是否与打印设备的输出有关
#17
yafengliang2021-05-15 23:10
回复 16楼 吹水佬
是啊,试了其他报表,有的连表格标题的中文字也乱码,所以暂时找不出原因。
#18
schtg2021-05-16 06:26
回复 14楼 xuminxz
去掉后,全空,不显示了。
#19
schtg2021-05-16 06:27
将名称字段中一条记录改为全英文,也是空白的,找不到原因。
#20
radiofan2021-05-16 07:11
vfp9版本?
#21
吹水佬2021-05-16 07:49
报表文件修改几点就OK
1、名称控件高度调高点
2、样式字体字库选“中文GB”
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录
#22
xuminxz2021-05-16 10:37
只有本站会员才能查看附件,请 登录
#23
yafengliang2021-05-16 12:06
ok,现在是用手机登录的,明天有电脑再试下,谢谢大家!
#24
schtg2021-05-17 05:41
回复 22楼 xuminxz
确实可以啦,谢谢!
#25
yafengliang2021-05-17 08:49
经过验证,1、中文字符,只需设置字符集为中文;2、含中文的域控件,需要改字符集和调高控件高度。感谢大家!

[此贴子已经被作者于2021-5-17 08:59编辑过]

#26
pvm20002023-01-04 01:39
好贴!
1