ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 134384|回复: 125

[原创] 网页采集(网页抓取)教程第二课-用WinHTTP提交Post,viewstate获取和URLEncode编码方法

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-7-17 14:14 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 liucqa 于 2012-12-13 20:24 编辑

警示:想加学习网页采集或者有某某需求的,请务必提前学习VBA的基本操作常识,不要奢望用金山WPS来使用带有宏的工作簿,谢谢!
警示:http://club.excelhome.net/forum. ... 804&pid=6532620

第一课:http://club.excelhome.net/thread-893760-1-1.html
第二课:http://club.excelhome.net/thread-894527-1-1.html
第三课:http://club.excelhome.net/thread-896608-1-1.html
第四课:http://club.excelhome.net/thread-897117-1-1.html
第五课:http://club.excelhome.net/thread-899268-1-1.html

高级篇:
第一课:http://club.excelhome.net/thread-902266-1-1.html
第二课:http://club.excelhome.net/thread-939881-1-1.html

*********************我是上课的分割线******************************


   网站链接:
   http://www.gzgcjg.com/gzqypjtx/Estimate/ZY/MainQueryMarkZY.aspx?

   提取目标:我们需要取得专业资质为建筑装修装饰工程的公司列表。

   关键点:这个网站是ASP服务器搭建,数据提取用POST进行,需要处理VIEWSTATE动态参数。

   ****************现在开始上课*******************

    1、启动Httpfox,点击Strat开始抓包

    1.JPG

    我们很容易就在抓到的第一个链接中,找到我们页面显示的数据,专业资质--地基与基础工程,这说明该链接即为有效链接。
    2、继续点击页面的下拉三角,选择--建筑装修装饰工程,观察抓包工具捕获的信息

    post.JPG

    这时可以看到浏览器采用Post方式,提交了许多信息。
    经过多次提交发现,网站POST的动态参数是两个“__VIEWSTATE”和"__EVENTVALIDATION"。另外变化的就是页码了。
    因此,我们下一步的工作就是找到这三个动态变化的参数。

    3.JPG

    部分POST用到的参数,在网页源代码中可以看到。
    那么,我们后继工作就是如何找到POST应该提交的信息内容,并使用winhttp模拟提交

    继续在抓包的页面中查找信息,很容易在第一个有效链接中,找到用于post提交的数据

    2.JPG

   
    得到用于提交的“__VIEWSTATE”和"__EVENTVALIDATION"参数在页面源代码中的位置,我们要进行提取,为构建POST字符串做准备






补充内容 (2013-6-26 22:23):
http://club.excelhome.net/thread-1026277-1-1.html 这个工具箱中有编码工具,支持URL编码,供post提交数据识别编码参考使用

评分

11

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-17 14:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 liucqa 于 2013-4-11 18:20 编辑

调用函数  Call getPostData(objWinhttp, URL) ,提取第一次POST需要的参数

  1. Private Sub getPostData(objWinhttp As Object, URL As String)
  2.     Dim tt$
  3.     '第一次调用取得post的几个参数
  4.     Application.StatusBar = "正在获取Post参数..."
  5.     With objWinhttp
  6.         .Option(6) = 0                                                    '不重定向
  7.         .Open "GET", URL, False                                     '获取第一个动态的POST参数,一般是用GET提交得到,这一点通过抓包软件可以确认
  8.         .setRequestHeader "Connection", "Keep-Alive"
  9.         .send
  10.         tt = .responseText
  11.         With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")       '调试用,得到网页源代码数据,放入剪贴板
  12.             .SetText tt
  13.             .PutInClipboard
  14.         End With
  15.     End With

  16.     If CheckServerError(objWinhttp.Status, tt) Then                 '判断是否网页返回错误
  17.         Application.StatusBar = False
  18.         Application.ScreenUpdating = True
  19.         Set objWinhttp = Nothing
  20.         Set dicMapIndex = Nothing
  21.         End
  22.     End If
  23.    
  24.    '如果网页正确,下面的代码从网页源代码中取出post提交的动态参数
  25.     viewstate = Split(Split(tt, "__VIEWSTATE"" value=""")(1), """")(0)                           '取得VIEWSTATE的Post参数
  26.     eventvalidation = Split(Split(tt, "__EVENTVALIDATION"" value=""")(1), """")(0)         '取得EVENTVALIDATION的Post参数
  27.     txtDay = Split(Split(tt, "ctl00$cph_content$txtDay"" type=""text"" value=""")(1), """")(0)      '提交日期,默认当日
  28. End Sub
复制代码



上面这个函数,就通过Winhttp的GET获取VIEWSTATE、EVENTVALIDATION等参数

得到Post提交的参数之后,我们就可以通过winhttp模拟提交Post参数,得到建筑装修装饰工程的第一页信息了



TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-17 14:16 | 显示全部楼层
本帖最后由 liucqa 于 2014-2-18 14:17 编辑

调用 getMultiPageData函数,通过Post获取首页数据和下一次做POST提交的VIEWSTATE等参数

  1. Private Sub getMultiPageData(objWinhttp As Object, URL As String, strItemName As String)
  2.     Dim tt$, postdata$, drptitle$, drpZzdj$, PagingForwardTo$, ScriptManager2, eventtarget$, page%, Maxpage%, sht As Worksheet

  3.     ScriptManager2 = "ctl00$UpdatePanel1|ctl00$cph_content$drpZzdj"        '切换专业资质的选择(首页),post参数
  4.     eventtarget = "ctl00$cph_content$drpZzdj"                         '切换专业资质的选择(首页),post参数
  5.     drptitle = "ECB034F6E40C4E33A5F8C7587D112CB6"        '这个参数在专业资质的页面是不变的,其他链接没有核对。
  6.     drpZzdj = dicMapIndex(strItemName)
  7.     PagingForwardTo = 1                               'post提交的页码

  8.     n = 1                 '记录输出数据的数组下标
  9.     Maxpage = 1     '最大页码

  10.     '***************打开选择的专业资质页面*******************
  11.     Application.StatusBar = "正在获取" & strItemName & "的首页..." & ",累计用时" & Format(Timer - t, "0.0秒"): DoEvents

  12.     tt = ""
  13.     With objWinhttp
  14.         .Option(6) = 1      '支持重定向,此例中有无均可
  15.         '下面是POST的字符串构建过程。
  16.         postdata = "ctl00$ScriptManager2=" & ScriptManager2 & _
  17.                    "&__EVENTTARGET=" & EncodePostdata(eventtarget) & _
  18.                    "&__EVENTARGUMENT=" & _
  19.                    "&__LASTFOCUS=" & _
  20.                    "&__VIEWSTATE=" & EncodePostdata(viewstate) & _
  21.                    "&__VIEWSTATEENCRYPTED=" & _
  22.                    "&__EVENTVALIDATION=" & EncodePostdata(eventvalidation) & _
  23.                    "&ctl00$WidthPixel=" & _
  24.                    "&ctl00$HeightPixel=" & _
  25.                    "&ctl00$cph_content$drpTitle=" & drptitle & _
  26.                    "&ctl00$cph_content$drpZzdj=" & drpZzdj & _
  27.                    "&ctl00$cph_content$txtEnterName=" & _
  28.                    "&ctl00$cph_content$txtDay=" & txtDay & _
  29.                    "&ctl00$cph_content$GridViewPaging1$txtGridViewPagingForwardTo=" & PagingForwardTo & _
  30.                    "&ctl00$cph_content$GridViewPaging1$btnForwardToPage=Go"
  31.         .Open "POST", URL, False
  32.         .setRequestHeader "Referer", "http://www.gzgcjg.com/gzqypjtx/Estimate/ZY/MainQueryMarkZY.aspx?clearPaging=true"             '提交来源
  33.         .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"                      'POST提交必备
  34.         .setRequestHeader "Content-Length", Len(postdata)                                                        'POST提交的长度信息
  35.         .setRequestHeader "Connection", "Keep-Alive"

  36.         .send (postdata)         ' 如果操作系统为XP,只有打上括号才能提交。(猜测可能和Unicode编码有关)

  37.         tt = .responseText
  38.         With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")       '调试用,数据放入剪贴板
  39.             .SetText tt
  40.             .PutInClipboard
  41.         End With
  42.         
  43.         If CheckServerError(objWinhttp.Status, tt) Then
  44.             Application.StatusBar = False
  45.             Application.ScreenUpdating = True
  46.             Set objWinhttp = Nothing
  47.             Set dicMapIndex = Nothing
  48.             End
  49.         End If

  50.         viewstate = Split(Split(tt, "__VIEWSTATE"" value=""")(1), """")(0)                     '获取VIEWSTATE参数
  51.         eventvalidation = Split(Split(tt, "__EVENTVALIDATION"" value=""")(1), """")(0)   '获取EVENTVALIDATION参数
  52.         Maxpage = Val(Split(Split(tt, "共<font color='red'>")(2), "</font>页")(0))          '获取最大页码数,为后继的Post循环做准备
  53.     End With
  54. End Sub
复制代码

演示程序到此就结束了,在实际应用中,得到最大页码之后,还要通过循环POST取得每个页面的数据,具体要提交的参数可以通过抓包软件得到,这里不再赘述。




评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-17 14:17 | 显示全部楼层
本帖最后由 liucqa 于 2017-9-25 19:38 编辑

在POST提交过程中,有的时候会发现明明取得的VIEWSTATE参数是正确的,为什么POST出去的数据得不到服务器的正确应答呢?

这是因为根据RFC1738规范和Query_string的URL_encoding编码规定,浏览器提交的数据要经过URL编码之后才能提交。不同的抓包软件在显示时对这一点的处理是不同的。例如:HTTPFOX只有在Raw模式才能看到真正POST的数据

4.JPG

5.JPG

上面两个图片显示了在不同模式下看到的POST信息的差异,在Raw模式下,看到的是真正提交的数据,特殊字符经过了URL编码处理。

URL编码规则是什么呢:
RFC1738说明了保留字、特殊符号、不安全字符的含义——也就是说,下面三类字符可以不经过编码,直接出现在URL上:
1类数字字母:[0-9a-zA-Z]
2类特殊字符:$-_.+!*’(),
3类保留字符:&/:;=?@

在这个链接中,说明了URL编码的规则  http://en.wikipedia.org/wiki/Query_string#URL_encoding
  • SPACE is encoded as '+' or '%20'
  • Letters (A–Z and a–z), numbers (0–9) and the characters '*','-','.' and '_' are left as-is
  • All other characters are encoded as %HH hex representation with any non-ASCII characters first encoded as UTF-8 (or other specified encoding)

简单的说,就是
1、数字、字母、和特殊字符*-._不变
2、空格字符使用加号代替,或者用%20编码(由网站的代码决定)
3、其他的字符包括中文被视为不安全字符,需要做%开头的编码,推荐是UTF-8,也可以是其他编码。

因此,我们做POST提交的时候,会面临一个麻烦:在上述说明的第三点中,如何快速判断网站提交到底是用的什么编码呢?
一般来说,需要我们用抓包软件进行确认。
如果汉字被转成2个以%开头的编码,一般是ANSI的编码方式(简体中文版的系统就是GB2312),很多国内网站用这种方式
如果汉字被转成3个以%开头的编码,一般是UTF-8的编码方式

比如“中国”两个字:
按gb2312进行编码:           %D6%D0%B9%FA
按utf8或unicode进行编码: %E4%B8%AD%E5%9B%BD
根据这个规律,就可以初步判断编码方式,并对提交的Post数据进行URL编码了。

在一楼代码链接的示例中,给出了一个EncodePostdata的编码函数,这个函数是不完整的,只能处理部分字符。

下面给出一个完整的符合Query_string URL_encoding规范的URL ANSI编码函数


Sub testbig5()
    Dim b() As Byte, str$
    str = "基隆市你好-._~abcxyzABCXYZ012789/:;'""<>,{}[]\|)(*&^%$#@!~`"
    b = StrConv(str, vbFromUnicode, &H404)   '改成804就是简体中文,404是繁体中文
    str = Byte2URLEncodePlus(b)
    If str = "%B0%F2%B6%A9%A5%AB%A7A%A6n-._%7EabcxyzABCXYZ012789%2F%3A%3B%27%22%3C%3E%2C%7B%7D%5B%5D%5C%7C%29%28*%26%5E%25%24%23%40%21%7E%60" Then
        MsgBox "ok"
    Else
        Debug.Print str
    End If
End Sub

Function Byte2URLEncodePlus(b() As Byte) As String
    Dim i, urlstr$
    For i = 0 To UBound(b)
        If (b(i) >= 65 And b(i) <= 90) Or (b(i) >= 97 And b(i) <= 122) Or (b(i) >= 48 And b(i) <= 57) Then
            urlstr = urlstr & CStr(Chr(b(i)))
        Else
            Select Case b(i)
                Case &H2A, &H2D, &H2E, &H5F                  '"*", "-", ".", "_"
                    urlstr = urlstr & Chr(b(i))
                Case &H20
                    urlstr = urlstr & "+"     '空格处理成+号
                Case Else
                    urlstr = urlstr & "%" & CStr(Hex(b(i)))
            End Select
        End If
    Next
    Byte2URLEncodePlus = urlstr
End Function
说明:
如果网站要求的URLEncode的编码是UTF-8的话,一般来说,无须在代码中处理,XMLHTTP可以自行在Post的同时给转成UTF-8的URL编码的。
如果使用WINHTTP,还可以在Option参数中指定URL编码方式。Option(2) = 936或950或65001           'GB2312/BIG5/UTF-8

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-17 14:18 | 显示全部楼层
本帖最后由 liucqa 于 2013-4-11 18:22 编辑

其他相关知识:

很多网站直接使用JS的编码函数做URI的编码,在JS的编码函数中中,对特殊字符的处理有所不同,下面简单介绍一下

escape() 方法: 采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符ANSI编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。汉字转换为%u开头的Unicode码不会被此方法编码的字符: @ * / +

encodeURI() 方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '

encodeURIComponent() 方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( ) '

下面给出vba使用js的encodeURI进行编码的三种方法(解码在JS中都有对应的函数)
  1. Public Function Escape(ByVal strText As String) As String     '如果值中带有非英文和数字,则需转换成%形式
  2.     Set JS = CreateObject("msscriptcontrol.scriptcontrol")
  3.     JS.Language = "JavaScript"
  4.     'Escape = JS.Eval("encodeURI('" & Replace(strText, "'", "\'") & "');")
  5.     'Escape = JS.Eval("escape('" & Replace(strText, "'", "\'") & "');")
  6.     Escape = JS.Eval("encodeURIComponent('" & Replace(strText, "'", "\'") & "');")
  7. End Function
复制代码

如何处理提交给网站的URL字符串,没有一定之规。不同的网站URL编码并不相同,这需要我们通过抓包软件耐心确认RFC1378规定的几个特殊字符的编码方式。草率的写出编码代码,即使调试通过,在实际抓包的时候可能也会因为个别字符的编码错误而导致数据采集失败。

一般来说,表单用什么编码请求页面数据取决于当前页面的编码是什么。





评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-17 14:19 | 显示全部楼层
本帖最后由 liucqa 于 2014-5-30 20:20 编辑

第二课小结:

    本课以一个实例,讲解了使用POST提交并获取网页数据的方法以及提交字符串的URLEncode的规则。请同学们课后找一些网站多多测试、练习抓包软件的使用方法和观察POST参数提交的处理办法。

    一般来说,使用GET提取网页数据,考验的是VBA的字符串处理基本功。使用POST提取网页数据,更加考验的是抓包软件的使用和对Head头、网页源代码的了解。

    在实际的网页采集中,往往我们会碰到比示例的网站复杂几倍乃至几十倍的网页。一个完整的网页采集程序,需要处理以下问题:
    1、如果有必要的话,登录网站。可能需要过验证码(需要获取图片以及做OCR识别)
    2、找到网站的初始链接,获取Cookie或者viewstate等隐藏的submit信息,为提交真正的数据链接做准备。
    3、如果有必要的话,找到网站中文语言的设置方法,可能是直接写在链接里面、可能写在提交的参数里面、可能要做专门的语言设置链接提交。
    4、找到网站的数据链接,抓包获取Referer值,解决防盗链
    5、处理初始网页,获取为后面数据链接提交所需要的参数(可能没有,也可能有许多)
    6、处理网站数据链接的提交参数(可能有时间戳),可能是GET方式、可能是POST方式。后者还要处理URLEncode编码或其他形式的编码问题(如果是UTF-8编码,XMLHTTP会自己处理;WinHttp可以通过参数选择URL编码的格式)。
    7、判断网站返回数据的编码,处理成可以识别的字符串
    8、处理需要采集数据的字符串,可能要从中提取页码,可能要提取下一页的参数、可能要用数组的方式提取所需要的信息(网页表格尤其如此)
    9、循环执行6~8,直至数据提取结束


    其实,无论网站有多么复杂,获取数据的基础无外乎两点:
    1、抓包看链接、Coolie、Referer、Post参数、隐藏的submit参数等等
    2、处理编码并提取字符串
    只要精通这两个基本步骤,再加上充裕的时间、坚定的信念、充分的耐心和一点点运气,网页采集的工作就迎刃而解了!


    相信我吧



本课示例的参考代码:
http://club.excelhome.net/thread-880373-1-1.html



  1. ViewState初探  

  2. 2012-04-28 09:40:20|  分类: .NET/C# |举报|字号 订阅
  3. 与刚接触 ASP.NET 页面的开发人员交谈时,他们通常向我提出的第一个问题就是:“那个 ViewState 到底是什么?”他们的语气中流露出的那种感觉,就象我来到一家异国情调的餐馆,侍者端上一道我从未见过的菜肴时的那种感觉 - 既疑惑不解,又充满好奇。但肯定有人认为它不错,否则就不会提供了。所以,我会先尝一尝,或许会喜欢上它,尽管它看上去的确很古怪!
  4. 对于 ViewState 也是如此,但是如果适应了它的风格,您会发现在许多情况下,您将乐于在自己的 ASP.NET 应用程序中使用 ViewState,因为它可以帮助您使用更少的代码完成更多的工作。但是,有时也会对 ViewState 完全弃之不用。下面我们就这两种情况分别进行阐述,不过,让我们先回答什么是 ViewState 这个问题。  酷爱Cooai.com
  5. 答案:ViewState 用于维护页面的 UI 状态

  6. Web 是没有状态的,ASP.NET 页面也没有状态,它们在到服务器的每个往返过程中被实例化、执行、呈现和处理。作为 Web 开发人员,您可以使用众所周知的技术(如以会话状态将状态存储在服务器上,或将页面回传到自身)来添加状态。下面我们以图 1 中的注册窗体为例进行论述。
  7. 图 1:恢复回传的窗体值
  8. 从上图中可以看出,我为便餐选择了一个无效的值。此窗体与 Web 上的多数窗体一样友好,它在出现错误的字段旁边显示一条有用的错误消息和一个星号。而且,窗体中还显示了我在其他文本框和下拉列表中输入的所有有效值。这在某种程度上是可能的,因为 HTML 窗体元素会在 HTTP 标头中将其当前值从浏览器发送到服务器。您可以使用 ASP.NET 跟踪来查看回传的窗体值,如图 2 所示。

  9. 图 2:HTTP 窗体中回传的值(通过 ASP.NET 跟踪显示)
  10. 在 ASP.NET 之前,通过多次回传将值恢复到窗体字段中完全是页面开发人员的责任,他们将不得不从 HTTP 窗体中逐个拾取回传值,然后再将其推回字段中。幸运的是,现在 ASP.NET 可以自动完成这项任务,从而为开发人员免除了一项令人厌烦的工作,同时也无需再为窗体编写大量的代码。但这并不是 ViewState。
  11. ViewState(英文)是一种机制,ASP.NET 使用这种机制来跟踪服务器控件状态值,否则这些值将不作为 HTTP 窗体的一部分而回传。例如,由 Label 控件显示的文本默认情况下就保存在 ViewState 中。作为开发人员,您可以绑定数据,或在首次加载该页面时仅对 Label 编程设置一次,在后续的回传中,该标签文本将自动从 ViewState 中重新填充。因此,除了可以减少繁琐的工作和代码外,ViewState 通常还可以减少数据库的往返次数。
  12. ViewState 的工作原理

  13. ViewState 确实没有什么神秘之处,它是由 ASP.NET 页面框架管理的一个隐藏的窗体字段。当 ASP.NET 执行某个页面时,该页面上的 ViewState 值和所有控件将被收集并格式化成一个编码字符串,然后被分配给隐藏窗体字段的值属性(即 <input type=hidden>)。由于隐藏窗体字段是发送到客户端的页面的一部分,所以 ViewState 值被临时存储在客户端的浏览器中。如果客户端选择将该页面回传给服务器,则 ViewState 字符串也将被回传。在上面的图 2 中可以看到 ViewState 窗体字段及其回传的值。
  14. 回传后,ASP.NET 页面框架将解析 ViewState 字符串,并为该页面和各个控件填充 ViewState 属性。然后,控件再使用 ViewState 数据将自己重新恢复为以前的状态。
  15. 关于 ViewState 还有三个值得注意的小问题。
  16. 如果要使用 ViewState,则在 ASPX 页面中必须有一个服务器端窗体标记 (<form runat=server>)。窗体字段是必需的,这样包含 ViewState 信息的隐藏字段才能回传给服务器。而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面时,ASP.NET 页面框架才能添加隐藏的字段。
  17. 页面本身将 20 字节左右的信息保存在 ViewState 中,用于在回传时将 PostBack 数据和 ViewState 值分发给正确的控件。因此,即使该页面或应用程序禁用了 ViewState,仍可以在 ViewState 中看到少量的剩余字节。
  18. 在页面不回传的情况下,可以通过省略服务器端的 <form> 标记来去除页面中的 ViewState。
复制代码

评分

6

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-7-17 14:23 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-7-17 14:25 | 显示全部楼层
公司电脑无法注册winhttp的组件,这个我只能旁听了。

点评

也可以用其它组件做post,代码是一样的  发表于 2012-7-17 14:35

TA的精华主题

TA的得分主题

发表于 2012-7-17 14:30 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 星剑所指 于 2012-7-17 14:31 编辑

liucqa 大师你把你抓网页教程都加个完整的目录,把第一课的链接加进来。方便想学习的人快速点击链接系统学习

文艺青年,又轮到你出场了

点评

呵呵,不急,慢慢来  发表于 2012-7-17 14:34

TA的精华主题

TA的得分主题

发表于 2012-7-17 14:33 | 显示全部楼层
尼玛,还没开讲,居然开始收藏了?谁啊?
untitled.JPG
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 21:49 , Processed in 0.063262 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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