VBA 生成文件方法:

使用 ADODB.Stream 生成文件,通过控制文件的后缀,应该是什么文件都可以生成。

Dim WriteStream2 As Object  '定义一个对象
Set WriteStream2 = CreateObject("ADODB.Stream")   '创建一个 ADODB.Stream 对象
With WriteStream2 
    .Type = 2 'adTypeText  '点 相当于 面向对象那些语言里的点,给WriteStream2对象的type进行设置。
    .Charset = "utf-8"       '这里选择自己想要的编码格式
    .Open
    .WriteText tableCreatelast 'tableCreatelast 是要写入的数据,是字符串
    .SaveToFile outSqlfilename, 2 'adSaveCreateOverWrite ' outSqlfilename 是文件路径+文件名 例如:E:\program\aa.xml
    .flush
    .Close
End With
Set WriteStream2 = Nothing   '释放对象变量所占的内存空间需要

tableCreatelast 文本中的一些格式设置使用chr() 码来写,比如   空格 Chr(32); 换行 Chr(10)。Chr() 码一榄 链接

链接里面Chr("10")有引号,如果报错可以试一下去掉引号,因为我写代码时候是去掉的Chr(10)。

VBA 生成文件编码格式设置为utf-8:

上面的写法生成的文件是utf-8 bom格式。这是由于在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。

BOM —— Byte Order Mark,中文名译作“字节顺序标记”

因此想要得到utf-8 格式,需要把前面三个不可见的字符去掉。

下面是具体操作例子:

注意点:

1)position 属性,设置或返回 Long 值,指定流开始处到当前位置的偏移字节数。默认值为 0,表示流中的第一个字节。
Position 属性,必须写在文本写入操作后面因为没有写入的情况下,Stream 对象里面什么都没有,位置也是只能为0, Position=3  就会报错。

2)流 的关闭一定要在复制到另一个流里面之后关闭哦,要不然会报错。

Dim sWriteStream, newsWriteStream As Object
'ADODB.Stream对象
Set sWriteStream = CreateObject("ADODB.Stream")
Set newsWriteStream = CreateObject("ADODB.Stream")
'这步操作是把文本先写入 sWriteStream,位置也设置到3,这样就去掉BOM的那三个字符了。
With sWriteStream
            .Open        '打开 Stream 对象
            .Type = 2    'Stream 对象中的数据类型:二进制或文本,adTypeText(默认文本,值为2)adTypeBinary(二进制 值为1)
            .Charset = "utf-8"
            .WriteText stableCreate  '写入文本,stableCreate是存储文本的变量
            .Position = 3  'Stream 对象中的当前位置,
End With
'从新打开一个流进行设置 ,这个作为生成文件的流       
With newsWriteStream
            .Type = 1 'adTypeBinary '这个流 使用的二进制模式
            .Mode = 3 'adModeReadWrite ' Stream 的访问模式  	读/写权限,不设置不知道可以不,还没尝试。
            .Open
End With
'让sWriteStream(写入了文本的流)把要输出的文本复制到 newsWriteStream(输出文件的流),并关闭流
With sWriteStream
    .CopyTo newsWriteStream
    .Flush
    .Close '流打开一定要关闭,
End With
With newsWriteStream
     .SaveToFile soutSqlfilename, 2  'adSaveCreateOverWrite 覆盖模式,如果之前存在文件,就覆盖,不存在就新建 soutSqlfilename是文件路径+文件名,上面说到过可以去看一下。
     .Flush
     .Close
End With
Set sWriteStream = Nothing
Set newsWriteStream = Nothing

 

相关解释,附加链接:

有兴趣可以多了解,上面不清楚的可以看看会豁然开朗

1)with ... end with  使用可以提高代码执行速度。

2)给对象赋值,使用   set  对象 = 值

3) WriteStream2 = NothingNothing 可选的。断绝 与任何指定对象的关联。若没有其它变量指向原来所引用的对象,将其赋为 Nothing 会释放该对象所关联的所有系统及内存资源。

4) 关于mode属性 其他的详细介绍:ADO Mode 属性 (w3school.com.cn)

上面ADODB.Stream使用的那些属性可以看 下面的百度链接,里面讲的很详细哦,其实网上很多解说跟百度都一模一样,不知道是谁借鉴谁了。

ADODB.Stream 对象超级详细介绍(百度):adodb.stream_百度百科 (baidu.com)

 

posted on 2022-08-02 15:46  爱吃玉米的tutu  阅读(1257)  评论(0编辑  收藏  举报