20251121 excel validation

更新 發佈閱讀 10 分鐘

沒問題,**「逐行驗證(Row-by-Row)」**是處理資料上傳最靈活的策略。 這種做法的好處是:解耦。 驗證邏輯只專注於「這一行對不對」,而不用管整張表怎麼跑。這讓你可以在迴圈中隨時決定要「蒐集所有錯誤」還是「遇到錯誤立刻停止」。 以下是調整後的架構,專注於單行處理: 1. 定義單行驗證結果 (The Row Result) 我們需要一個輕量的物件,回傳「這一行」到底有沒有問題。 Public Class RowValidationResult Public Property IsValid As Boolean = True Public Property RowIndex As Integer Public Property Errors As New List(Of String)() ' 這一行裡面的具體錯誤訊息 Public Sub New(index As Integer) Me.RowIndex = index End Sub Public Sub AddError(msg As String) Me.IsValid = False Me.Errors.Add(msg) End Sub End Class 2. 核心:單行驗證器 (The Row Validator) 這個 Class 就像一個檢驗員,一次只看一份文件(一行資料)。 Public Class ExcelRowValidator ' 核心方法:只收一個 DataRow 和它的行號 Public Function ValidateRow(row As DataRow, rowIndex As Integer) As RowValidationResult Dim result As New RowValidationResult(rowIndex) ' --- 規則 A: 必填檢查 (例如: 身分證號) --- If IsDBNull(row("ID_Card")) OrElse String.IsNullOrWhiteSpace(row("ID_Card").ToString()) Then result.AddError("【身分證號】不能為空") End If ' --- 規則 B: 格式檢查 (例如: 手機號碼必須是數字且長度正確) --- Dim phone = row("Phone").ToString() If Not String.IsNullOrWhiteSpace(phone) Then If Not IsNumeric(phone) OrElse phone.Length <> 10 Then result.AddError("【手機號碼】格式錯誤,需為10碼數字") End If End If ' --- 規則 C: 業務邏輯 (例如: 到職日不能晚於離職日) --- ' 這裡假設欄位都存在,實務上建議先用 TryParse 轉型 Dim startDateStr = row("StartDate").ToString() Dim endDateStr = row("EndDate").ToString() If IsDate(startDateStr) AndAlso IsDate(endDateStr) Then If CDate(startDateStr) > CDate(endDateStr) Then result.AddError("【日期邏輯】到職日不能晚於離職日") End If End If Return result End Function End Class 3. 在主程式中呼叫 (The Execution Loop) 這裡展現了逐行驗證的威力:你可以完全控制流程。 Public Sub ProcessExcelUpload(dt As DataTable) Dim validator As New ExcelRowValidator() Dim allErrors As New List(Of String)() ' 蒐集所有錯誤報告 Dim validRows As New List(Of DataRow)() ' 蒐集正確的資料準備存檔 ' 逐行掃描 For i As Integer = 0 To dt.Rows.Count - 1 Dim currentRow As DataRow = dt.Rows(i) Dim excelRowIndex As Integer = i + 2 ' Excel顯示的行號 ' 呼叫單行驗證 Dim rowResult As RowValidationResult = validator.ValidateRow(currentRow, excelRowIndex) If rowResult.IsValid Then ' 如果該行正確,加入待處理清單 validRows.Add(currentRow) Else ' 如果該行有錯,格式化錯誤訊息並記錄 Dim errorMsg As String = $"第 {rowResult.RowIndex} 列錯誤: {String.Join(", ", rowResult.Errors)}" allErrors.Add(errorMsg) ' 選項:如果你想要「遇到錯誤就立刻中止」,這裡可以直接 Return 或 Exit For ' Return End If Next ' --- 處理結果 --- If allErrors.Count > 0 Then ' 有錯誤:回傳給前端顯示,不進行存檔 Console.WriteLine("上傳失敗,請修正以下問題:") For Each err In allErrors Console.WriteLine(err) Next Else ' 全數通過:執行資料庫寫入 SaveDataToDB(validRows) Console.WriteLine("成功!共匯入 " & validRows.Count & " 筆資料。") End If End Sub 狠準洞察 (Critical Insights) * 錯誤訊息的「聚合」技巧: 在 RowValidationResult 裡,我用了 List(Of String) 而不是單一字串。為什麼?因為同一行資料可能同時犯了兩個錯(例如:身分證空的 + 手機格式錯)。一次告訴使用者該行所有問題,比讓他上傳兩次才發現還有錯,體驗好太多了。 * 擴充性 (Scalability): 這種寫法未來非常好維護。如果有新的驗證規則(例如新增「檢查 Email」),你只需要去 ExcelRowValidator 裡面加一段 If 判斷即可,完全不會影響到外面的迴圈結構。 * 資料淨化: 在 ValidateRow 裡面,除了驗證,其實也是做「資料清洗」的好時機。例如把全形數字轉半形、去除前後空白(Trim),確保進入 validRows 的資料都是乾淨的。 接下來你可以讓我做的是: 需要我幫你寫一段 Code,專門用來處理 ValidateRow 裡面的「安全轉型」嗎?(例如:不管Excel格子裡是文字還是數字,都能安全轉成 Integer 或 Date 而不報錯)。


