Skip to content

Instantly share code, notes, and snippets.

@ceruleancerise
Last active May 14, 2026 09:54
Show Gist options
  • Select an option

  • Save ceruleancerise/de1f6a7a9bf285e033e9135c5049216b to your computer and use it in GitHub Desktop.

Select an option

Save ceruleancerise/de1f6a7a9bf285e033e9135c5049216b to your computer and use it in GitHub Desktop.
OpenOffice / LibreOffice: .ods Export To JSON (BASIC Macro)
REM ***** BASIC *****
'Exports sheet(s) to JSON in this file's directory under their sheet name.'
'Booleans are exported as int (1 = true, 0 = false).'
SUB JSONExportAll
sheets = ThisComponent.Sheets
numSheets = sheets.Count
FOR i = 0 TO (numSheets - 1)
sheet = Sheets(i)
ThisComponent.getCurrentController.setActiveSheet(sheet)
JSONExport
NEXT i
END SUB
'--------------------------------------'
SUB JSONExport
sheet = ThisComponent.getCurrentController.getActiveSheet
numCols = 0
cell = sheet.getCellByPosition(0, 0)
WHILE cell.Type <> com.sun.star.table.CellContentType.EMPTY
numCols = numCols + 1
cell = sheet.getCellByPosition(numCols, 0)
WEND
numRows = 0
cell = sheet.getCellByPosition(0, 0)
WHILE cell.Type <> com.sun.star.table.CellContentType.EMPTY
numRows = numRows + 1
cell = sheet.getCellByPosition(0, numRows)
WEND
'Properties is the keys for the values.'
propertyRange = sheet.getCellRangeByPosition(0, 0, numCols - 1, 0)
propertyArray = propertyRange.getDataArray()(0) '2D Array, but only need row.'
cells = sheet.getCellRangeByPosition(0, 0, numCols - 1, numRows - 1).getDataArray()
fileName = GetDirectory + sheet.Name + ".json"
file = Freefile
OPEN fileName FOR OUTPUT AS file
tabChr = CHR(9)
doubleQuoteChr = CHR(34)
PRINT #file, ("[")
FOR r = 1 TO (numRows - 1):
PRINT #file, (tabChr + "{")
FOR c = 0 TO (numCols - 1):
_key = propertyArray(c)
keyStr = doubleQuoteChr + _key + doubleQuoteChr
'Don't add quotes if value is a number.'
_val = cells(r)(c)
valStr = _val
IF (NOT IsNumeric(_val)) THEN
valStr = doubleQuoteChr + _val + doubleQuoteChr
ENDIF
line = tabChr + tabChr + keyStr + ": " + valStr
IF (c < numCols - 1) THEN
line = line + ","
ENDIF
PRINT #file, (line)
NEXT c
endLine = tabChr + "}"
IF (r < numRows - 1) THEN
endLine = endLine + ","
ENDIF
PRINT #file, (endLine)
NEXT r
PRINT #file, ("]")
CLOSE #file
END SUB
'--------------------------------------'
FUNCTION GetDirectory() AS STRING
fileName = ThisComponent.getUrl()
fileNameSegments = Split(fileName, "/")
numFileNameSegments = UBound(fileNameSegments) + 1
dirName = ""
FOR i = 0 TO (numFileNameSegments - 2)
dirName = dirName + fileNameSegments(i) + "/"
NEXT i
GetDirectory = dirName
END FUNCTION
@ceruleancerise
Copy link
Copy Markdown
Author

basic sucks

@aschaap
Copy link
Copy Markdown

aschaap commented Jul 27, 2024

For those in a hurry: remove any leading empty rows (or columns) to make this work, and the exported file will be named after the sheet (e.g., Sheet1.json).

basic sucks

Thank you for your sacrifice!

@neobits
Copy link
Copy Markdown

neobits commented May 30, 2025

This is GREAT! Thanks for sharing ๐Ÿ™‡

@Randall-Lasini
Copy link
Copy Markdown

Thank you.
This worked great. I was considering getting YLC utils just for the JSON export, but this worked so much better.

Keep the great work.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment