DEV Community

Cover image for ExcelMerger-文創小農獨立手做 app 幫你合併 Excel 檔
Leon
Leon

Posted on • Originally published at editor.leonh.space

2

ExcelMerger-文創小農獨立手做 app 幫你合併 Excel 檔

ExcelMerger

ExcelMerger 是個簡單到不行的 app-它幫我們合併 Excel 檔,可以是合併一個檔案內的多個工作表,也可以是合併多個檔案。

ExcelMerger

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

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

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

至於為什麼要特地寫一支傻瓜 app 幫我們做 CTRL-CCTRL-V,因為這樣的重複性動作對人類來說太慢也太乏味,又可能貼錯,這種機械性的重複作業正是程式最適合發揮的地方,另一個原因是我們家洪媽媽剛好有這樣的需求,幫家人提高工作效率之餘,也把 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 巨集〉。

前端介面

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

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

Keka

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

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

所謂完美境界,並非加無可加,而是減無可減。

Antoine de Saint-Exupéry - Ch III: The Tool, Terre des hommes

之前寫過的〈談產品設計的 80/20 法則〉、〈談 POS 設計背後的原則〉也都有一貫的核心思想-盡可能地去除軟體中多餘的部分,減少選擇就是提高效率(在商業上也是如此)。

關於在 web 實現拖放介面的部分,可以參考另外一篇〈Web 處理檔案那些事-上傳篇〉。

封裝成桌面程式

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

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

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

結語

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

AWS GenAI LIVE image

How is generative AI increasing efficiency?

Join AWS GenAI LIVE! to find out how gen AI is reshaping productivity, streamlining processes, and driving innovation.

Learn more

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay