Microsoft の「MarkItDown」で Officeファイルを Markdownファイルに変換【Python】

この記事は、「[Python Advent Calendar 2024](https://qiita.com/advent-calendar/2024/python)」の 15日目の記事です。

## はじめに
この記事を書くきっかけになったのは、はてなブックマークのテクノロジーカテゴリで、以下が出てきていたことです。

●markitdown
 https://github.com/microsoft/markitdown

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/35bf3d2d-3827-8b5f-a682-d26d70c827bd.png)

これは便利そうです。

以前から公開されていたものなのかが気になり Web検索してみたところ、以下の公開されたばかりの記事が出てきました。

●Microsoft、WordやPowerPoint、ExcelなどOfficeファイルをMarkdownファイルに変換できる「MarkItDown」ライブラリを公開。 | AAPL Ch.
 https://applech2.com/archives/20241214-microsoft-markitdown.html

## 情報を見てみる
まだ関連記事も出てなさそうかもしれないと思い、とりあえず試してみて記事も書いてみることにしました。

### 変換用の処理
上で掲載していた公式の GitHub のリポジトリを見ると、以下のサンプルが掲載されていました。

```python
from markitdown import MarkItDown

markitdown = MarkItDown()
result = markitdown.convert("test.xlsx")
print(result.text_content)
```

とりあえず、test.xlsx のところを各種Officeファイルにしてやれば、一通り試せそうです。

また、冒頭に掲載した記事の記載などを見ると、以下のファイルにも対応しているとのことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/644037ff-0a5a-6166-ecdc-9b3c77d4a3e5.png)

この中で、Excel・Word あたりで試してみることにします。

## 実際に試してみる 〜 その1 〜
### サンプルを選定
それでは実際に試してみます。

何かありもののファイルで試そうかと Web検索して、そこで出てきた以下のページの Excelファイルを使ってみることにしました。

●統計等データの提供要請等の受付窓口 ｜厚生労働省
　https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/hokabunya/jyouhouseisaku/toukei-data_madoguchi_00004.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/996097f4-f09a-e89f-d533-4edd9dfe5c70.png)

ファイルを見てみると分量が多く（シートが複数でわりと行数がある感じ）、確認が大変になりそうだったので、部分的に取り出したものを作って試すことにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/c88e7a0a-7337-623a-a884-6102e028c21b.png)

### 処理を試す
#### 仮想環境を準備
[venv](https://docs.python.org/ja/3/library/venv.html) で作った仮想環境で試していきます。

まずは以下で下準備を（※今回のお試しの環境は Mac を使っています）。

```zsh
$ python -m venv myenv
$ source ./myenv/bin/activate
```

仮想環境の中で MarkItDown をインストールします。

```zsh
(myenv) $ pip install markitdown
```

あとはプログラムを書いていきます。

#### 実行するプログラム
そして、プログラムは以下のようにしました。

公式サンプルとは出力の部分を変えていて、結果をファイルに保存するようにしました。

```python
from markitdown import MarkItDown
import os

input_file = "test.xlsx"
markitdown = MarkItDown()
result = markitdown.convert(input_file)

base_name = os.path.splitext(input_file)[0]
text_file = f"{base_name}.txt"
with open(text_file, "w", encoding="utf-8") as f:
    f.write(result.text_content)
```

#### 変換した結果
変換結果は以下のとおりです。

```markdown
## Sheet1
| 統計等データの所在情報一覧（①基幹統計、一般統計） | Unnamed: 1 | Unnamed: 2 | Unnamed: 3 | Unnamed: 4 | Unnamed: 5 | Unnamed: 6 | Unnamed: 7 | Unnamed: 8 | Unnamed: 9 | Unnamed: 10 | Unnamed: 11 | Unnamed: 12 | Unnamed: 13 | Unnamed: 14 | Unnamed: 15 | Unnamed: 16 | Unnamed: 17 | Unnamed: 18 | 令和６年９月１日現在 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 所管府省庁 | 部局名\n（課室名まで記載願います） | 統計データ名 | NaN | NaN | NaN | 行政保有データの棚卸し（統計関連） | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 備考 |
| NaN | NaN | NaN | 統計種類 | 更新周期 | 更新月 | 統計データのオープンデータへの対応状況 | 公開の場合 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 公開（OD化未対応）及び非公開の場合 | NaN |
| NaN | NaN | NaN | NaN | NaN | NaN | NaN | サイト公開状況 | NaN | NaN | NaN | 公開ファイル形式\n（代表的なもの３つを選択） | NaN | NaN | インターネットで公開していない統計データの有無 | インターネットで公開していない統計データが有る場合の理由\n(複数回答可） | NaN | NaN | ＯＤ化未対応及び\n非公開の理由 | NaN |
| NaN | NaN | NaN | NaN | NaN | NaN | NaN | 各府省庁の個別サイトでの公開状況\n（e-Statや政府カタログサイトを除く）\n | 掲載ＵＲＬ\n（各府省庁の個別サイトのみで掲載している場合に限る） | e-Statでの公開状況 | 政府カタログサイトでの公開状況 | NaN | NaN | NaN | NaN | ①過去のデータを電子化されていない状態で保管しているため、インターネットで公開していない統計データがある | ②集計結果が膨大であるため、インターネットでは主要な統計表のみ公開している | ③その他 | NaN | NaN |
| 厚生労働省 | 政策統括官付参事官付審査解析室 | 産業連関構造調査（医療業・社会福祉事業等投入調査） | 一般統計 | ５年 | NaN | 1　公開（ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 1 EXCEL | NaN | NaN | 2　無 | NaN | NaN | NaN | NaN | NaN |
| 厚生労働省 | 政策統括官付参事官付人口動態・保健社会統計室 | 人口動態調査 | 基幹統計 | 月、年 | 月：毎月　年：９月 | 2 公開（一部ＯＤとして公開） | 1　有 | NaN | 1　有 | 1　有 | 1 EXCEL | 2 CSV | 6 非構造化PDF | 1　有 | 1　有 | 2　無 | 2　無 | 3 その他 | 古い統計表についてOD化していないものがあるため、一部OD化未対応となっている |
| 厚生労働省 | 政策統括官付参事官付人口動態・保健社会統計室 | 生命表 | 基幹統計 | 年、５年 | 年：７月、５年：不定期 | 2 公開（一部ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 2 CSV | 1 EXCEL | 6 非構造化PDF | 2　無 | NaN | NaN | NaN | 3 その他 | 古い統計表についてOD化していないものがあるため、一部OD化未対応となっている |
| 厚生労働省 | 政策統括官付参事官付保健統計室 | 医療施設調査 | 基幹統計 | 月、３年 | 毎月、不定期 | 2 公開（一部ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 7 構造化PDF | 2 CSV | 1 EXCEL | 1　有 | 1　有 | 2　無 | 2　無 | 3 その他 | NaN |
| 厚生労働省 | 政策統括官付参事官付保健統計室 | 患者調査 | 基幹統計 | ３年 | 不定期 | 2 公開（一部ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 7 構造化PDF | 2 CSV | 1 EXCEL | 1　有 | 1　有 | 2　無 | 2　無 | 3 その他 | NaN |
| 厚生労働省 | 政策統括官付参事官付保健統計室 | 病院報告 | 一般統計 | 月、年 | 毎月、不定期 | 2 公開（一部ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 7 構造化PDF | 2 CSV | 1 EXCEL | 1　有 | 1　有 | 2　無 | 2　無 | 3 その他 | NaN |
| 厚生労働省 | 政策統括官付参事官付保健統計室 | 受療行動調査 | 一般統計 | ３年 | 不定期 | 1　公開（ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 7 構造化PDF | 2 CSV | 1 EXCEL | 2　無 | NaN | NaN | NaN | NaN | NaN |
| 厚生労働省 | 政策統括官付参事官付行政報告統計室 | 地域保健・健康増進事業報告 | 一般統計 | 年 | ３月 | 1　公開（ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 2 CSV | 1 EXCEL | 7 構造化PDF | 2　無 | NaN | NaN | NaN | NaN | NaN |
| 厚生労働省 | 政策統括官付参事官付行政報告統計室 | 衛生行政報告例 | 一般統計 | 年、２年 | 年：10月\n２年：７月 | 2 公開（一部ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 2 CSV | 1 EXCEL | 7 構造化PDF | 1　有 | 1　有 | 2　無 | 2　無 | 3 その他 | 古い統計表についてOD化していないものがあるため、一部OD化未対応となっている |
```

#### Qiita上で表示させてみる
「## Sheet1」という行より下を貼り付けてみます。

今回の例だとセル結合の部分の見た目上の変換が厳しかった感じはありますが、結合されたセルを個々に分かれたセルと見なして、一定のルールで取り出せているように見えます。

全体的にざっと見た感じでは、情報の取り出しで大きな問題はなさそうに見えます。

| 統計等データの所在情報一覧（①基幹統計、一般統計） | Unnamed: 1 | Unnamed: 2 | Unnamed: 3 | Unnamed: 4 | Unnamed: 5 | Unnamed: 6 | Unnamed: 7 | Unnamed: 8 | Unnamed: 9 | Unnamed: 10 | Unnamed: 11 | Unnamed: 12 | Unnamed: 13 | Unnamed: 14 | Unnamed: 15 | Unnamed: 16 | Unnamed: 17 | Unnamed: 18 | 令和６年９月１日現在 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 所管府省庁 | 部局名\n（課室名まで記載願います） | 統計データ名 | NaN | NaN | NaN | 行政保有データの棚卸し（統計関連） | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 備考 |
| NaN | NaN | NaN | 統計種類 | 更新周期 | 更新月 | 統計データのオープンデータへの対応状況 | 公開の場合 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 公開（OD化未対応）及び非公開の場合 | NaN |
| NaN | NaN | NaN | NaN | NaN | NaN | NaN | サイト公開状況 | NaN | NaN | NaN | 公開ファイル形式\n（代表的なもの３つを選択） | NaN | NaN | インターネットで公開していない統計データの有無 | インターネットで公開していない統計データが有る場合の理由\n(複数回答可） | NaN | NaN | ＯＤ化未対応及び\n非公開の理由 | NaN |
| NaN | NaN | NaN | NaN | NaN | NaN | NaN | 各府省庁の個別サイトでの公開状況\n（e-Statや政府カタログサイトを除く）\n | 掲載ＵＲＬ\n（各府省庁の個別サイトのみで掲載している場合に限る） | e-Statでの公開状況 | 政府カタログサイトでの公開状況 | NaN | NaN | NaN | NaN | ①過去のデータを電子化されていない状態で保管しているため、インターネットで公開していない統計データがある | ②集計結果が膨大であるため、インターネットでは主要な統計表のみ公開している | ③その他 | NaN | NaN |
| 厚生労働省 | 政策統括官付参事官付審査解析室 | 産業連関構造調査（医療業・社会福祉事業等投入調査） | 一般統計 | ５年 | NaN | 1　公開（ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 1 EXCEL | NaN | NaN | 2　無 | NaN | NaN | NaN | NaN | NaN |
| 厚生労働省 | 政策統括官付参事官付人口動態・保健社会統計室 | 人口動態調査 | 基幹統計 | 月、年 | 月：毎月　年：９月 | 2 公開（一部ＯＤとして公開） | 1　有 | NaN | 1　有 | 1　有 | 1 EXCEL | 2 CSV | 6 非構造化PDF | 1　有 | 1　有 | 2　無 | 2　無 | 3 その他 | 古い統計表についてOD化していないものがあるため、一部OD化未対応となっている |
| 厚生労働省 | 政策統括官付参事官付人口動態・保健社会統計室 | 生命表 | 基幹統計 | 年、５年 | 年：７月、５年：不定期 | 2 公開（一部ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 2 CSV | 1 EXCEL | 6 非構造化PDF | 2　無 | NaN | NaN | NaN | 3 その他 | 古い統計表についてOD化していないものがあるため、一部OD化未対応となっている |
| 厚生労働省 | 政策統括官付参事官付保健統計室 | 医療施設調査 | 基幹統計 | 月、３年 | 毎月、不定期 | 2 公開（一部ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 7 構造化PDF | 2 CSV | 1 EXCEL | 1　有 | 1　有 | 2　無 | 2　無 | 3 その他 | NaN |
| 厚生労働省 | 政策統括官付参事官付保健統計室 | 患者調査 | 基幹統計 | ３年 | 不定期 | 2 公開（一部ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 7 構造化PDF | 2 CSV | 1 EXCEL | 1　有 | 1　有 | 2　無 | 2　無 | 3 その他 | NaN |
| 厚生労働省 | 政策統括官付参事官付保健統計室 | 病院報告 | 一般統計 | 月、年 | 毎月、不定期 | 2 公開（一部ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 7 構造化PDF | 2 CSV | 1 EXCEL | 1　有 | 1　有 | 2　無 | 2　無 | 3 その他 | NaN |
| 厚生労働省 | 政策統括官付参事官付保健統計室 | 受療行動調査 | 一般統計 | ３年 | 不定期 | 1　公開（ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 7 構造化PDF | 2 CSV | 1 EXCEL | 2　無 | NaN | NaN | NaN | NaN | NaN |
| 厚生労働省 | 政策統括官付参事官付行政報告統計室 | 地域保健・健康増進事業報告 | 一般統計 | 年 | ３月 | 1　公開（ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 2 CSV | 1 EXCEL | 7 構造化PDF | 2　無 | NaN | NaN | NaN | NaN | NaN |
| 厚生労働省 | 政策統括官付参事官付行政報告統計室 | 衛生行政報告例 | 一般統計 | 年、２年 | 年：10月\n２年：７月 | 2 公開（一部ＯＤとして公開） | 1　有 | NaN | 1　有 | 2　無 | 2 CSV | 1 EXCEL | 7 構造化PDF | 1　有 | 1　有 | 2　無 | 2　無 | 3 その他 | 古い統計表についてOD化していないものがあるため、一部OD化未対応となっている |

プログラムで処理することを想定した場合、もう少し変換ルールを理解したいところで、そのため別パターンを試してみたいところです。

## 実際に試してみる 〜 その2 〜
### サンプルを選定
今度は Word のファイルで試してみます。

以下にあるファイルの、最初の2ページ分くらいを取り出して試してみました。

●オープンデータ基本指針 | オープンデータ基本指針(DOCX形式) | e-Govデータポータル
　https://data.e-gov.go.jp/data/dataset/digi_20220315_0063/resource/a5e653be-f516-4f1a-856d-8858ccd97a06

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/20334f76-0285-2401-bf1b-6f69344c8a0c.png)

取り出したものは、以下のとおりです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/eab64255-b40e-cc2c-6ad8-e104b2ccf04f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/dfd444d8-16c5-9538-54e1-eb13c99f8c21.png)

