100% Local · Free · No Sign-up

Convert ODS (LibreOffice Calc) to Markdown Tables

SheetJS unzips your OpenDocument .ods file in the browser, parses content.xml, expands repeated row/column runs, and writes each Calc sheet as a GFM pipe table. No LibreOffice install, no headless soffice step, no upload.
Drop your ODS file here to convert to MarkdownDrag & drop files here, or click anywhere to browse · .ods

Processing happens 100% in your browser — nothing is uploaded.

Merged cells and flat ODF

A merged range (table:number-columns-spanned) cannot be represented in GFM: the value stays in the first cell and the covered cells come through empty. Uncompressed flat ODF files (.fods) and password-protected spreadsheets are not accepted — re-save as a normal .ods in Calc first.
100% Local Processing — Your files never leave your device

How to convert ODS to Markdown

  1. Drop: drag your .ods file onto the dropzone, or click to browse.
  2. Process: SheetJS unzips the archive and converts every sheet locally, deriving column alignment and escaping pipes.
  3. Copy: copy the GFM tables or download the result as a .md file.

Why Convert ODS to Markdown with MD Convert?

  • Reads the OASIS OpenDocument XML directly

    ODS is a ZIP archive whose payload is content.xml, with typed cells (office:value-type of float, date, currency, percentage) and repeat attributes that collapse runs of identical cells. Those repeats are expanded, so the grid you see in Calc is the grid you get in Markdown.

  • Formatted values with correct alignment

    Cells are exported as their displayed text, so dates stay dates and percentages keep their sign rather than arriving as raw fractions. Columns whose body cells are all numeric get `---:` and right-align; text and date columns stay left-aligned.

  • No office suite required

    The usual route is installing LibreOffice and running soffice --convert-to csv, then converting the CSV. This reads the .ods itself in JavaScript — one step, no 400 MB dependency, and it works on a machine you do not administer.

  • 100% local — nothing is uploaded

    The file is read through the File API and parsed in a Web Worker inside your tab, then discarded when you close the page. Budgets, payroll extracts and unpublished datasets stay on your device.

ODS to Markdown: Before and After

The sheet name becomes an H2, the first row becomes the header, and the currency column is right-aligned because every value in it is numeric. No LibreOffice process is involved at any point.

Input · xml
<!-- content.xml (excerpt from Sheet "Budget") -->
<table:table table:name="Budget">
  <table:table-row>
    <table:table-cell office:value-type="string">
      <text:p>Item</text:p></table:table-cell>
    <table:table-cell office:value-type="string">
      <text:p>Cost</text:p></table:table-cell>
  </table:table-row>
  <table:table-row>
    <table:table-cell office:value-type="string">
      <text:p>Hosting</text:p></table:table-cell>
    <table:table-cell office:value-type="currency"
      office:value="1250.5"><text:p>1,250.50</text:p></table:table-cell>
  </table:table-row>
</table:table>
Output · Markdown
## Budget

| Item | Cost |
| --- | ---: |
| Hosting | 1,250.50 |

Understanding the ODS Format: OASIS OpenDocument v1.3 / ISO/IEC 26300

Format
OpenDocument Spreadsheet (ODS)
Media type
application/vnd.oasis.opendocument.spreadsheet
Parser used
SheetJS (xlsx)

Technical Specifications & Calc Table Extraction Rules

  • Direct OpenDocument XML Parsing: Parses content.xml directly; expands table:number-columns-repeated attributes so Calc table layouts match the generated Markdown grid without column shifting.
  • Formatted Values & Data Types: Exports displayed cell text (currency, percentage signs, ISO dates) rather than raw fractions or 1900-epoch date serial numbers.
  • Automatic Column Alignment: Scans table columns to assign ---: right-alignment to numeric, financial, and percentage data while keeping text and dates left-aligned.
  • Merged Ranges & Multi-Sheet Workbooks: GFM tables do not support colspan/rowspan; merged ranges retain values in the top-left cell. Multi-sheet ODS files emit sequential H2 sections for each sheet.
  • Formula Values & Unsupported Formats: Exports cached formula results (open and re-save in Calc if created by headless writers). Flat ODF (.fods) and password-protected files must be converted/unlocked in Calc first.

Developer Alternative: Headless LibreOffice & Python (odfpy) Extraction

For automated pipelines or headless servers, the same Calc tables can be extracted without a browser — useful for scheduled jobs and Linux/FOSS workflows.

Bash (LibreOffice CLI)
# Headless LibreOffice CLI export to CSV, then pipe to Markdown
soffice --headless --convert-to csv input.ods
Python (Pandas + odfpy)
# Programmatic ODS to Markdown conversion using Pandas + odfpy
# requires: pip install pandas odfpy tabulate
import pandas as pd

# Reads Calc sheet using the OpenDocument engine and outputs GFM table
df = pd.read_excel("spreadsheet.ods", engine="odf")
markdown_table = df.to_markdown(index=False)
print(markdown_table)

How You Can Verify the Privacy Claim

Browser-only

Zero server upload

Conversion runs inside your browser tab. Open DevTools, switch to the Network panel, and convert a file: for every format except URL to Markdown you will see no request carrying your document — because there is no endpoint to send it to.

Web Worker

Off the main thread

Heavy parsing is dispatched to a Web Worker, so a 500-page PDF or a large spreadsheet never freezes the interface. Everything is plain JavaScript — no native plugin, no WebAssembly toolchain, nothing to install.

No account

Nothing to sign up for

No login, no quota, no paywall, and no tracking tied to your files. Analytics are cookieless and aggregate only. Read the privacy policy for the full data-flow breakdown, including the one proxied exception.

The parsers doing the work

No proprietary black box: each format is handled by a widely audited open-source library, running client-side at the version pinned in our lockfile.

ODS to Markdown — FAQ

Are ODS formulas exported as values or expressions?

As values. OpenDocument stores both the formula and its last calculated result, and the cached result is what lands in the table. There is no calculation engine in the browser, so a file written by a script without cached results shows those cells blank and raises a warning with the count — opening and re-saving it in LibreOffice Calc fixes that.

Does it support multi-sheet ODS files?

Yes. Every table in the document is converted in order, each as an H2 heading carrying the sheet name followed by its own GFM table, and a warning reports how many sheets were found. You get the whole document as one Markdown file and delete the sections you do not need.

How are dates and encodings handled?

Cells are exported as the text Calc displays, so a date typed as 2026-08-31 exports as 2026-08-31 rather than as an epoch-relative serial number, and percentages keep their percent sign instead of arriving as 0.125. The file is UTF-8 XML inside the ZIP container and the output is UTF-8 Markdown, so accented, CJK and emoji content passes through unchanged.

What happens if a cell contains a pipe character?

It is escaped as \| so the row cannot break. An unescaped pipe inside a GFM cell ends that cell early and shifts every following column, which is the classic way a converted table ends up misaligned. Newlines inside a cell are collapsed to spaces, since GFM tables cannot contain a line break within a cell.

In-Depth ODS Guides