Inhalt

Markdown-Tabellen aus Obsidian in Excel konvertieren - mit Beautiful Soup

Inhalt

Es gibt verschiedene Möglichkeiten, einen Baum zu fällen. Man kann sich an ihm abarbeiten und irgendwann ist er gefällt, oder man nimmt sich Zeit zum Schärfen der Axt und fällt den Baum mit wenigen Schlägen.

In meinem aktuellen Auftrag muss ich aufwendige Excel-Tabellen mit Text füllen und abstimmen. Das ist fehleranfällig und meine Freigabepartner*innen finden es eigentlich auch unübersichtlich. Deshalb bereite ich alles in Obsidian vor und benutze das Excel-to-Markdown-Plugin sowie das Advanced-Table-Plugin, um die Arbeit einfacher zu gestalten.

Heute stellte sich die Frage, wie ich die Markdown-Tabelle zurück in Excel bekomme. Mit Hilfe meines virtuellen Praktikanten, ChatGPT, habe ich ein Python-Skript entwickelt, das Markdown-Dokumente in einem festgelegten Ordner automatisch in Excel-Dateien umwandelt und dabei die Zeilenformatierung beibehält. Dadurch kann ich meine Texte in Markdown schreiben und nach der Übersetzung einfacher bearbeiten. Ich hoffe, dass sich der Aufwand lohnt.

Der Workflow sieht dann so aus:

="/images/excel-obsidian.png" style="max-width:100%;height:auto;" srcset="/images/excel-obsidian.png, /images/excel-obsidian.png 1.5x, /images/excel-obsidian.png 2x" sizes="auto" alt="/images/excel-obsidian.png">

Damit ich es nicht vergesse (und vielleicht hilft es ja jemanden da draußen im Netz), hier ist das python script. Ich musste viele Iterationen laufen lassen, bis es klappte. Letztlich wird „Beautiful Soup“ dafür eingesetzt.

import os

import pandas as pd

import numpy as np

import openpyxl

from bs4 import BeautifulSoup

def markdown_to_excel_with_linebreaks(md_filepath, excel_filepath):

# Ein DataFrame aus der Markdown-Datei erstellen

df = pd.read_csv(md_filepath, sep='|', quotechar='"', encoding='utf-8', skipinitialspace=True)

# Nur die Spalte mit den Textdaten behalten

df = df.iloc[:,1:2]

# Die <br> und <div> Tags in Zeilenumbrüche umwandeln und <div><br></div> in einen Zeilenumbruch umwandeln

df = df.applymap(lambda x: BeautifulSoup(x.replace('<div><br></div>', '\n'), 'lxml').get_text(separator="\n") if pd.notnull(x) else np.nan)

# DataFrame in Excel speichern

with pd.ExcelWriter(excel_filepath, engine='openpyxl', mode='w') as writer:

df.to_excel(writer, index=False, header=False)

# Textumbruch für jede Zelle setzen

wb = openpyxl.load_workbook(excel_filepath)

ws = wb.active

for row in ws.iter_rows():

for cell in row:

cell.alignment = openpyxl.styles.Alignment(wrap_text=True)

wb.save(excel_filepath)

def process_directory(directory):

for filename in os.listdir(directory):

if filename.endswith('.md'):

md_filepath = os.path.join(directory, filename)

excel_filepath = os.path.join(directory, filename.replace('.md', '.xlsx'))

markdown_to_excel_with_linebreaks(md_filepath, excel_filepath)

print(f"Converting {md_filepath} to {excel_filepath}...")

process_directory('/Users/macbookpro/md_xls')

Damit das läuft, musst noch ein paar Sachen installieren

pip install pandas

pip install openpyxl

pip install beautifulsoup4`

Das Script heißt bei mir md_xls.py und es lebt im User/macbookpro-Verzeichnis. Für die zu konvertierenden md-Dateien habe in ein Verzeichnis auf dieser Ebene (md_xls) eingerichtet. Da schiebe ich die markdown-Dateien rein. Dann starte ich den Befehl:

python3 md_xls.py

Das Script schaut nun im Verzeichnis md_xls nach Markdown-Dateien und konvertiert sie um in XLS. Fertig.

Das war jetzt eine recht spezielle Lösung, aber vielleicht hilft es dir ja.