← Back to all guides

ODS to Markdown takes three steps: drop the .ods file into a converter that runs in your browser, let it turn each sheet into a pipe table, then copy the output or download the .md file. Nothing to install, nothing uploaded.

If you've ever copied a range out of LibreOffice Calc and pasted it into a plain-text editor, you know what comes next. Tabs where columns should be. Numbers that drift out of line. A table you can't edit without redoing the spacing by hand.

Markdown tables fix that. They're plain text, they diff cleanly in Git, and they render properly in Obsidian. This guide covers two ways to convert a sheet, what the output looks like, and how to get the result into a vault and tagged.

Diagram illustrating the conversion workflow from an ODS spreadsheet into a clean Markdown table for an Obsidian vault

Quick check: .ods is the spreadsheet format from LibreOffice and OpenOffice Calc. Text documents from Writer use .odt, which is a different job. This guide is about spreadsheets.

Method 1: Convert ODS to Markdown in Your Browser

This is the fastest route, and the one to use if you just have a file and want a table.

The dedicated ODS to Markdown converter reads the .ods file directly and writes GitHub-style pipe tables. There's no office suite to install and no Python environment to set up. It's a browser-based Markdown converter, and that's the whole tool.

Here's the workflow:

  1. Drop the file. Drag your .ods onto the page, or click to browse.
  2. Let it convert. Every sheet is converted in order. Each sheet name becomes an H2 heading, the first row becomes the header row, and columns where every value is numeric are right-aligned.
  3. Copy or download. Copy the tables straight from the page, or save the result as a .md file.

A note on the word "drop." Nothing is uploaded. The file is read in your browser and parsed in a background thread, and it disappears when you close the tab. You can check this yourself: open your browser's developer tools, switch to the Network panel, and convert a file. No request carries your document.

That matters if the sheet holds a budget, a payroll export or unpublished data. Many online converters send your file to a server, keep it for a while, and cap the file size. Here there's no server copy to worry about.

The converter also exports the text Calc displays. A date shows as a date, and a percentage keeps its percent sign. That sounds obvious until you meet a tool that doesn't do it. More on that in a moment.

Method 2: Script It with Python or the Command Line

Sometimes a browser tab isn't the right tool. You have forty spreadsheets, or a folder that refills every week, and you want a command you can run again.

Python with pandas

This works well for batches. pandas reads ODS through the odfpy package, and tabulate handles the Markdown output.

bash

pip install pandas odfpy tabulate

python

import pandas as pd

sheets = pd.read_excel("budget.ods", engine="odf", sheet_name=None)

with open("budget.md", "w", encoding="utf-8") as out:
    for name, df in sheets.items():
        out.write(f"## {name}\n\n{df.to_markdown(index=False)}\n\n")

Setting sheet_name=None reads every sheet, so you get one section per sheet, just like the browser tool.

There's one trade-off. pandas reads the underlying value of each cell, not the formatted text. A cell that Calc shows as 1,250.50 comes out as 1250.5, and a cell showing 12.00 comes out as 12. A browser converter that exports the displayed text keeps 1,250.50 and 12.00 as you see them. If your sheet is full of currency and percentages, check the output before you trust it.

Pandoc, with one catch

Pandoc is the usual answer for document conversion, so people reach for it here. But Pandoc has no .ods reader. It reads .odt text documents, which is why the search results for this topic get muddled.

Since version 3.8.3, Pandoc can read .xlsx spreadsheets. So the workable route is to let LibreOffice convert the file first, then hand it to Pandoc:

bash

for f in *.ods; do
  soffice --headless --convert-to xlsx "$f"
  pandoc -f xlsx -t gfm "${f%.ods}.xlsx" -o "${f%.ods}.md"
done

You'll need LibreOffice installed for the soffice step, and Pandoc 3.8.3 or newer. Small scripts such as ods2md also exist, but they ignore number formats, so currency and percentages arrive as plain numbers.

Which one should you pick? Use the browser tool for a single file, especially a private one. Use a script when the job repeats and you need it scheduled.

What the Output Looks Like: Markdown Table Syntax

Here's what a small sheet named "Budget" turns into:

markdown

## Budget

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

The sheet name is the heading. The first row is the header. The colon on the right of ---: right-aligns the numeric Cost column.

You can control alignment with colons in the delimiter row:

markdown

| Left | Centered | Right |
| :--- | :---: | ---: |
| text | text | 1,250.50 |

The converter writes --- for text columns and ---: for all-numeric columns. Centered columns (:---:) are a manual edit after conversion.

