GetTextAndImageCreateExamPaper
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Private Declare Function DeleteUrlCacheEntry Lib "wininet" Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As Long
'下载网络图片
Sub DownloadImageName(ByVal ImageURL As String, ByVal ImagePath As String)
Dim lngRetVal As Long
lngRetVal = URLDownloadToFile(0, ImageURL, ImagePath, 0, 0)
If lngRetVal = 0 Then
DeleteUrlCacheEntry ImageURL '清除缓存
'MsgBox "成功"
Else
'MsgBox "失败"
End If
End Sub Sub OneKeyCreateExam()
Dim ImgNames As Variant
Dim strText As String
Dim i As Long, n As Long, m As Long
Dim OneTagP As Object
Dim OneTagA As Object
Dim TagP As Object
Dim PosText As String
Dim Arr() As String
ReDim Arr(1 To 1) As String
Dim Brr() As String
ReDim Brr(1 To 1)
Dim ImageURL As String
Dim FilePath As String
Dim FileName As String Dim dContent As Object
Set dContent = CreateObject("Scripting.Dictionary")
Dim dImageName As Object
Set dImageName = CreateObject("Scripting.Dictionary") Dim StartTime As Variant '开始时间
Dim UsedTime As Variant '使用时间
StartTime = VBA.Timer '记录开始时间 AppSettings
On Error GoTo ErrHandler '设置URL,访问网页获取网页源码
URL = ActiveSheet.Range("A2").Text
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", URL, False
.Send
strText = .responsetext
End With '创建网页文件
With CreateObject("htmlfile")
.write strText
'获取标题
FileName = .getElementsByTagName("h2")(0).innerhtml
Debug.Print FileName Application.StatusBar = ">>>>>>正在下载图片>>>>>>" i = 0 '初始化序号 For Each OneTagA In .getElementsByTagName("a") '循环所有A标签
If OneTagA.HasChildNodes Then
If OneTagA.href Like "http://photo.blog.sina.com.cn/showpic.html*" Then '获取之前的一个段落
Set TagP = OneTagA.PreviousSibling
Do While TagP.tagName <> "P"
Set TagP = TagP.PreviousSibling
Loop i = i + 1 '文字内容提取
PosText = TagP.innerhtml
PosText = RegReplace(PosText, "<.*?>")
PosText = Replace(PosText, " ", "") '获取图片URL
ImageURL = OneTagA.FirstChild.getAttribute("real_src")
ImageName = "Image" & i & ".jpg"
ImagePath = ThisWorkbook.Path & Application.PathSeparator & ImageName
DownloadImageName ImageURL, ImagePath '下载图片 '获取图片
If dImageName.Exists(PosText) = False Then
dImageName(PosText) = ImageName
Else
dImageName(PosText) = dImageName(PosText) & "|" & ImageName
End If End If
End If
Next Application.StatusBar = ">>>>>>正在获取文本>>>>>>" i = 0 '初始化序号
n = 0 '初始化序号
For Each OneTagP In .getElementsByTagName("p")
'文字内容提取
PosText = OneTagP.innerhtml
PosText = RegReplace(PosText, "<.*?>")
PosText = Replace(PosText, " ", "") i = i + 1 If PosText = "喜欢" Then Exit For '提前结束循环
If i > 20 Then '开始记录试卷内容
If Len(PosText) > 0 Then '保留非空数组
n = n + 1
ReDim Preserve Arr(1 To n)
Arr(n) = PosText '存入数组
'Debug.Print n; " "; PosText
'dContent(PosText) = n
End If
End If
Next
End With Application.StatusBar = ">>>>>>正在创建Word文档>>>>>>" FilePath = ThisWorkbook.Path & "\" & FileName & ".doc"
On Error Resume Next
Kill FilePath
On Error GoTo 0 Dim wdApp As Object
Dim Doc As Object
Set wdApp = CreateObject("Word.Application")
Set Doc = wdApp.documents.Add() Doc.Activate For i = 1 To UBound(Arr) PosText = Arr(i) wdApp.Selection.TypeText Text:=PosText
wdApp.Selection.TypeParagraph If dImageName.Exists(PosText) Then '如果含有图片
If InStr(dImageName(PosText), "|") = 0 Then '如果只含有一张图片
ImageName = dImageName(PosText)
ImagePath = ThisWorkbook.Path & Application.PathSeparator & ImageName
wdApp.Selection.InlineShapes.AddPicture FileName:=ImagePath, LinkToFile:=False, SaveWithDocument:=True
wdApp.Selection.TypeParagraph
Else
ImgNames = Split(dImageName(PosText), "|")
For n = LBound(ImgNames) To UBound(ImgNames) Step 1
ImageName = ImgNames(n)
ImagePath = ThisWorkbook.Path & Application.PathSeparator & ImageName
wdApp.Selection.InlineShapes.AddPicture FileName:=ImagePath, LinkToFile:=False, SaveWithDocument:=True
wdApp.Selection.TypeParagraph
Next n
End If
End If Next i Doc.SaveAs FilePath
Doc.Close
wdApp.Quit Application.StatusBar = ">>>>>>正在删除Image图片>>>>>>" For Each Key In dImageName.keys
If InStr(dImageName(Key), "|") = 0 Then
ImageName = dImageName(Key)
ImagePath = ThisWorkbook.Path & Application.PathSeparator & ImageName
Kill ImagePath
Else
ImgNames = Split(dImageName(Key), "|")
For n = LBound(ImgNames) To UBound(ImgNames) Step 1
ImageName = ImgNames(n)
ImagePath = ThisWorkbook.Path & Application.PathSeparator & ImageName
Kill ImagePath
Next n
End If
Next Key UsedTime = VBA.Timer - StartTime
MsgBox "本次运行耗时:" & Format(UsedTime, "#0.0000秒") ErrorExit:
Set wdApp = Nothing
Set Doc = Nothing AppSettings False
Exit Sub
ErrHandler:
If Err.Number <> 0 Then
MsgBox Err.Description & "!", vbCritical, "QQ 84857038"
Debug.Print Err.Description
Err.Clear
Resume ErrorExit
End If End Sub
Public Function RegReplace(ByVal OrgText As String, ByVal Pattern As String, Optional RepStr As String = "") As String
'传递参数 :原字符串, 匹配模式 ,替换字符
Dim Regex As Object
Dim newText As String
Set Regex = CreateObject("VBScript.RegExp")
With Regex
.Global = True
.Pattern = Pattern
End With
newText = Regex.Replace(OrgText, RepStr)
RegReplace = newText
Set Regex = Nothing
End Function
Public Sub AppSettings(Optional IsStart As Boolean = True)
If IsStart Then
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
Application.StatusBar = ">>>>>>>>Macro Is Running>>>>>>>>"
Else
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.Calculation = xlCalculationAutomatic
Application.StatusBar = False
End If
End Sub
GetTextAndImageCreateExamPaper的更多相关文章
随机推荐
- Linux系统下C语言程序的构建过程
本文转载自:http://www.ruanyifeng.com/blog/2014/11/compiler.html 源码要运行,必须先转成二进制的机器码.这是编译器的任务. 比如,下面这段源码(假定 ...
- php new stdClass array 实例代码
php new stdClass array 实例代码 $searchResults = array ();// //$obj = array ("rs"=>array(), ...
- 蓝牙协议 HFP,HSP,A2DP,A2DP_CT,A2DP_TG,AVRCP,OPP,PBAP,SPP,FTP,TP,DTMF,DUN,SDP
简介: HSP(手机规格)– 提供手机(移动电话)与耳机之间通信所需的基本功能. HFP(免提规格)– 在 HSP 的基础上增加了某些扩展功能,原来只用于从固定车载免提装置来控制移动电话. A2DP( ...
- Linux中Postfix邮件原理介绍(一)
邮件相关协议 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议, 工作在TCP的25端口.它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式 ...
- python之路----logging模块
函数式简单配置 import logging logging.debug('debug message') #bug logging.info('info message') #信息 logging. ...
- MySQL Crash Course #17# Chapter 25. 触发器(Trigger)
推荐看这篇mysql 利用触发器(Trigger)让代码更简单 以及 23.3.1 Trigger Syntax and Examples 感觉有点像 Spring 里的 AOP 我们为什么需要触发器 ...
- P4001 [BJOI2006]狼抓兔子(对偶图)
P4001 [BJOI2006]狼抓兔子 最短路+对偶图 看这题最容易想到的就是网络流.Dinic可以过,据说还跑得比正解快. 如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu ...
- YAML配置文件
最近,研究jeeweb这个框架,发现新版本中的配置文件都是用的.yml为后缀的文件,打开一看,和以前的xml和properties语法有很大区别,因此仔细研究一下. 简介: YAML是(YAML Ai ...
- Jsp获取Java的对象(JavaBean)
Jsp获取Java的对象(JavaBean) Java代码片段: AuthReqBean authRep=new AuthReqBean(); authRep.setUserCode(usercode ...
- C++面向对象高级开发课程(第一周)
0. 内存分区 计算机中的内存在用于编程时,被人为的进行了分区(Segment),分为: -“栈区”(Stack) -“堆区”(Heap) -全局区(静态 区,Static) -文字常量区和程序代码区 ...