Convert Excel data to JSON CSV and XML format
By default, Excel doesn’t provide any formula to convert a range or a table into a JSON (JavaScript Object Notation), CSV (Comma Separated Value) or to an XML (Extensible Markup Language) format. This article shows how to convert a range or a table into JSON, XML, or a CSV format.
Convert Excel data to JSON format
Once the code below is pasted to the VBA, one can use a formula ToJSON and convert a range to a JSON format. The second argument in the formula is optional. When this argument is set to false, the name part of the JSON will NOT be surrounded by a quote as shown in the image above.
Public Function ToJSON(table As Range, Optional quoted As Boolean = True) As String
' Make sure there are two columns in the range
If table.Columns.count < 2 Then
ToJSON = CVErr(xlErrNA)
Exit Function
End If
Dim dataLoop, headerLoop As Long
' Get the first row of the range as a header range
Dim headerRange As Range: Set headerRange = Range(table.Rows(1).address)
' We need to know how many columns are there
Dim colCount As Long: colCount = headerRange.Columns.count
Dim json As String: json = "["
Dim quote As String: quote = """"
If Not quoted Then quote = ""
For dataLoop = 1 To table.Rows.count
' Skip the first row as it's been used as a header
If dataLoop > 1 Then
' Start data row
Dim rowJson As String: rowJson = "{"
' Loop through each column and combine with the header
For headerLoop = 1 To colCount
rowJson = rowJson & quote & headerRange.Value2(1, headerLoop) & quote & ":"
rowJson = rowJson & """" & table.Value2(dataLoop, headerLoop) & """"
rowJson = rowJson & ","
Next headerLoop
' Strip out the last comma
rowJson = Left(rowJson, Len(rowJson) - 1)
' End data row
json = json & rowJson & "},"
End If
Next
' Strip out the last comma
json = Left(json, Len(json) - 1)
json = json & "]"
ToJSON = json
End Function
Convert Excel data to XML format

Converting to XML format is very similar to JSON format. Over the internet (client/server communication) XML format is losing ground however it is still used in web or other places.
Public Function ToXML(rng As Range, Optional dataRowName As String = "Data") As String
' Make sure there are two columns in the range
If rng.Columns.count < 2 Then
ToXML = CVErr(xlErrNA)
Exit Function
End If
Dim dataLoop, headerLoop As Long
' Get the first row of the range as a header range
Dim headerRange As Range: Set headerRange = Range(rng.Rows(1).address)
' We need to know how many columns are there
Dim colCount As Long: colCount = headerRange.Columns.count
Dim xml As String: xml = ""
For dataLoop = 1 To rng.Rows.count
' Skip the first row as it's been used as a header
If dataLoop > 1 Then
' Start data row
Dim rowXml As String: rowXml = xml & "<" & dataRowName & ">"
' Loop through each column and combine with the header
For headerLoop = 1 To colCount
rowXml = rowXml & "<" & headerRange.Value2(1, headerLoop) & ">"
rowXml = rowXml & CStr(rng.Value2(dataLoop, headerLoop))
rowXml = rowXml & "</" & headerRange.Value2(1, headerLoop) & ">"
Next headerLoop
' End data row
xml = rowXml & " </" & dataRowName & " > "
End If
Next
ToXML = xml
End Function
Convert Excel data to CSV format

CSV format is very common format used at so many places to transport data. Eventhough CSV stands for Comman Separated Value, there are lot of other character used to separate values. So in the formula below, one can specify the delimitter character. Also if the values need to be surrounded by a single quote, the second argument can be set to true.
Public Function ToCsv(valueRange As Range, Optional quoted As Boolean = False, Optional delemiter As String = "'") As String
Dim sb As String: sb = ""
Dim iRow, iCol As Integer
' index for loop is used to control the loop direcdtion
' with for each loop we will at mercy of application
For iRow = 1 To valueRange.Rows.count
For iCol = 1 To valueRange.Columns.count
If quoted Then
sb = sb & delemiter & "'" & valueRange.Value2(iRow, iCol) & "'"
Else
sb = sb & delemiter & valueRange.Value2(iRow, iCol)
End If
Next
Next
' Strip the last delemeter out
ToCsv = Right(sb, Len(sb) - 1)
End Function

