![Office VBA开发经典:中级进阶卷](https://wfqqreader-1252317822.image.myqcloud.com/cover/711/26542711/b_26542711.jpg)
1.4 使用ADODB.Stream实现文件读写
对于UTF-8编码的含中文的文本文件,无论是以传统方式,还是用FSO的TextStream对象打开,读取到的内容会出现乱码。
本书源文件“utf-8File.txt”文件中也是一首二十四节气歌,但是该文件的编码格式是UTF-8,如图1-52所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/778.jpg?sign=1739374816-R5FFXpN7kKDo3cueTeELZNTx3SwYBC0s-0-198d142817a794530918161cf80ed6a1)
图1-52 UTF-8编码的文本文件
使用前面讲过的FSO方式读取该文件,读取到的是乱码,如图1-53所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/779.jpg?sign=1739374816-ZEEKgUzoKsAzS9cW5GW7esMnJgNojtEE-0-3b8e6764de1e38c43fba8ce0b8940c7b)
图1-53 不期望的读取结果
下面讲述一种能够按照指定编码打开文件的方式:ADODB.Stream对象。
1.4.1 对象的引入
ADODB是一个非常重要的对象,经常用于数据库操作,在后面的章节会探讨ADODB操作数据库方面的知识,本节介绍一下ADODB.Stream读写文件。
前期绑定:工程中添加引用“Microsoft ActiveX Data Objects 2.8”,如图1-54所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/781.jpg?sign=1739374816-ZyPCp3q1y8KiGFungDvMqu4Tx7yK38OA-0-e37423dfa382afa54a38d2315f6d3119)
图1-54 添加外部引用
代码中声明:Dim AStream As New ADODB.Stream,会看到自动成员提示,说明绑定成功,如图1-55所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/782.jpg?sign=1739374816-jogxzXjZcfwOyU7LBoA5YbYGiqgX8jZY-0-f2cd758f5f8bff25105da986e123e79f)
图1-55 使用ADODB.Stream
后期绑定:在工程中不添加ADODB的前提下,使用CreateObject("ADODB.Stream")创建一个新的Stream对象。
1.4.2 读取文本文件
ADODB.Stream对象通过LoadFromFile方法载入文本文件,然后用ReadText方法读取所有内容。
如果ReadText后面不带参数,则相当于FSO中的ReadAll,读取全部内容,如果是ReadText i,则表示读取i个字符。
但是在装载文件之前,必须预设ADODB.Stream对象的若干属性。
Type属性:读写文本文件用adTypeText(2),读写二进制文件用adTypeBinary(1)。
Mode属性:使用adModeReadWrite(3),可读写。
CharSet属性:指定文件编码,要根据文本文件的编码来设定。
以下过程读取UTF-8格式的二十四节气歌的前四个字符。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/783.jpg?sign=1739374816-57ANs0sndfrz3iXJx8a0Trkzu722kPB2-0-3986677e40ccc15b92f238d1ca81f374)
上述过程的打印结果是:“春雨惊春”。如果把ReadText(4)改成ReadText,则读取出所有内容。
对应的后期绑定代码如下所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/784.jpg?sign=1739374816-T3TpXbw8H4Z9rkjVKVesjflvQ8ZGRvDS-0-48c1b978bc357817be9e4bf7db725a43)
需要注意的是,由于代码中采用了后期绑定方式,并未在工程中添加ADODB引用,因此Type、Mode等属性不能用枚举常量,只能使用枚举常量的等价值。
1.4.3 写入文本文件
使用ADODB.Stream写入文本文件的步骤是:创建对象→设定属性→打开对象→写入内容→保存到文件→关闭对象。
下面的代码把一个字符串重复两次写入文本文件,并保存为UTF-8格式。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/787.jpg?sign=1739374816-7BjOe5bQhuwJNFhaHPAQm6V8xibWzB0k-0-f87855d61e0795da671e08dbe7397efa)
代码分析:枚举常量adSaveCreateOverWrite(2)表示如果目标文件已存在,则覆盖保存。
运行上述过程,再次打开记事本文件,如图1-56所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/786.jpg?sign=1739374816-cI8fMKkFkuRaF87gDPNOteVtiFp6DAdC-0-790e3194eb833ab4d39b96424e0644a1)
图1-56 保存为UTF-8文件
1.4.4 利用ADODB.Stream下载网页附件
除了文本文件以外,ADODB.Stream还可以读写二进制文件。在二进制文件代码编写方面,需要改动的地方主要有以下两个。
Type属性:需要改为adTypeBinary。
ReadText方法、WriteText方法分别更改为Read、Write。
下面讲解ADODB.Stream对象联合使用XMLHttp对象,实现网页附件下载到本地的功能。
XMLHttp对象经常用于向HTTP服务器发送请求,其前期绑定方式是向工程中添加引用“Microsoft XML v6.0”,如图1-57所示。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/785.jpg?sign=1739374816-QbkPGS1AwLwqyU63pLEaaxMRy5zfQdDb-0-1c6f6aee4f9fedb3062974b48db762a1)
图1-57 添加外部引用
后期创建对象的方法是:CreateObject("Microsoft.XMLHTTP")。
XMLHttp对url完成请求后,返回的ResponseBody是一个未解码的二进制数据,因此,得到这个二进制数据后,用ADODB.Stream写入计算机中的文件即可实现附件的下载。
下面的实例从WinRAR压缩软件的官方网站下载WinRAR 5.50的安装文件。
![](https://epubservercos.yuewen.com/F986E7/15056702504171006/epubprivate/OEBPS/Images/788.jpg?sign=1739374816-jS9SlbG093hlfqD8QldBtJGSlG1E5lVs-0-6fd76caa8be00ae19efb97920ff5c6ba)
代码分析:Content()是一个字节数组,用于存储XMLHttp返回的ResponseBody,然后用ADODB.Stream的Write方法,把Content保存为文件。
运行上述过程后,C:\temp\文件夹下多了一个Winrar550.exe文件。
以上内容的源代码文件为“实例文档05.xlsm”。