#### 実行するプログラム
プログラムは、先ほどと同じようにしました。
先ほどとの差分は、入力ファイルのファイル名を変えたくらいです。

#### 変換した結果
変換結果は以下のとおりです。

```markdown
オープンデータ基本指針

平成29年５月30日

高度情報通信ネットワーク社会推進戦略本部・

官民データ活用推進戦略会議決定

令和元年６月７日改正

令和３年６月15日改正

我が国においては、平成23年３月11日の東日本大震災以降、政府、地方公共団体や事業者等が保有するデータの公開・活用に対する意識が高まった。[[1]](#footnote-2)

政府においては、公共データは国民共有の財産であるとの認識を示した「電子行政オープンデータ戦略」（平成24年７月４日 高度情報通信ネットワーク社会推進戦略本部決定）等に基づき、オープンデータの取組を推進してきた。

「新たなオープンデータの展開に向けて」（平成27年６月30日 高度情報通信ネットワーク社会推進戦略本部決定）及び「オープンデータ2.0」（平成28年５月20日 高度情報通信ネットワーク社会推進戦略本部決定）では、データの公開を中心とした取組から、データの活用を前提とした「課題解決型のオープンデータの推進」に発想を転換するという方向が示された。

平成28年12月14日に公布・施行された「官民データ活用推進基本法」（以下「官民データ法」と言う。）は、官民データ活用の推進により国民が安全で安心して暮らせる社会及び快適な生活環境の実現に寄与することを目的としており、国、地方公共団体、事業者が保有する官民データの容易な利用等について規定されている。

本文書は、これまでの取組を踏まえ、オープンデータ・バイ・デザイン[[2]](#footnote-3)の考えに基づき、今後、国、地方公共団体、事業者が公共データの公開及び活用に取り組む上での基本指針をまとめたものである。

１．オープンデータの意義

公共データの二次利用可能な形での公開とその活用を促進する意義・目的は、次のとおりである。

（１）国民参加・官民協働の推進を通じた諸課題の解決、経済活性化

広範な主体による公共データの活用が進展することで、創意工夫を活かした多様なサービスの迅速かつ効率的な提供、官民の協働による公共サービスの提供や改善が実現し、ニーズや価値観の多様化、技術革新等の環境変化への適切な対応とともに、厳しい財政状況、急速な少子高齢化の進展等の我が国が直面する諸課題の解決に貢献することができる。

また、ベンチャー企業等による多様な新サービスやビジネスの創出、企業活動の効率化等が促され、我が国全体の経済活性化にもつながる。

（２）行政の高度化・効率化

国や地方公共団体においてデータ活用により得られた情報を根拠として政策や施策の企画及び立案が行われることで（ＥＢＰＭ：Evidence Based Policy Making）、効果的かつ効率的な行政の推進につながる。

（３）透明性・信頼の向上

政策立案等に用いられた公共データが公開されることで、国民は政策等に関して十分な分析、判断を行うことが可能になり、行政の透明性、行政に対する国民の信頼が高まる。

２．オープンデータの定義

国、地方公共団体及び事業者が保有する官民データのうち、国民誰もがインターネット等を通じて容易に利用（加工、編集、再配布等）できるよう、次のいずれの項目にも該当する形で公開されたデータをオープンデータと定義する。[[3]](#footnote-4)

1. 営利目的、非営利目的を問わず二次利用可能なルールが適用されたもの
2. 機械判読[[4]](#footnote-5)に適したもの
3. 無償[[5]](#footnote-6)で利用できるもの

1. 震災関連情報の提供に関し、情報の加工が容易なファイル形式による情報提供について協力依頼が行われたほか、事業者が保有する道路の通行情報などが公開・活用された。 [↑](#footnote-ref-2)
2. 公共データについて、オープンデータを前提として情報システムや業務プロセス全体の企画、整備及び運用を行うことである。 [↑](#footnote-ref-3)
3. 但し、セキュリティの理由により、利用者に対し、事前登録を求めたり、データへのアクセス方法に制限を設けたりといった措置が講じられることがあり得る。 [↑](#footnote-ref-4)
4. 「機械判読」とは、コンピュータプログラムが自動的にデータを加工、編集等できることを指す。 [↑](#footnote-ref-5)
5. オープンデータとは言えないものの、データ提供システムの維持管理に要するコストを限定された利用者からの料金徴収でまかなうケースもある。 [↑](#footnote-ref-6)
```

ざっくり見ると、フットノートの部分もフォローしつつ、中身が取り出せているようです。テキストの位置・インデントなどの情報を除きつつ、テキストを取り出せている感じがあります。

こちらも、もう少し他事例でも試したいところです。

## おわりに
ひとまず Web検索で出てきたデータを入力に用いて、Microsoft の「MarkItDown」を使った変換を試しました。

比較用には入力データの選択があまり良くなかった感じもあるので、今回よりもう少しシンプルなものを複数パターン用意して試すというようなこともできればと思います。

## その他
冒頭に掲載した記事のにも書かれていましたが、どうやら以下のポストに書かれた URL のサイトで変換処理を手軽に試せるようです。

https://x.com/mattppal/status/1867703377888784880

●msftmd - Microsoft MarkItDown Converter
 https://msftmd.replit.app/