吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 199|回复: 7
收起左侧

[经验求助] 求AHK大佬帮忙写一段ppt相关的代码

[复制链接]
sgywzx 发表于 2024-10-15 07:59
400吾爱币
本帖最后由 sgywzx 于 2024-10-16 21:09 编辑

需求:用AHK编写代码识别判断一个ppt文件里是否包含指定文本,如“测试”
如果包含指定文本则打开这份ppt。
非常感谢各位,币不够可以加。

最佳答案

查看完整内容

问题主要出在了遍历文本所使用的方法,TextFrame.Paragraphs和TextRange.Runs,修改即可,注意保存使用如下代码使用gb2312编码 [mw_shl_code=shell,true] #Persistent pptPath := "XXXX" ; 替换为你的PPT文件路径 searchText := "XXX" ; 要搜索的文本 ; 创建PowerPoint COM对象 pptApp := ComObjCreate("PowerPoint.Application") pptApp.Visible := 1 ; 显示PowerPoint窗口 ; 尝试打开PPT文件 try { pptPres ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

bywxbyjb 发表于 2024-10-15 07:59
sgywzx 发表于 2024-10-15 22:01
AI给的AHK代码,这里最后是导出一个文本框来说明每一页是否包含指定文本:
#Persistent
pptPath := "D:%u ...

问题主要出在了遍历文本所使用的方法,TextFrame.Paragraphs和TextRange.Runs,修改即可,注意保存使用如下代码使用gb2312编码
[Shell] 纯文本查看 复制代码
#Persistent
pptPath := "XXXX" ; 替换为你的PPT文件路径
searchText := "XXX" ; 要搜索的文本

; 创建PowerPoint COM对象
pptApp := ComObjCreate("PowerPoint.Application")
pptApp.Visible := 1 ; 显示PowerPoint窗口

; 尝试打开PPT文件
try {
    pptPres := pptApp.Presentations.Open(pptPath)
} catch {
    MsgBox, 16, 错误, 无法打开文件:%pptPath%`n请检查文件路径和格式。
    pptApp.Quit()
    ExitApp
}

; 遍历所有幻灯片
slidesWithSearchText := 0
extractedText := ""
Loop % pptPres.Slides.Count {
    slide := pptPres.Slides(A_Index) ; 使用 A_Index 来获取当前的幻灯片
    extractedText .= "Slide " A_Index ":`n"
    containsText := false

    ; 遍历幻灯片中的所有形状
    Loop % slide.Shapes.Count {
        shape := slide.Shapes(A_Index)
        If (shape.HasTextFrame) {
            textFrame := shape.TextFrame
            If (textFrame.HasText) {
                textRange := textFrame.TextRange
                ; 使用TextRange.Sentences来遍历句子
                Loop % textRange.Sentences.Count {
                    sentence := textRange.Sentences(A_Index).Text
                    ; 检查句子是否包含搜索的关键字
                    If InStr(sentence, searchText) {
                        containsText := true
                        extractedText .= "Found '" searchText "' in: " sentence "`n"
                    }
                }
            }
        }
    }
   
    If (containsText) {
        slidesWithSearchText++
        extractedText .= "Contains '" searchText "'.`n"
    } Else {
        extractedText .= "Does not contain '" searchText "'.`n"
    }
    extractedText .= "`n" ; 空行分隔不同的幻灯片
}

; 保存提取的文本到文件
FileAppend, %extractedText%, extracted_text_from_ppt.txt

; 显示结果
MsgBox, % "Slides containing '" searchText "': " slidesWithSearchText

; 尝试关闭PPT文件和退出PowerPoint应用程序
try {
    pptPres.Close()
    pptApp.Quit()
} catch {
    MsgBox, 16, 错误, 无法正常关闭PPT或退出PowerPoint应用程序。
}

; 清理COM对象
pptApp := "" ; 释放COM对象

; 退出脚本
ExitApp
Cristy 发表于 2024-10-15 09:36
 楼主| sgywzx 发表于 2024-10-15 11:44
Cristy 发表于 2024-10-15 09:36
老哥为啥不直接问问AI , 这个应该秒出

