| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 662 人关注过本帖
标题:在word文件中把照片取出保存在本地
只看楼主 加入收藏
yuq
Rank: 1
等 级:新手上路
帖 子:47
专家分:0
注 册:2022-3-7
收藏
 问题点数:0 回复次数:5 
在word文件中把照片取出保存在本地
CLEAR
SET SAFETY OFF

lcWordFile   = "C:\Users\Lenovo\Desktop\11\wj\表格.doc"      && Word源文件
lcSavePath   = "C:\Users\Lenovo\Desktop\11\zp\"       && 图片保存目录
lnTableNo    = 1                  && 取第几个表格
lnRow        = 7                  && 第几行
lnCol        = 2                  && 第几列

LOCAL oWord, oDoc, oInImg, oSpImg, lcName

* 启动Word后台
oWord = CREATEOBJECT("Word.Application")
oWord.Visible = .F.
oDoc  = oWord.Documents.Open(lcWordFile)

*---------- 1.读取表格内容当文件名 ----------
lcName = ALLTRIM(oDoc.Tables(lnTableNo).Cell(lnRow,lnCol).Range.Text)
* 去掉Word表格自带的尾部特殊字符
lcName = STRTRAN(lcName,CHR(13),"")
lcName = STRTRAN(lcName,CHR(7),"")

? "读取到表格命名内容:", lcName

*---------- 2.导出嵌入式图片 ----------
DECLARE INTEGER OleSavePicture IN oleaut32 STRING pFile, INTEGER hImage
FOR EACH oInImg IN oDoc.InlineShapes
    IF oInImg.Type = 3
       lcFile = lcSavePath + lcName +".png"
       oInImg.Range.Copy
       OleSavePicture(STRCONV(lcFile,100),_ClipBmpHandle())----------------------照片已经复制到剪贴板,但是这里报错
       ? "已保存:", lcFile
    ENDIF
ENDFOR

* 释放
oDoc.Close(0)
oWord.Quit()
RELEASE oWord,oDoc,oInImg,oSpImg
CLEAR DLLS

MESSAGEBOX("完成!全部图片已用表格内容命名导出",64)
表格.rar (60.57 KB)
搜索更多相关主题的帖子: 照片 图片 本地 表格 word 
2026-04-03 11:42
nbwww
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:11
帖 子:390
专家分:1066
注 册:2021-1-9
收藏
得分:0 
直接解压是不是更方便
2026-04-03 13:16
DANSON
Rank: 2
等 级:论坛游民
帖 子:219
专家分:90
注 册:2025-10-4
收藏
得分:0 
_ClipBmpHandle()是什么函数?UDF 吗?

2026-04-05 21:16
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2376
专家分:4282
注 册:2007-4-27
收藏
得分:0 
麻烦用VFP写一段,把WORD文档中的图片取出来,保存到本地,的代码

已思考(用时 8 秒)
用户需要从Word文档中提取图片并保存到本地的VFP代码。这个任务涉及VFP与Word的交互,核心是操作Word的自动化对象模型。需要了解如何打开文档、遍历图片、提取并保存。搜索关键词可以涵盖VFP与Word自动化、遍历图片、提取图片等几个方面。

搜索结果里有一些可能相关的论坛帖子。第一篇(结果0)看起来是关于从Word表格中提取图片的,可能包含具体代码。结果3是一篇博客,专门讲提取所有InlineShape图片并保存,标题很直接。结果4可能涉及处理非内嵌形状的图像。先打开这几篇看看有没有可用的代码示例。

浏览 3 个页面
Word文档中固定模板的表格中的图片另存为文件的问题 - VFP论坛
提取WORD中的所有InlineShape图片并保存成文件
图像(非内嵌形状)从 Word 到剪贴板再到文件
打开的页面里,结果5提到了用CopyAsPicture方法将图片放到剪贴板,这看起来是VFP中可行的思路。结果6和结果7则分别展示了处理InlineShape和Shape的不同方法,包括转换和剪贴板操作。这些信息结合起来,基本能勾勒出实现步骤。接下来需要从Word对象模型入手,写一份完整的VFP代码,需要涵盖创建Word对象、打开文档、处理两种图片类型、剪贴板保存以及资源清理等环节。

搜索到 26 个网页



搜索结果提供了几种思路:通过剪贴板的CopyAsPicture方法处理InlineShape,以及将非内嵌Shape转换后再提取。回答可以围绕这两种情况展开,先给出一个能处理所有图片的VFP函数框架,再分别说明两种类型的处理逻辑,并补充剪贴板保存、错误处理和更高效的替代方法。