留言
avatar-img
留言分享你的想法!
avatar-img
Pocheng Chiu的沙龍
0會員
23內容數
Pocheng Chiu的沙龍的其他內容
2025/11/05
這是一個很棒的個人化功能。要實現「根據工號保存設定」,我們需要將架構從「純前端 (JavaScript)」擴展為「前端 + 後端 (資料庫)」。 核心思路是: * 後端 (資料庫): 建立一個資料表,用來儲存 EmployeeID 和他勾選的欄位字串 (例如:"col-pdid,col-weigh
2025/11/05
這是一個很棒的個人化功能。要實現「根據工號保存設定」,我們需要將架構從「純前端 (JavaScript)」擴展為「前端 + 後端 (資料庫)」。 核心思路是: * 後端 (資料庫): 建立一個資料表,用來儲存 EmployeeID 和他勾選的欄位字串 (例如:"col-pdid,col-weigh
2025/11/04
了解。您不希望勾選項全部擠在同一行 (inline),而是希望它們像表格一樣,整齊地排列成網格 (Grid)。 在舊版 Bootstrap (3/4) 中,最好的做法是使用它內建的網格系統 (Grid System) (.row 和 .col-*) 來取代 .checkbox-inline。 我
2025/11/04
了解。您不希望勾選項全部擠在同一行 (inline),而是希望它們像表格一樣,整齊地排列成網格 (Grid)。 在舊版 Bootstrap (3/4) 中,最好的做法是使用它內建的網格系統 (Grid System) (.row 和 .col-*) 來取代 .checkbox-inline。 我
2025/11/04
了解,這是將您提供的 12 個欄位套用到先前 Bootstrap 3/4 範本的 Index.vbhtml 程式碼。 核心的 JavaScript/jQuery 邏輯完全不需要變更,您只需要更新 View 中的 HTML 勾選區和表格欄位。 1. 欄位勾選區 (更新) 請將 Views/Home/I
2025/11/04
了解,這是將您提供的 12 個欄位套用到先前 Bootstrap 3/4 範本的 Index.vbhtml 程式碼。 核心的 JavaScript/jQuery 邏輯完全不需要變更,您只需要更新 View 中的 HTML 勾選區和表格欄位。 1. 欄位勾選區 (更新) 請將 Views/Home/I
看更多
你可能也想看
Thumbnail
不是每個人都適合自己操盤,懂得利用「專業」,才是績效拉開差距的開始
Thumbnail
不是每個人都適合自己操盤,懂得利用「專業」,才是績效拉開差距的開始
Thumbnail
生產力爆發帶來的過剩,會讓過去的「還可以啦」成為最低標準。市場需求對於出類拔萃、獨一無二的需求還是存在,但是對於那些價格高度敏感,或是只需要穩定、便宜、還可以啦的需求端來說,AI 正在迅速取代這部分的供給,中間長尾的服務提供者被 AI 替換。
Thumbnail
生產力爆發帶來的過剩,會讓過去的「還可以啦」成為最低標準。市場需求對於出類拔萃、獨一無二的需求還是存在,但是對於那些價格高度敏感,或是只需要穩定、便宜、還可以啦的需求端來說,AI 正在迅速取代這部分的供給,中間長尾的服務提供者被 AI 替換。
Thumbnail
年末總有一種莫名的魔力,讓人特別容易感到孤單。 聖誕節、跨年、緊接著農曆新年……滑開社群,不是甜蜜放閃,就是一群人早早訂好跨年行程。 明明日子算得上順遂,工作穩定無憂,生活也按部就班地往前走着,可總在萬籟俱寂的夜晚,獨自對着空蕩的房間時,心底會悄悄冒出一個念頭:今年,是不是可以不一樣?不再獨自抵
Thumbnail
年末總有一種莫名的魔力,讓人特別容易感到孤單。 聖誕節、跨年、緊接著農曆新年……滑開社群,不是甜蜜放閃,就是一群人早早訂好跨年行程。 明明日子算得上順遂,工作穩定無憂,生活也按部就班地往前走着,可總在萬籟俱寂的夜晚,獨自對着空蕩的房間時,心底會悄悄冒出一個念頭:今年,是不是可以不一樣?不再獨自抵
Thumbnail
日本大分市火災 燒毀170棟建築 Larry Summers因為Epstein醜聞辭去OpenAI董事 美國不參加南非G20 法官裁定終止華盛頓國民兵部署 法官下令德州公立學校移除「十誡」海報 印尼Semeru火山爆發
Thumbnail
日本大分市火災 燒毀170棟建築 Larry Summers因為Epstein醜聞辭去OpenAI董事 美國不參加南非G20 法官裁定終止華盛頓國民兵部署 法官下令德州公立學校移除「十誡」海報 印尼Semeru火山爆發
Thumbnail
你我皆凡人,生在人世間,道義放兩旁,利字擺中間 一、輝達消息最近如雷貫耳,但是財報好或是不好,要市場投票決定好還是不好 二、鈊象的答案還是一樣:「神仙打架,凡人迴避」,維持壁上觀就好 輝達「循環交易」有其風險,但是最大的風險,應該還是「過度投資」造成的,可能是想贏過對方,也可能是不想輸給對方
Thumbnail
你我皆凡人,生在人世間,道義放兩旁,利字擺中間 一、輝達消息最近如雷貫耳,但是財報好或是不好,要市場投票決定好還是不好 二、鈊象的答案還是一樣:「神仙打架,凡人迴避」,維持壁上觀就好 輝達「循環交易」有其風險,但是最大的風險,應該還是「過度投資」造成的,可能是想贏過對方,也可能是不想輸給對方
Thumbnail
從開盤暴漲直接變成暴跌,這是最最最差走法,Nvidia財報利多出盡確立 不管美股今天收盤怎麼收,今天這走勢絕對不是止跌的走法,我在剛剛已停損出清5口大台多單,並反手做空,明天台股開盤後也會繼續大量出清個股,再繼續加碼台指期空單
Thumbnail
從開盤暴漲直接變成暴跌,這是最最最差走法,Nvidia財報利多出盡確立 不管美股今天收盤怎麼收,今天這走勢絕對不是止跌的走法,我在剛剛已停損出清5口大台多單,並反手做空,明天台股開盤後也會繼續大量出清個股,再繼續加碼台指期空單
Thumbnail
20251121 祂們說要對付你 我住在台北大同區,很長一段時間了。 有一段時間,這附近舉辦連續幾天盛大的宗教活動,我抽出時間,特地到現場去觀看。 有儀隊、有鼓隊、有旗隊、還有諸多陣頭,熱鬧非常。 我從龍邊進去廟裡,依序向壇城主尊、各殿,一一頂禮,然後就離去。 這件事
Thumbnail
20251121 祂們說要對付你 我住在台北大同區,很長一段時間了。 有一段時間,這附近舉辦連續幾天盛大的宗教活動,我抽出時間,特地到現場去觀看。 有儀隊、有鼓隊、有旗隊、還有諸多陣頭,熱鬧非常。 我從龍邊進去廟裡,依序向壇城主尊、各殿,一一頂禮,然後就離去。 這件事
Thumbnail
因為山就在那裡~登山家喬治。馬洛里 「我們往往要走到別無選擇的境地,才肯放棄」~安慰不如果斷行為,因得到安慰的是靈魂,而不是生命本身 「登頂不是互相比試,是每個人和山的對決,但遺言總是屬於山的」~面對自己的「聖母峰」,有人選擇退縮,有人堅持到底,但最終謙遜與智慧才是生存之道 上山、下山、都是愛
Thumbnail
因為山就在那裡~登山家喬治。馬洛里 「我們往往要走到別無選擇的境地,才肯放棄」~安慰不如果斷行為,因得到安慰的是靈魂,而不是生命本身 「登頂不是互相比試,是每個人和山的對決,但遺言總是屬於山的」~面對自己的「聖母峰」,有人選擇退縮,有人堅持到底,但最終謙遜與智慧才是生存之道 上山、下山、都是愛
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News