需求:Word 文檔格式「1. 題目 答案xx 2. 題目 答案xx...」導入數據庫,字段為「題目」「答案」。Word 結構非結構化,直接解析極其痛苦。本文推薦「Word → Excel → 數據庫」工程化路徑,並提供 C# 直接解析代碼參考。
| 方案 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 人工複製到 Excel → 導入 | 零代碼、可視化校驗、靈活調整 | 數據量大時效率低 | 一次性、百條以內、非技術人員操作 |
| Word AnotherSaveAs → Excel → 導入 | Word 內置另存為 .xlsx,保留表格結構 | 需 Word 安裝、格式可能亂 | Word 本身是表格結構 |
| C# NPOI/OpenXML 解析 Word → 寫入 DB | 全自動、可集成系統、支援複雜邏輯 | 開發成本高、需處理邊界情況 | 定期導入、結構固定、數據量大 |
| Python python-docx + pandas → to_sql | 代碼簡潔、生態豐富 | 需 Python 環境 | 數據分析師/後端腳本 |
.xlsx(或複製粘貼到 Excel)。LOAD DATA INFILE / INSERT。
using NPOI.XWPF.UserModel;
using System.Data.SqlClient;
public void ImportWordToDb(string wordPath, string connStr) {
using (var fs = new FileStream(wordPath, FileMode.Open))
using (var doc = new XWPFDocument(fs))
using (var conn = new SqlConnection(connStr)) {
conn.Open();
var cmd = new SqlCommand("INSERT INTO Questions(Title, Answer) VALUES(@t, @a)", conn);
var pTitle = cmd.Parameters.Add("@t", SqlDbType.NVarChar, 500);
var pAnswer = cmd.Parameters.Add("@a", SqlDbType.NVarChar, 500);
foreach (var para in doc.Paragraphs) {
string text = para.Text.Trim();
if (string.IsNullOrEmpty(text)) continue;
// 簡單解析:假設格式 "1. 題目內容 答案: xxx"
var match = Regex.Match(text, @"^\d+\.\s*(.+?)\s+答案[::]\s*(.+)$");
if (match.Success) {
pTitle.Value = match.Groups[1].Value;
pAnswer.Value = match.Groups[2].Value;
cmd.ExecuteNonQuery();
}
}
}
}
XWPFDocument 只能處理主流程段落/表格。NumberingDefinitions 極其複雜。「除非是長期自動化項目,否則『Word → Excel → DB』是性價比最高、坑最少的路徑。Excel 是人類最友好的結構化數據中介格式。」