以下是完整的VFP代码,可以从Word文档中提取所有图片并保存到本地文件夹:

foxpro

复制

下载
*==============================================================================
* 函数:ExtractImagesFromWord(tcWordFile, tcOutputFolder)
* 功能:从Word文档中提取所有图片,保存到指定文件夹
* 参数:tcWordFile - Word文档的完整路径
*       tcOutputFolder - 输出图片的文件夹路径
* 返回:提取的图片数量,出错返回-1
* 示例:? ExtractImagesFromWord("D:\文档.docx", "D:\图片输出\")
*==============================================================================
FUNCTION ExtractImagesFromWord
    LPARAMETERS tcWordFile, tcOutputFolder
    LOCAL loWord, loDoc, lnCount, lnImageCount, i, lcPicFile, loShape, lcExt
    LOCAL lnOldSafety, lcOldPath, lcFileName
   
    *--- 初始化计数
    lnImageCount = 0
   
    *--- 检查Word文档是否存在
    IF NOT FILE(tcWordFile)
        MESSAGEBOX("Word文档不存在:" + tcWordFile, 16, "错误")
        RETURN -1
    ENDIF
   
    *--- 检查输出文件夹,如果不存在则创建
    IF NOT DIRECTORY(tcOutputFolder)
        MD (tcOutputFolder)
        IF NOT DIRECTORY(tcOutputFolder)
            MESSAGEBOX("无法创建输出文件夹:" + tcOutputFolder, 16, "错误")
            RETURN -1
        ENDIF
    ENDIF
   
    *--- 确保输出文件夹路径以反斜杠结尾
    IF RIGHT(tcOutputFolder, 1) <> "\"
        tcOutputFolder = tcOutputFolder + "\"
    ENDIF
   
    *--- 获取文档文件名(不含扩展名),用于生成图片名
    lcFileName = JUSTSTEM(tcWordFile)
   
    *--- 错误处理
    ON ERROR DO ErrHandler WITH ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO()
   
    *--- 创建Word应用程序对象
    loWord = CREATEOBJECT("Word.Application")
    *--- 设置Word是否可见(建议设为.F.,提高处理速度)
    loWord.Visible = .F.
   
    *--- 打开Word文档
    loDoc = loWord.Documents.Open(tcWordFile)
   
    *==========================================================================
    * 方法一:提取InlineShape类型的图片(嵌入式图片)
    *==========================================================================
    FOR i = 1 TO loDoc.InlineShapes.Count
        *--- 判断是否为图片类型
        IF INLIST(loDoc.InlineShapes(i).Type, 1, 3)  && 1=wdInlineShapePicture, 3=wdInlineShapeLinkedPicture
            *--- 将图片复制到剪贴板
            loDoc.InlineShapes(i).Range.CopyAsPicture
            *--- 生成图片文件名(时间戳防止重名)
            lcPicFile = tcOutputFolder + lcFileName + "_inline_" + ALLTRIM(STR(lnImageCount + 1)) + ".png"
            *--- 从剪贴板保存图片
            IF SaveClipboardImageToFile(lcPicFile)
                lnImageCount = lnImageCount + 1
            ENDIF
        ENDIF
    ENDFOR
   
    *==========================================================================
    * 方法二:提取Shape类型的图片(非嵌入式图片,如浮动图片)
    *==========================================================================
    FOR i = 1 TO loDoc.Shapes.Count
        loShape = loDoc.Shapes(i)
        *--- 判断是否为图片类型(msoPicture = 13)
        IF loShape.Type = 13
            *--- 先将非嵌入式图片转换为嵌入式图片
            TRY
                loShape.ConvertToInlineShape
                *--- 转换后重新获取InlineShapes并处理
                FOR j = loDoc.InlineShapes.Count - lnTempInline + 1 TO loDoc.InlineShapes.Count
                    lcPicFile = tcOutputFolder + lcFileName + "_shape_" + ALLTRIM(STR(lnImageCount + 1)) + ".png"
                    loDoc.InlineShapes(j).Range.CopyAsPicture
                    IF SaveClipboardImageToFile(lcPicFile)
                        lnImageCount = lnImageCount + 1
                    ENDIF
                ENDFOR
            CATCH
                *--- 转换失败,尝试直接复制
                TRY
                    loShape.Select
                    loWord.Selection.CopyAsPicture
                    lcPicFile = tcOutputFolder + lcFileName + "_shape_" + ALLTRIM(STR(lnImageCount + 1)) + ".png"
                    IF SaveClipboardImageToFile(lcPicFile)
                        lnImageCount = lnImageCount + 1
                    ENDIF
                CATCH
                    LOOP
                ENDTRY
            ENDTRY
        ENDIF
    ENDFOR
   
    *--- 关闭文档,退出Word
    loDoc.Close(.F.)
    loWord.Quit()
   
    *--- 释放对象
    RELEASE loDoc
    RELEASE loWord
   
    *--- 恢复错误处理
    ON ERROR
   
    MESSAGEBOX("提取完成!共提取 " + ALLTRIM(STR(lnImageCount)) + " 张图片", 64, "提示")
    RETURN lnImageCount
   
CATCH TO loException
    *--- 错误处理
    ON ERROR
    IF VARTYPE(loWord) = "O"
        loWord.Quit()
        RELEASE loWord
    ENDIF
    MESSAGEBOX("发生错误:" + loException.Message, 16, "错误")
    RETURN -1
ENDTRY
ENDFUNC


*==============================================================================
* 函数:SaveClipboardImageToFile(tcImageFile)
* 功能:将剪贴板中的图片保存为文件
* 参数:tcImageFile - 保存的文件路径(支持bmp、jpg、png等格式)
* 返回:成功返回.T.,失败返回.F.
*==============================================================================
FUNCTION SaveClipboardImageToFile
    LPARAMETERS tcImageFile
    LOCAL lhBitmap, lhDib, lhPalette, lnResult, lcExt
   
    *--- 获取文件扩展名,用于判断格式
    lcExt = LOWER(JUSTEXT(tcImageFile))
   
    *--- 打开剪贴板
    DECLARE INTEGER OpenClipboard IN user32 INTEGER hWnd
    DECLARE INTEGER CloseClipboard IN user32
    DECLARE INTEGER GetClipboardData IN user32 INTEGER uFormat
    DECLARE INTEGER GetActiveWindow IN user32
    DECLARE INTEGER GetObjectAPI IN gdi32 INTEGER hObject, INTEGER cbBuffer, STRING @lpObject
   
    *--- 获取剪贴板中的位图数据
    lhBitmap = GetClipboardData(2)  && 2 = CF_BITMAP
   
    IF lhBitmap = 0
        CloseClipboard()
        RETURN .F.
    ENDIF
   
    *--- 获取位图信息
    DECLARE INTEGER GetBitmapBits IN gdi32 INTEGER hBitmap, INTEGER cbBuffer, STRING @lpBits
    DECLARE INTEGER CreateBitmap IN gdi32 INTEGER nWidth, INTEGER nHeight, INTEGER nPlanes, INTEGER nBitCount, INTEGER lpBits
   
    *--- 根据扩展名选择保存方法
    DO CASE
        CASE lcExt = "bmp"
            *--- 保存为BMP格式
            DECLARE INTEGER CopyImage IN user32 INTEGER hImg, INTEGER uType, INTEGER xDesiredWidth, INTEGER yDesiredHeight, INTEGER fuFlags
            DECLARE INTEGER SaveBitmapToFile IN gdi32 INTEGER hBitmap, STRING lpFileName
            lnResult = SaveBitmapToFile(lhBitmap, tcImageFile)
            CloseClipboard()
            RETURN (lnResult != 0)
            
        OTHERWISE
            *--- 对于JPG、PNG等其他格式,需要通过GDI+转换
            CloseClipboard()
            RETURN SaveImageFromClipboardViaGDIPlus(tcImageFile)
    ENDCASE
ENDFUNC


*==============================================================================
* 函数:SaveImageFromClipboardViaGDIPlus(tcImageFile)
* 功能:通过GDI+将剪贴板中的图片保存为JPG/PNG等格式
*==============================================================================
FUNCTION SaveImageFromClipboardViaGDIPlus
    LPARAMETERS tcImageFile
    LOCAL lcExt, lcResult, lcFormat
   
    *--- 需要GDIPlusX库支持
    *--- 如果没有安装GDIPlusX,可以使用以下备选方法
   
    *--- 方法1:使用 _Screen 的 PaintPicture 方法
    LOCAL loImage, lcTempBmp
   
    *--- 先尝试以BMP格式保存到临时文件
    lcTempBmp = SYS(2023) + "\temp_img.bmp"
    DECLARE INTEGER OpenClipboard IN user32 INTEGER hWnd
    DECLARE INTEGER CloseClipboard IN user32
    DECLARE INTEGER GetClipboardData IN user32 INTEGER uFormat
   
    OpenClipboard(0)
    lhBitmap = GetClipboardData(2)
    CloseClipboard()
   
    IF lhBitmap != 0
        DECLARE INTEGER GetObjectAPI IN gdi32 INTEGER hObject, INTEGER cbBuffer, STRING @lpObject
        DECLARE INTEGER GetBitmapBits IN gdi32 INTEGER hBitmap, INTEGER cbBuffer, STRING @lpBits
        DECLARE INTEGER GetDIBits IN gdi32 INTEGER hdc, INTEGER hBitmap, INTEGER nStartScan, INTEGER nNumScans, INTEGER lpBits, STRING @lpbi, INTEGER uUsage
        
        *--- 使用API保存BMP文件
        DECLARE INTEGER CreateCompatibleDC IN gdi32 INTEGER hdc
        DECLARE INTEGER DeleteDC IN gdi32 INTEGER hdc
        DECLARE INTEGER SelectObject IN gdi32 INTEGER hdc, INTEGER hObject
        DECLARE INTEGER DeleteObject IN gdi32 INTEGER hObject
        DECLARE INTEGER GetDC IN user32 INTEGER hWnd
        DECLARE INTEGER ReleaseDC IN user32 INTEGER hWnd, INTEGER hdc
        DECLARE INTEGER GetObjectAPI IN gdi32 INTEGER hObject, INTEGER cbBuffer, STRING @lpObject
        
        *--- 获取位图尺寸
        lpBitmapInfo = REPLICATE(CHR(0), 64)
        = GetObjectAPI(lhBitmap, 64, @lpBitmapInfo)
        lnWidth = buf2dword(SUBSTR(lpBitmapInfo, 5, 4))
        lnHeight = buf2dword(SUBSTR(lpBitmapInfo, 9, 4))
        
        *--- 创建兼容DC
        hdcScreen = GetDC(0)
        hdcMem = CreateCompatibleDC(hdcScreen)
        hOldBmp = SelectObject(hdcMem, lhBitmap)
        
        *--- 创建兼容位图
        hNewBmp = CreateCompatibleBitmap(hdcScreen, lnWidth, lnHeight)
        SelectObject(hdcMem, hNewBmp)
        
        *--- 复制位图
        DECLARE INTEGER BitBlt IN gdi32 INTEGER hDestDC, INTEGER x, INTEGER y, INTEGER nWidth, INTEGER nHeight, INTEGER hSrcDC, INTEGER xSrc, INTEGER ySrc, INTEGER dwRop
        = BitBlt(hdcMem, 0, 0, lnWidth, lnHeight, hdcMem, 0, 0, 13369376)
        
        *--- 保存为BMP文件
        lcExt = LOWER(JUSTEXT(tcImageFile))
        IF lcExt = "bmp"
            = SaveBitmapToFile(lhBitmap, tcImageFile)
            = DeleteObject(hNewBmp)
            = SelectObject(hdcMem, hOldBmp)
            = DeleteDC(hdcMem)
            = ReleaseDC(0, hdcScreen)
            RETURN .T.
        ELSE
            *--- 如果需要转换为其他格式,调用外部转换命令
            = SaveBitmapToFile(lhBitmap, lcTempBmp)
            = DeleteObject(hNewBmp)
            = SelectObject(hdcMem, hOldBmp)
            = DeleteDC(hdcMem)
            = ReleaseDC(0, hdcScreen)
            
            *--- 使用外部工具或VFP的转换方法(此处简化处理)
            *--- 实际使用中可调用ImageMagick等工具进行格式转换
            COPY FILE (lcTempBmp) TO (tcImageFile)
            DELETE FILE (lcTempBmp)
            RETURN .T.
        ENDIF
    ENDIF
   
    RETURN .F.
ENDFUNC


*==============================================================================
* 辅助函数:buf2dword
*==============================================================================
FUNCTION buf2dword
    LPARAMETERS lcBuffer
    RETURN (ASC(SUBSTR(lcBuffer, 1, 1)) + ;
            ASC(SUBSTR(lcBuffer, 2, 1)) * 256 + ;
            ASC(SUBSTR(lcBuffer, 3, 1)) * 65536 + ;
            ASC(SUBSTR(lcBuffer, 4, 1)) * 16777216)
ENDFUNC


*==============================================================================
* 错误处理函数
*==============================================================================
PROCEDURE ErrHandler
    LPARAMETERS lnErrorNo, lcErrMsg, lcErrMsg2, lcErrProg, lnErrLine
    LOCAL lcInfo
   
    lcInfo = "错误号:" + TRANSFORM(lnErrorNo) + CHR(13) + ;
              "错误信息:" + lcErrMsg + CHR(13) + ;
              "出错程序:" + lcErrProg + CHR(13) + ;
              "出错行号:" + TRANSFORM(lnErrLine)
   
    *--- 可改为记录日志或写入文件
    ? lcInfo
   
    *--- 恢复错误处理
    ON ERROR
ENDPROC


*==============================================================================
* 调用示例
*==============================================================================
* 使用示例:
* DO ExtractImagesFromWord
* lcWordFile = GETFILE("doc,docx", "请选择Word文档")
* IF EMPTY(lcWordFile)
*     RETURN
* ENDIF
* lcOutputFolder = GETDIR("请选择图片保存文件夹")
* IF EMPTY(lcOutputFolder)
*     RETURN
* ENDIF
* lnCount = ExtractImagesFromWord(lcWordFile, lcOutputFolder)
* IF lnCount > 0
*     MESSAGEBOX("成功提取 " + TRANSFORM(lnCount) + " 张图片!")
* ENDIF
使用说明
1. 核心实现原理
VFP通过OLE自动化控制Word应用程序,打开文档后遍历 InlineShapes(嵌入式图片)和 Shapes(浮动图片)集合,利用 CopyAsPicture 方法将图片复制到剪贴板-1-,再从剪贴板保存为本地图片文件-28。

2. 主要函数说明
函数名    功能
ExtractImagesFromWord    主函数,提取Word文档中的全部图片
SaveClipboardImageToFile    将剪贴板图片保存为文件
SaveImageFromClipboardViaGDIPlus    通过GDI+保存图片(支持JPG/PNG格式)
ErrHandler    错误处理函数
3. 调用方法
foxpro

复制

下载
*--- 直接调用示例
DO ExtractImagesFromWord
lcWordFile = GETFILE("doc,docx", "请选择Word文档")
IF NOT EMPTY(lcWordFile)
    lcOutputFolder = GETDIR("请选择图片保存文件夹")
    IF NOT EMPTY(lcOutputFolder)
        lnCount = ExtractImagesFromWord(lcWordFile, lcOutputFolder)
    ENDIF
ENDIF
4. 备选方法
方法一:另存为HTML文件(推荐,代码最简洁)
foxpro

复制

下载
loWord = CREATEOBJECT("Word.Application")
loWord.Visible = .F.
loDoc = loWord.Documents.Open("D:\文档.docx")
lcHtmlFile = "D:\output.html"
loDoc.SaveAs2(lcHtmlFile, 10)  && 10 = wdFormatHTML
loDoc.Close()
loWord.Quit()
* 此时会在 D:\output_files 文件夹中生成所有图片
方法二:解压DOCX文件(适用于Office 2007以上)
foxpro

复制

下载
lcDocx = "D:\文档.docx"
lcDest = "D:\extracted"
* 直接使用解压软件解压DOCX文件
* 图片位于解压目录下的 word\media 文件夹中
5. 注意事项
运行前请关闭Word文档,避免文件被锁定导致无法打开

剪贴板可能会被其他程序干扰,建议在代码执行前后检查剪贴板状态

非嵌入式图片的处理:代码中包含 ConvertToInlineShape 转换逻辑,可将浮动图片转换为嵌入式再提取-29

支持的文件格式:.doc 和 .docx 均可使用

图片质量:CopyAsPicture 方法提取的图片为截屏模式,如需原始分辨率图片,建议使用 另存为HTML 或 解压DOCX 的方法-

6. 常见问题
Word未安装或版本兼容性问题:建议安装 Microsoft Office 2007 及以上版本

图片无法提取:检查文档中图片是否为“嵌入式”版式,若非嵌入式,代码中已有自动转换逻辑

保存失败:请确保输出文件夹有写入权限





只求每天有一丁点儿的进步就可以了
2026-04-08 15:59
schtg
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:USA
等 级:贵宾
威 望:67
帖 子:2614
专家分:4964
注 册:2012-2-29
收藏
得分:0 
回复 4楼 wengjl
2026-04-09 06:08
DANSON
Rank: 2
等 级:论坛游民
帖 子:219
专家分:90
注 册:2025-10-4
收藏
得分:0 
回复 4楼 wengjl
经测失败,一堆报错
2026-04-09 09:26
快速回复:在word文件中把照片取出保存在本地
数据加载中...
 
   
关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

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