ExcelMerger－文創小農獨立手做 app 幫你合併 Excel 檔
Tags: excel, tauri, python, svelte
Published: 2021-10-19 04:18:03

![ExcelMerger](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j3x4bzx4iphba9uc4rfm.png)

[ExcelMerger](https://github.com/Leon0824/ExcelMerger) 是個簡單到不行的 app－它幫我們合併 Excel 檔，可以是合併一個檔案內的多個工作表，也可以是合併多個檔案。

![ExcelMerger](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hxwcpgfdnb3y1ypa3out.png)

安裝完，跑起來的畫面只有一個簡單的拖放區，用戶可以把 Excel 檔從檔案總管拖進去，或是點擊拖放區用開檔案的方式把 Excel 檔讀進去，ExcelMerger 會把這些檔案合併到一個新檔案內，並跳出另存新檔的畫面，剩下的步驟就如同一般的 Windows 操作那樣，把合併好的新檔案放在你喜歡的地方。

雖然說這麼簡單，但還是有些事項要提醒的：

- 為了保證格式的正確性，ExcelMerge 背後是呼叫 Excel 來做剪下貼上的工作，而不是用第三方工具，所以電腦內得有裝 Excel，也因此這個小 app 是 Windows 限定的。
- 合併的基礎是每張表都有一致的欄位，這個小 app 並不具備人工智慧判斷欄位的性能，它其實只幫我們做重複性的複製、貼上而已。
- 每張表的第一列通常是標題列，ExcelMerger 只會保留一次標題列，所以不用擔心合併後的檔案會出現重複的標題列，除此之外，它真的只有做複製、貼上，不會動到原始檔案的任何東西。
- 本 app 只有在 Windows 10 / Microsoft 365 Excel、Excel 2019 測過，其他 Windows / Excel 版本能應該也能用，如果有問題請到它的專案頁回報。
- 不含惡意程式，由**文創小農獨立手做，天然、有機、無毒、無殘留**，如果被防毒程式警告應該是誤判，原碼公開在 GitHub，未來若有新版本也都會發布在 [ExcelMerger 的 GitHub 專案頁](https://github.com/Leon0824/ExcelMerger)。

至於為什麼要特地寫一支傻瓜 app 幫我們做 <kbd>CTRL-C</kbd>、<kbd>CTRL-V</kbd>，因為這樣的重複性動作對人類來說太慢也太乏味，又可能貼錯，這種機械性的重複作業正是程式最適合發揮的地方，另一個原因是我們家洪媽媽剛好有這樣的需求，幫家人提高工作效率之餘，也把 app 放出來，希望能援助到其他的地方媽媽。

## 開發筆記

這支看似簡單的 app 背後卻是用相當不對稱的 Rust + Python + JavaScript 三種語言來實現：

- JavaScript 負責處理前端介面，前端框架是 Svelte，但幾乎完全沒用到 Svelte 的特性…。
- Rust 的 Tauri 框架負責把 web 封裝成桌面程式，並且提供存取本機檔案的 API 給 JavaScript。
- Python 負責後端呼叫 Excel 做開檔、合併、存檔的動作。

### Excel 檔案處理

對「讀 Excel 檔案，並且合併」這個核心需求，原本是不考慮 Python 的，但搜尋了幾個 JavaScript 套件，例如 ExcelJS，用的很爽但後來才發現它不支援舊的 xls 檔案…最後試了 SheetJS，但終究因為下面的原因最後還是放棄在 JavaScript 內處理 Excel 檔：

- SheetJS 不支援儲存格樣式，即便 SheetJS Pro 好像有支援。
- 在 JS 處理某些舊的 xls 檔會遇到解碼問題，某些陳年的 Delphi / InterBase 程式輸出的 xls 檔案內的文字是 Big5，但在 JavaScript 被錯誤的以 UTF-8 解成亂碼，於是又要多一層調用 iconv-lite 來轉換。

這些問題當然都是走過路過才會遇過的，最終只好把這部分砍掉重練，改用 Python 直接呼叫 Excel，一勞永逸的解決掉解碼和樣式遺漏問題，但副作用就是從此這個 app 只能在 Windows 下使用了，並且用戶得先裝有 Excel，幸好對我們的目標用戶來說，應該九成九的人都滿足這兩點要求。

關於 Python 呼叫 Excel 的部分，可以參考另外一篇〈[用 Python 寫 Excel 巨集](https://editor.leonh.space/2021/write-excel-macros-with-python/)〉。

### 前端介面

因為原本天真地以為可以用 JavaScript 就能處理好 Excel 檔案合併的工作，因此用 web 做 UI 再封裝成桌面程式便成了自然而然的選擇，即便後來改用 Python 處理 Excel 檔，然而幾經權衡之下，還是決定沿用 web 做 UI 的方案，除了因為 web UI 的頭已經洗一半，不想全部砍掉重練改用 wxPython 之外，受到公司同事的影響，個人也較偏好 web UI 的方案，布局比傳統 GUI 套件更自由，並且 web 的布局邏輯可以通用到瀏覽器端、桌面端和手機端，是一條可以共用的知識鍊，所以最終還是繼續採用以 web 為基礎的介面。

UX 方面，最初就確立了採用盡可能簡單的拖放式介面，這是受到過往使用某些 macOS app 的啟發，例如 Keka：

![Keka](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/srtss1ttd3lyebqnzec8.png)

一直以來我都被這樣的簡潔吸引著，這是近乎完美的簡潔，有人這樣詮釋完美：

<blockquote>

<p>Perfection is achieved not when there is nothing more to add, but when there is nothing left to take away.</p>

<p>所謂完美境界，並非加無可加，而是減無可減。</p>

<p>Antoine de Saint-Exupéry - <span style="font-style: italic;">Ch III: The Tool, <a href="https://zh.wikipedia.org/wiki/%E4%BA%BA%E7%9A%84%E5%A4%A7%E5%9C%B0">Terre des hommes</a></span></p>
</blockquote>

之前寫過的〈[談產品設計的 80/20 法則](https://editor.leonh.space/2020/80-20-rule-for-product-designing/)〉、〈[談 POS 設計背後的原則](https://editor.leonh.space/2020/the-principle-of-designing-pos/)〉也都有一貫的核心思想－盡可能地去除軟體中多餘的部分，減少選擇就是提高效率（在商業上也是如此）。

關於在 web 實現拖放介面的部分，可以參考另外一篇〈[Web 處理檔案那些事－上傳篇](https://editor.leonh.space/2021/handling-files-in-frontend/)〉。

### 封裝成桌面程式

想把 web 封裝成桌面程式，除了 Tauri 外，還有最多人用的 Electron 與 NW.js，最後選擇小眾的 Tauri 的原因是：

- 使用簡單，Tauri 身為一個 2019 年底才問世的小朋友，相較於兩位大哥哥，它具有更簡單快速上手的特性。
- 低耦合，Tauri 不綁定 Chromium，它是調用各 OS 自帶的 WebView 做顯示，因此 Tauri 編譯出來的安裝檔都非常小。
- 還是低耦合，Tauri 底層是 Rust，另外提供一層 JavaScript 的 API 讓程式得以調用本機檔案系統之類的資源，底層的 Rust 也是可抽換的，未來有可能支援 Python / Nim 等其他語言做為底層。
- 潮。

當然，上面我所看重的特性並不適用於全部的場景，在公司內可能更可能採用成熟又有富爸爸支持的 Electron，像 Tauri 這類還在發展中的工具，就留給我們這個富有實驗精神的文創小農獨立手做，天然、有機、無毒、無殘留的小 app 來用即可。

## 結語

希望 ExcelMerger 能幫助到有需要的朋友，喜歡的朋友請我幫按讚、訂閱、開啟小鈴鐺，一鍵三連，感恩。