Excel 跑到當機?2026 中小企業數位轉型:從試算表思維到 WordPress 關聯式資料庫的技術遷移實戰
☰ 目錄 table-of-contents.md
打開公司共用資料夾裡那份 2026_客戶名單_最終版_真的最後一版_v3.xlsx,泡杯咖啡回來它還在轉圈圈——很多中小企業的「資料庫」,其實就是這樣一份隨時可能當機的 50MB 試算表。Excel 是好工具,但它從來就不是設計來給多人並發編輯、做關聯查詢用的。這篇要聊的,是怎麼把試算表思維升級成 WordPress 關聯式資料庫,走完數位轉型最關鍵的第一步。
即使到了 2026 年,AI Agent 已經能幫我們寫 Code、Cursor 已經成為標配,但我發現台灣還是有大量的傳統中小企業(SME)深陷在「Excel 地獄」中。老闆習慣看格子,業務習慣傳 LINE 檔案,結果就是資料打架、版本混亂,更別提什麼數據分析或 AI 預測了。
今天這篇技術文,我們不談空泛的數位轉型口號,我們要從工程師的角度切入,談談如何將雜亂無章的 Excel 試算表思維,遷移到 WordPress 的關聯式資料庫(Relational Database)架構中,並附上實際的程式碼範例。這一把,我們要把公司的「技術債」連本帶利清乾淨。
為什麼 Excel 是 2026 年企業成長的最大絆腳石?
Excel 很棒,它是世界上最強大的計算機,但它不是資料庫。在 2026 年的今天,依賴 Excel 作為核心業務系統(ERP/CRM)會面臨幾個毀滅性的技術問題:
- 缺乏單一真值來源 (SSOT): 當檔案被複製成三份,哪一份才是最新的庫存數據?這在分散式系統原理中是絕對的大忌。
- 缺乏資料完整性 (Data Integrity): Excel 儲存格沒有強型別限制,電話欄位被填入「下午三點回電」,這會導致後續 API 串接或 AI 分析直接噴錯。
- 併發寫入衝突 (Concurrency Control): 雖然現在有協作功能,但當多人同時修改同一筆訂單狀態時,資料覆蓋(Lost Update)的風險極高。
- 無法自動化: 你無法輕易地讓 Excel 主動發送 Webhook 給 Line Bot 通知客戶出貨,這在 WordPress 中卻是幾行 Code 就能解決的事。
思維重構:從「扁平化」到「關聯式」
要逃離 Excel 地獄,首先要改變的是資料結構的設計思維。Excel 是二維的、扁平的;而 WordPress 背後的 MySQL/MariaDB 是立體的、關聯的。
正規化 (Normalization):工程師的整理術
假設你的 Excel 訂單表長這樣:
訂單編號 | 客戶姓名 | 客戶電話 | 商品A | 商品A價格 | 商品B | 商品B價格 |總金額
這種設計在資料庫領域稱為「未正規化」。如果客戶改電話,你得搜尋所有訂單逐一修改;如果一筆訂單有 10 個商品,你的欄位就會無限橫向擴張。
在 WordPress 的架構下,我們會將其拆解:
- User (wp_users): 儲存客戶帳號資訊。
- Order (Custom Post Type): 儲存訂單狀態、時間。
- Order Items (Custom Table): 儲存訂單內的商品明細與當下價格。
- Product (WooCommerce/CPT): 儲存商品資訊。
技術實戰:在 WordPress 中建立高效能資料庫結構
很多開發者會濫用 WordPress 的 Post Meta (wp_postmeta),把所有資料都塞進去。這在資料量少時沒問題,但當你有十萬筆訂單明細時,效能會直接崩潰。Eric 建議,針對大量結構化數據,我們應該建立自訂資料表 (Custom Tables)。
1. 建立自訂資料表
我們使用 WordPress 的 dbDelta 函式來建立一個儲存「訂單明細」的獨立資料表。這比用 Meta Query 搜尋快上數百倍。
function roamer_create_order_items_table() {
global $wpdb;
$table_name = $wpdb->prefix . 'roamer_order_items';
$charset_collate = $wpdb->get_charset_collate();
$sql = "CREATE TABLE $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
order_id bigint(20) NOT NULL,
product_sku varchar(55) NOT NULL,
quantity int(5) NOT NULL,
unit_price decimal(10,2) NOT NULL,
created_at datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
PRIMARY KEY (id),
KEY order_id (order_id)
) $charset_collate;";
require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );
}
// 在外掛啟用時執行
register_activation_hook( __FILE__, 'roamer_create_order_items_table' );
2. 資料遷移腳本 (Migration Script)
假設你已經把 Excel 轉存為 CSV,我們需要一個腳本將其讀入並寫入資料庫。這裡要注意資料清洗 (Data Cleaning),如果 CSV 的價格欄位包含 "NT$" 符號,記得要濾掉。
function roamer_import_legacy_data() {
global $wpdb;
$csv_file = '/path/to/your/legacy_data.csv';
if ( !file_exists($csv_file) ) return;
$handle = fopen($csv_file, "r");
// 跳過標題列
fgetcsv($handle);
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
// $data[0] = Order ID, $data[1] = SKU, $data[2] = Qty, ...
// 簡單的資料清洗
$price = preg_replace('/[^0-9.]/', '', $data[4]);
$wpdb->insert(
$wpdb->prefix . 'roamer_order_items',
array(
'order_id' => intval($data[0]),
'product_sku'=> sanitize_text_field($data[1]),
'quantity' => intval($data[3]),
'unit_price' => floatval($price)
),
array( '%d', '%s', '%d', '%f' )
);
}
fclose($handle);
error_log('Excel Migration Completed Successfully.');
}
Eric 的小囉嗦:在跑這段腳本前,拜託一定要先備份資料庫。資料庫操作是不可逆的,不要讓你的週五晚上變成 Debug 之夜。
2026 年的資料架構優勢:AI Ready
為什麼要這麼大費周章?因為只有將資料結構化 (Structured Data) 後,我們才能真正利用 2026 年強大的 AI 工具。
當你的訂單資料在 SQL 資料庫中:
- Text-to-SQL: 你可以讓老闆直接對 Line Bot 問:「上個月賣最好的紅色商品是什麼?」,後端 AI 直接轉譯成 SQL Query 回傳結果。這在 Excel 裡是做不到即時互動的。
- 預測性維護: 透過歷史數據,AI 可以預測下季庫存需求,這需要乾淨的時間序列資料,而不是散落在各個 sheet 裡的破碎數字。
- API 自動化: 透過 REST API,WordPress 可以與 ERP、CRM 或 n8n 無縫串接,實現真正的「無人值守」營運。
結語:痛苦是暫時的,效益是永久的
從 Excel 遷移到 WordPress 資料庫,對中小企業來說無異於換心手術。初期會很痛,員工會抱怨「為什麼不能直接打字就好」,但身為技術決策者,你必須堅持下去。
試算表是個人的工具,資料庫才是企業的資產。在 2026 年,數據資產的顆粒度與可存取性,決定了你公司的競爭力。
準備好拋棄那個 50MB 的 Excel 檔案了嗎?
延伸閱讀
常見問題
為什麼 Excel 不適合當作企業的核心業務系統?
什麼是資料庫的正規化(Normalization)?
WordPress 處理大量結構化資料時,為什麼要用自訂資料表而非 Post Meta?
從 Excel 匯入資料到資料庫時要注意什麼?
資料遷移到資料庫後,還能繼續用 Excel 做報表嗎?
訂閱免費電子報
把 AI 自動化、企業系統設計與 WordPress / Laravel 開發的真實案例和可直接照做的技巧,整理成電子報寄給你。只寄精選內容、不灌垃圾信,一鍵就能退訂。