Ai运行不成功,我也不会改AI的代码
bywxbyjb 发表于 2024-10-15 18:25
通过网盘分享的文件:ppt.7z
链接: https://pan.baidu.com/s/1JMLFh25uiNnQCcMH9u4nQg?pwd=pq39 提取码: pq39
生成了一个exe,cmd窗口运行,输入目标路径和要查询的文本,会打印命中的ppt或者pptx的文件路径。如果直接双击运行exe,cmd窗口会自行关掉,建议先打开cmd窗口,然后执行,方便留下命中的记录。7z文件中有效果图。整个过程会调用PowerPoint,系统上面要有安装,会一个一个打开路径下的ppt/pptx,关闭未命中的,最终留下那些命中的。
 楼主| sgywzx 发表于 2024-10-15 21:49
bywxbyjb 发表于 2024-10-15 18:25
通过网盘分享的文件:ppt.7z
链接: https://pan.baidu.com/s/1JMLFh25uiNnQCcMH9u4nQg?pwd=pq39 提取码: p ...

非常感谢您。测试确实实现您描述的功能。
不过我还是希望可以用AHK代码实现,这样我可以自定义修改其中的路径以及打开PPT后的动作。
如您可以用AHK代码实现,我可以付双倍的币。
 楼主| sgywzx 发表于 2024-10-15 21:58
bywxbyjb 发表于 2024-10-15 18:25
通过网盘分享的文件:ppt.7z
链接: https://pan.baidu.com/s/1JMLFh25uiNnQCcMH9u4nQg?pwd=pq39 提取码: p ...

对比您PY的识别文本代码,AI给出的AHK代码在于无法识别文本,但是您的好像可以;如果方便的话帮忙看看为什么AI的这个代码不行;AI给的代码我放在了铁子里
 楼主| sgywzx 发表于 2024-10-15 22:01
AI给的AHK代码,这里最后是导出一个文本框来说明每一页是否包含指定文本:
#Persistent
pptPath := "D:\U盘\其他\设备PPT\(5)蒸发器.ppt " ; 替换为你的PPT文件路径
searchText := "蒸发" ; 要搜索的文本

; 创建PowerPoint COM对象
pptApp := ComObjCreate("PowerPoint.Application")
pptApp.Visible := 1 ; 不显示PowerPoint窗口

; 打开PPT文件
pptPres := pptApp.Presentations.Open(pptPath)

; 遍历所有幻灯片
slidesWithSearchText := 0
extractedText := ""
Loop % pptPres.Slides.Count {
    slide := pptPres.Slides(A_Index) ; 使用 A_Index 来获取当前的幻灯片
    extractedText .= "Slide " A_Index ":`n"
    containsText := false

    ; 遍历幻灯片中的所有形状
    For shapeIndex, shape in slide.Shapes {
        If (shape.HasTextFrame) {
            textFrame := shape.TextFrame
            ; 遍历文本框架中的所有段落
            For paragraphIndex, paragraph in textFrame.Paragraphs {
                ; 遍历段落中的所有文本运行
                For runIndex, run in paragraph.TextRange.Runs {
                    If InStr(run.Text, searchText) {
                        containsText := true
                        extractedText .= "Found '" searchText "' in: " run.Text "`n"
                    }
                }
            }
        }
    }
   
    If (containsText) {
        slidesWithSearchText++
        extractedText .= "Contains '" searchText "'.`n"
    } Else {
        extractedText .= "Does not contain '" searchText "'.`n"
    }
    extractedText .= "`n" ; 空行分隔不同的幻灯片
}

; 保存提取的文本到文件
FileAppend, %extractedText%, extracted_text_from_ppt.txt

; 显示结果
msgbox, % "Slides containing '" searchText "': " slidesWithSearchText

; 关闭PPT文件和PowerPoint应用程序
pptPres.Close()
pptApp.Quit()

; 清理COM对象
ComObjError(false) ; 关闭错误报告
OnMessage(0x4E, "") ; 清除消息钩子
pptApp := "" ; 释放COM对象
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-14 10:35

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表