【问题标题】:How to export sheet/column in VBA to XML in UTF-8 formatting如何以 UTF-8 格式将 VBA 中的工作表/列导出为 XML
【发布时间】:2021-04-27 19:16:34
【问题描述】:

我已经编写了一个宏,它在某个工作表的 A 列中输出 xml 行(具有正确的格式)。因此,该表中的每一行都应对应于 xml 文件中的 1 行。如果我将此列复制粘贴到记事本中并将其保存为 .xml(在删除自动放置在每一行之前和之后的“-tags”之后),我就有了我需要的文件。宏应该生成几个文件,所以它是不实际地为每个文件手动执行此操作。

我找到了以下代码来完成保存工作:

strFileName = Application.ActiveWorkbook.Path & "\" & NameOfTheFile & ".xml"
Sheets(NameOfSheetContainingData).SaveAs Filename:=strFileName, FileFormat:=xlTextPrinter, CreateBackup:=False

这很好用,除了 UTF-8 格式。我在 excel 中有一个“é”,它在 xml 文件中变成了一个“xE9”。

如果有人能帮我解决这个问题,我会非常感激 :)

【问题讨论】:

  • éa valid way 在 XML 中表示 é
  • 您好 GSerg,问题是需要 XML 文件的程序在 xE9 出现的行出现错误
  • 试试FileFormat:=xlUnicodeText
  • 嗨 CDP1802,é 现在显示正确,但现在每行都放在引号 ( " ) 之间。(这稍微好一点,因为在每个文件中手动替换 " 比暂停每个宏是时候复制粘贴了
  • 完整的脚本有多少代码?是否可以将其添加到您的问题中?

标签: excel xml vba utf-8


【解决方案1】:

试试

Sub SaveUTF8()

   Const NameOfTheFile = "test"
   
   Dim FSO, ts, ar, strFilename As String, s As String
   Dim i As Long, t0 As Single: t0 = Timer

   strFilename = ActiveWorkbook.Path & "\" & NameOfTheFile & ".xml"

   Set FSO = CreateObject("Scripting.FileSystemObject")
   Set ts = FSO.createTextfile(strFilename, 1, 1) ' oversrite, utf8
 
   ar = Sheets(1).UsedRange.Columns(1).Value2 'NameofSheetContainingData

   For i = LBound(ar) To UBound(ar)
       s = s & ar(i, 1) & vbCrLf
       If i Mod 1000 = 0 Then
           ts.write s
           s = ""
       End If
   Next
   ts.write s
   ts.Close
   MsgBox strFilename & " created in " & Int(Timer - t0) & " seconds"
   
End Sub

另类

Sub SaveUTF8_2()

    Const NameOfTheFile = "test"
   
    Dim strFilename As String, cell As Range
    Dim t0 As Single: t0 = Timer

    strFilename = ActiveWorkbook.Path & "\" & NameOfTheFile & ".xml"

    Dim objStream
    Set objStream = CreateObject("ADODB.Stream")
    With objStream
        .Type = 2 'adTypeText
        .Open
        .Charset = "UTF-8"
        For Each cell In Sheets(1).UsedRange.Columns(1).Cells
            .writetext cell.Value2, 1 'adWriteLine
        Next
        .Position = 0
        .SaveToFile strFilename, 2  'adSaveCreateOverWrit
    End With
    objStream.Close
    MsgBox strFilename & " created in " & Int(Timer - t0) & " seconds"

End Sub

Sub testdata()
    Sheet1.Range("A1:A300000").Value2 = _
    "<tag atr1=""attribute one"" atr2=""attribute two"">some text here ééé</tag>"
End Sub

更新——批量写入1000行

update2 - 添加替代项

【讨论】:

  • 谢谢!它必须做的事情是否会出现! 40k 行大约需要 1 小时,因此对于整个宏,这将归结为 20 小时。有没有办法加快速度?
  • @nico 应该需要几秒钟! saveas 方法用了多长时间,文件有多大(兆字节)?
  • 保存文件需要几秒钟。文件大小约为 2MB。我首先自己制作了一个子程序,它循环行并一次写入 1 行。但是因为一个小集合花了很长时间,我搜索了网络并遇到了 saveas-method。
  • @nico 我不知道为什么写入需要这么长时间,工作簿是在网络驱动器上吗? 2MB 的 300k 行文件每行只有几个字节。我已经修改了代码以批量编写 1000 行。试试看。
  • 文件确实在网络驱动器上。我把它移到桌面上,现在只需要几秒钟!不幸的是,我之前似乎打开了错误的测试文件。重音仍然显示为 xe9 :(。我想我将用普通字母替换它们,因为它只影响 1000 行。
猜你喜欢
  • 2021-08-24
  • 2012-09-23
  • 2011-04-17
  • 1970-01-01
  • 2013-10-06
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 2014-08-29
相关资源
最近更新 更多