Why bother with plain text? A .ods file is a zipped bundle of XML that needs a spreadsheet program to open. A Markdown table opens in any editor, survives a change of software, and shows exactly what changed when you compare two versions. Your notes outlast the tool that made them.

How to Import a Markdown File into Obsidian

Once you have the .md file, the Obsidian side is short.

Drop the file into your vault

To import Markdown into Obsidian, save or drag the .md file into your vault folder. It appears in the file explorer straight away, ready to open. Obsidian's Importer plugin covers app exports and formats like CSV and HTML, but it has no ODS importer. Converting first is the way in.

How to use Markdown tables in Obsidian

Open the note in Live Preview and the table renders as a real table. You can click into a cell and edit it in place. Switch to source mode if you want to see the raw pipes. If a column looks cramped, widen it by adjusting the text in the source view. It's still just text.

How to add tags in Obsidian Markdown

Tags are what make a converted table findable later. You have two options.

Frontmatter (the tags property). Put the tags at the top of the note as a list:

yaml

---
tags:
  - budget
  - spreadsheet-import
source: budget-2026.ods
converted: 2026-09-24
---

Obsidian's help pages say tags in YAML should always be a list. The source and converted lines aren't tags. They're extra properties, and they let you trace any table in your vault back to the original file.

Inline tags. Type #budget anywhere in the note body. It's quicker for a one-off, but frontmatter keeps all your metadata in one place.

For structure, use nested tags with a slash, such as #finance/budget. Searching for tag:finance then matches the whole branch. Keep tags free of spaces; use a hyphen instead.

How to open a vault of Markdown files in Obsidian

If you've converted a whole folder of sheets, you don't need to move anything. Open the vault switcher at the bottom left of Obsidian, choose Open folder as vault, and select the folder. Obsidian adds a hidden .obsidian folder for its settings and leaves your notes as plain .md files.

Bringing in other file types

If your spreadsheets aren't the only legacy files, the same approach works elsewhere. The suite of 16 free markdown converters covers DOCX, PDF, CSV and more, all running in the browser. For example, there's a PDF to Markdown guide if your archive includes scanned reports.

Troubleshooting Common Edge Cases

A few things trip people up. Most come from limits in Markdown itself, not from the converter.

Symptom Why it happens What to do
Multi-line text in a cell is flattened Pipe tables can't hold a line break inside a cell Add <br> by hand where you need a break
A cell contains `A B` Pipes are escaped so they don't split the row
Formula cells show numbers, not formulas Formulas export as their last calculated value Keep the original .ods if you need the logic
A formula cell is blank, with a warning The file was written by a script and has no cached result Open and re-save it in Calc, then convert again
Merged cells look wrong Markdown tables have no colspan, so the value stays in the first cell Unmerge before converting, or fix by hand
A title banner ends up as the header The first row of every sheet is treated as the header Delete the banner rows first
The file is refused .fods files and password-protected files aren't accepted Re-save as a normal .ods with no password

Also expect these to disappear: cell colors, charts, images, pivot ranges and conditional formatting. Markdown has no way to represent them. If you're converting an .xlsx instead, the Excel to Markdown converter uses the same engine, so the tables come out the same way.

Working from a CSV export instead? The CSV to Markdown converter handles that. But saving as CSV throws away sheet names and number formatting, so converting the .ods directly keeps more.

Frequently Asked Questions

Can Obsidian open .ods files directly?

Not as a note you can read or edit. Obsidian is built around Markdown files, so a spreadsheet needs converting first. Turn the sheet into a Markdown table, save the .md in your vault, and you can edit it in Live Preview like any other note.

How do I open a vault of Markdown files in Obsidian?

Open the vault switcher at the bottom left and choose Open folder as vault. Select the folder that holds your .md files. Obsidian creates a .obsidian settings folder inside it and shows every note in the file explorer. Your files stay plain Markdown.

Does converting ODS to Markdown keep cell colors and formatting?

No. Cell colors, charts, images, pivot ranges, and conditional formatting are dropped because Markdown can't represent them. What does carry over is the displayed text, such as dates and percentages, plus right-alignment for numeric columns and the sheet names as headings.

Why do dates turn into numbers when I convert a spreadsheet?

Some tools read the raw stored value instead of the text Calc displays. A date then appears as a serial number like46265, and a percentage as 0.125. A converter that exports the formatted text keeps 2026-08-31 and 12.5% as you see them.

Pick the Route That Fits the Job

For one file, or anything private, md-convert's ODS to Markdown tool is the quickest path from Calc to a vault note. For a folder that keeps refilling, script it. Either way, add the tags and the source line, and the table is easy to find a year from now.

Data & Tables