| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1476 人关注过本帖, 1 人收藏
标题:请问在Excel里面如何才能直接显示二进制备注字段保存的图片文件字符串?
只看楼主 加入收藏
liunis
Rank: 1
等 级:新手上路
帖 子:139
专家分:7
注 册:2021-9-25
结帖率:87.5%
收藏(1)
已结贴  问题点数:10 回复次数:10 
请问在Excel里面如何才能直接显示二进制备注字段保存的图片文件字符串?
在不转换成磁盘文件的情况下。
搜索更多相关主题的帖子: Excel 文件 图片 保存 字符串 
2021-12-19 00:11
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10566
专家分:43004
注 册:2014-5-20
收藏
得分:2 
文件 --- 字符串 --- 图片
“文件 --- 字符串”其实都是在文件,只是变了一下位置
直接的不好吗
文件 --- 图片
2021-12-22 18:15
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1070
专家分:2613
注 册:2015-12-30
收藏
得分:2 
楼主的意思大概是字符串保存在字段里,所以希望  字符串 --- 图片
2021-12-23 08:14
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10566
专家分:43004
注 册:2014-5-20
收藏
得分:0 
从表取出图片数据再加工成EXCEL能显示出图片,这过程也被复杂化了。
可试试:
1、将图片数据放到剪贴板再粘贴到EXCEL。
2、在EXCEL创建图片对象来加载图片数据。
没试过,不知可否。
2021-12-23 09:26
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10566
专家分:43004
注 册:2014-5-20
收藏(1)
得分:0 
试了一下复制粘贴(32位BMP)
将二进制备注字段的图片载入内存后复制到剪贴板再粘贴到EXCEL,有点复杂
如果从文件复制,只用一个API函数LoadImage()就可以获得hBitmap
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
DECLARE LONG GlobalAlloc IN Kernel32 LONG, LONG
DECLARE LONG GlobalLock IN Kernel32 LONG
DECLARE LONG GlobalUnlock IN Kernel32 LONG
DECLARE LONG GlobalFree IN Kernel32 LONG

DECLARE LONG GetDC IN user32 LONG
DECLARE LONG ReleaseDC IN user32 LONG, LONG

DECLARE LONG CreateCompatibleBitmap IN gdi32 LONG, LONG, LONG
DECLARE LONG SetDIBits IN gdi32 LONG, LONG, LONG, LONG, LONG, LONG, LONG
DECLARE LONG DeleteObject IN gdi32 LONG

DECLARE LONG OpenClipboard IN user32 LONG
DECLARE LONG EmptyClipboard IN user32
DECLARE LONG CloseClipboard IN user32
DECLARE LONG SetClipboardData IN user32 LONG, LONG

USE 表1
nBufSize = LEN(pp)
nOffBits = CTOBIN(SUBSTR(pp,11,4),"4RS")
nWidth = CTOBIN(SUBSTR(pp,19,4),"4RS")
nHeight = CTOBIN(SUBSTR(pp,23,4),"4RS")

LOCAL hImageMemory, pImageMemory
hImageMemory = GlobalAlloc(0x42, nBufSize)
pImageMemory = GlobalLock(hImageMemory)
SYS(2600, pImageMemory, nBufSize, pp)  && 载入内存
GlobalUnlock(hImageMemory)
USE

** 将图片数据复制到剪贴板
hDC = GetDC(0)
hBitmap = CreateCompatibleBitmap(hDC, nWidth, nHeight)  && 创建与当前DC兼容的位图
SetDIBits(hDC, hBitmap, 0, nHeight, pImageMemory+nOffBits, pImageMemory+14, 0)  && DIB_RGB_COLORS=0使用指定的DIB颜色数据来设置位图中的像素
OpenClipboard(0)
EmptyClipboard()
SetClipboardData(2, hBitmap) &&CF_BITMAP=2
CloseClipboard()
DeleteObject(hBitmap)
ReleaseDC(0, hDC)
GlobalFree(hImageMemory)

** 粘贴到EXCEL
ec = CREATEOBJECT("Excel.Application")
ec.DisplayAlerts = 0
ec.WorkBooks.add
ec.ActiveSheet.Paste
ec.Visible = 1

CLEAR ALL

Excel显示二进制备注字段的图片.rar (69.68 KB)


[此贴子已经被作者于2021-12-23 22:03编辑过]

2021-12-23 22:01
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1586
专家分:3094
注 册:2012-2-29
收藏
得分:2 
回复 5楼 吹水佬
学习啦,谢谢!
2021-12-24 07:45
easyppt
Rank: 6Rank: 6
等 级:侠之大者
威 望:1
帖 子:249
专家分:482
注 册:2021-11-24
收藏
得分:2 
谢谢 吹版,只能处理BMP类型图片吗,其他类型的可以吗

我也一直想知道,VFP数据导入EXCEL时,怎么把图片也直接导入(不通过保存文件,而是数据流直接过去)
2021-12-24 08:39
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10566
专家分:43004
注 册:2014-5-20
收藏
得分:0 
回复 7楼 easyppt
觉得没必要将文件内容放到表里,只保存文件名就可以,这样保存数据的安全性好些,可减小表的负担,载入时更有效利用内存资源。
2021-12-24 09:23
my2318
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:255
专家分:632
注 册:2014-3-18
收藏
得分:2 
以下是引用吹水佬在2021-12-24 09:23:55的发言:

觉得没必要将文件内容放到表里,只保存文件名就可以,这样保存数据的安全性好些,可减小表的负担,载入时更有效利用内存资源。

首先学习了,其次谈一下个人看法,图片文件比较小时在表里方便,比如学生表里的证件照,几十kb,好管理,如果文件比较大,则文件存储比较有效率。见笑了😄😄😄
2021-12-24 20:47
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10566
专家分:43004
注 册:2014-5-20
收藏(1)
得分:0 
以下是引用easyppt在2021-12-24 08:39:10的发言:

谢谢 吹版,只能处理BMP类型图片吗,其他类型的可以吗

我也一直想知道,VFP数据导入EXCEL时,怎么把图片也直接导入(不通过保存文件,而是数据流直接过去)

可以,剪贴板的CF_BITMAP是位图格式,要转换成位图数据。
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
** Excel显示数据流的图片

picFile = GETPICT("bmp,jpg,png")
IF !FILE(picFile)
    RETURN 
ENDIF

DECLARE long GlobalAlloc IN Kernel32 long,long
DECLARE long GlobalLock IN Kernel32 long
DECLARE long GlobalUnlock IN Kernel32 long
DECLARE long GlobalFree IN Kernel32 long

DECLARE long CreateStreamOnHGlobal IN ole32 long,long,long@

DECLARE long GdiplusStartup IN gdiplus long@,string@,long
DECLARE long GdiplusShutdown IN gdiplus long
DECLARE long GdipLoadImageFromStream IN gdiplus long,long@
DECLARE long GdipDisposeImage IN gdiplus long 
DECLARE long GdipGetImageDimension IN gdiplus long,single@,single@
DECLARE long GdipSaveImageToStream IN gdiplus long,long,string@,long

DECLARE long GetDC IN user32 long 
DECLARE long ReleaseDC IN user32 long, long

DECLARE long CreateCompatibleBitmap IN gdi32 long,long,long
DECLARE long SetDIBits IN gdi32 long,long,long,long,long,long,long
DECLARE long DeleteObject IN gdi32 long

DECLARE long OpenClipboard IN user32 long
DECLARE long EmptyClipboard IN user32
DECLARE long CloseClipboard IN user32
DECLARE long SetClipboardData IN user32 long,long

stGSI = 0h01000000000000000000000000000000
lpGDI = 0
GdiplusStartup(@lpGDI,@stGSI,0)

picStr = FILETOSTR(picFile)
nSize = LEN(picStr)

hMem = GlobalAlloc(0x42, nSize)
pMem = GlobalLock(hMem)
pStream = 0
CreateStreamOnHGlobal(hMem, 0, @pStream)    && 创建流对象
SYS(2600, pMem, nSize, picStr)              && 数据流
GlobalUnlock(hMem)

pImage = 0
GdipLoadImageFromStream(pStream, @pImage)   && 根据数据流创建图片对象
nWidth = 0
nHeight = 0
GdipGetImageDimension(pImage, @nWidth, @nHeight)

hBitMem = GlobalAlloc(0x42, 54+nWidth*nHeight*4)
pBitMem = GlobalLock(hBitMem)
pBitStream = 0
CreateStreamOnHGlobal(hBitMem, 0, @pBitStream)
CLSID_BMP = 0h00F47C55041AD3119A730000F81EF32E
GdipSaveImageToStream(pImage, pBitStream, CLSID_BMP, 0)
GlobalUnlock(hBitMem)

nOffBits = CTOBIN(SYS(2600,pBitMem+10,4),"4RS") 
nWidth   = CTOBIN(SYS(2600,pBitMem+18,4),"4RS")
nHeight  = CTOBIN(SYS(2600,pBitMem+22,4),"4RS")

hDC = GetDC(0)
hBitmap = CreateCompatibleBitmap(hDC, nWidth, nHeight)
SetDIBits(hDC, hBitmap, 0, nHeight, pBitMem+nOffBits, pBitMem+14, 0)

OpenClipboard(0)
EmptyClipboard()
SetClipboardData(2, hBitmap)
CloseClipboard()

DeleteObject(hBitmap)
ReleaseDC(0, hDC)
GlobalFree(hBitMem)
GdipDisposeImage(pImage)
GlobalFree(hMem)
GdiplusShutdown(lpGDI)

ec = CREATEOBJECT("Excel.Application")
ec.DisplayAlerts = 0
ec.WorkBooks.add
ec.ActiveSheet.Paste
ec.Visible = 1

CLEAR ALL

 

Excel显示数据流的图片.rar (188.31 KB)
2021-12-25 19:51
快速回复:请问在Excel里面如何才能直接显示二进制备注字段保存的图片文件字符串 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016715 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved