Sub testv7()
Dim bm As New cBenchmark
Debug.Print "Test de : ListfeuilleXmlTarV5 avec Tar+ split stdout.readal + Ansi to utf-8"
xlsxPath = "C:\Users\patricktoulon\Desktop\Classeur1.xlsx"
bm.TrackByName "debut ListfeuilleXmlTarV5 avec Tar+ split stdout.readal + Ansi to utf-8"
x = ListfeuilleXmlTarV5(xlsxPath)
bm.TrackByName "fin ListfeuilleXmlTarV5 avec Tar+ split stdout.readal + Ansi to utf-8"
MsgBox Join(x, vbCrLf)
End Sub
Function ListfeuilleXmlTarV5(xlsxPath)
Dim cmd As String, codxml As String
Dim streamAnsi As Object, streamUtf8 As Object
' Commande tar pour extraire le XML directement vers StdOut
cmd = "cmd /c tar -xOf """ & xlsxPath & """ xl/workbook.xml"
'execution de la ligne de commande avec wscrip.shell mais cette fois si avec exec et non run
'car il nous faut le stdout.readall directe sans passer par l'object clipboard
With CreateObject("WScript.Shell")
codxml = .exec(cmd).StdOut.ReadAll
End With
'les caractères echapés
codxml = Replace(codxml, "&", "&")
codxml = Replace(codxml, "<", "<")
codxml = Replace(codxml, ">", ">")
codxml = Replace(codxml, """, """")
codxml = Replace(codxml, "'", "'")
'ajouter des eventuels replace que je n'ai pas vu ou testé
'codxml = Replace(codxml,"blablabla","trucbidule")
'format Ansi on l'ecrit comme il est même si c'est pas bon en Ansi
'car extraction par le redall est en Ansi
Set streamAnsi = CreateObject("ADODB.Stream")
With streamAnsi
.Type = 2: .Charset = "windows-1252": .Open: .WriteText codxml: .Position = 0: .Type = 1
End With
'format UTF-8
'on copie le streamAnsi dans le streamUTF8 mais on l'encode avec utf-8
Set streamUtf8 = CreateObject("ADODB.Stream")
With streamUtf8
.Type = 1: .Open: streamAnsi.CopyTo streamUtf8: .Position = 0: .Type = 2: .Charset = "utf-8"
xmlContent = .ReadText
End With
'fermeture des streamer
streamAnsi.Close: streamUtf8.Close
'on prend les même et on recommence
t = Split(xmlContent, "<sheet name=""") 'on coupe le texte par les ouvertures de balise "sheet"
ReDim tx(1 To UBound(t) + 1) 'on dimentionne un tablkeau de même taile que le split EN BASE 1!!!!!
For i = 1 To UBound(t)
tx(i) = Split(t(i), """")(0) 'on prends que la partie qui nous interesse donc ni plus ni moins que l'attribut name
Next
ListfeuilleXmlTarV5 = tx 'le return c'est le tableau tx
End Function