既然是用 VB (.NET),這件事可以處理得更漂亮。
這裡有兩條路:一條是寫死 (Hardcode) 的快速生成法(如果你只是要一次性產出程式碼);另一條是動態 (Reflection) 的永續解法(這才符合工程師「用系統賺錢」的思維)。
1. 系統化解法:使用 Reflection (反射)
狠 (Incisive) 建議: 不要把屬性名稱和 index 寫死。如果未來屬性增減或順序改變,寫死的方法維護成本太高。
直接用 VB 迴圈動態讀取屬性名稱:
' 引入 System.Reflection
Dim props As PropertyInfo() = GetType(你的類別名稱).GetProperties()
For i As Integer = 0 To props.Length - 1
' i 就是自動遞增的 index
' props(i).Name 就是 "Item_No" 那些名稱
newcell(i, style:=HeaderStyle).SetCellValue(props(i).Name)
Next
這樣無論你有 10 個還是 100 個屬性,這段程式碼永遠不用改。
2. 快速生成法:Excel 公式生成
如果你因某些原因(如效能極致要求或舊系統限制)必須把程式碼展開寫死,用 Excel 公式生成最準確。
假設你的 Public Property Item_No As String 在 A 欄。
請在 B 欄 貼上此公式並下拉:
="newcell("&ROW(A1)-1&", style:=HeaderStyle).SetCellValue("""&TRIM(MID(A1, FIND("Property",A1)+9, FIND(" As",A1) - FIND("Property",A1)-9))&""")"
公式邏輯解析:
* ROW(A1)-1:解決了你「數字要根據 row 遞增」的需求(從 0 開始:0, 1, 2...)。
* MID & FIND:鎖定 Property 和 As 中間的字串,自動抓出變數名。
下一步
如果是要寫入 Excel 報表,且這些屬性有特定的中文抬頭(例如 Item_No 對應「料號」),需要我提供「利用 Attribute (特性) 將中文名稱綁定在屬性上」的 VB 範例嗎?這樣連欄位名稱都能全自動化。
這是一個典型的「重複性勞動」陷阱。面對 68 個欄位且邏輯複雜(區分文字、整數、小數),絕對不要手寫或用 Excel 拉 68 行程式碼。那樣維護起來(例如第 30 個欄位改型別)會非常痛苦。 快、狠、準的解法是:讓程式自己判斷型別,自己決定樣式。 這是最適合軟體工程師的 Reflection (反射) + Select Case 方案,程式碼乾淨、邏輯集中,以後就算加到 100 個欄位也不用改 code。 核心方案:動態判斷型別 (VB.NET) 你只需要寫一次邏輯,就能處理所有欄位: ' 假設 item 是你當前要寫入的那筆資料物件 ' styleText: 文字靠左樣式 ' styleInt: 整數樣式 (無小數點) ' styleDec: 小數樣式 (兩位小數) Dim props As System.Reflection.PropertyInfo() = GetType(你的類別名稱).GetProperties() For i As Integer = 0 To props.Length - 1 Dim p As System.Reflection.PropertyInfo = props(i) Dim val = p.GetValue(item) ' 取得該欄位的值 Dim useStyle As ICellStyle ' 假設是用 NPOI,請依實際套件調整型別 ' 狠:直接問該屬性的「本質」是什麼型別,自動分配樣式 ' 處理 Nullable 型別 (如 Integer?) 需先取得 UnderlyingType Dim realType As Type = Nullable.GetUnderlyingType(p.PropertyType) If realType Is Nothing Then realType = p.PropertyType Select Case Type.GetTypeCode(realType) Case TypeCode.String useStyle = styleText Case TypeCode.Int32, TypeCode.Int64, TypeCode.Int16 useStyle = styleInt Case TypeCode.Decimal, TypeCode.Double, TypeCode.Single useStyle = styleDec Case TypeCode.DateTime ' 如果有日期也能在這裡擴充 useStyle = styleText Case Else useStyle = styleText End Select ' 準:寫入儲存格 ' 注意:如果是數值,建議轉成 Double 寫入,Excel 才能運算 If IsNumeric(val) AndAlso val IsNot Nothing Then newcell(i, style:=useStyle).SetCellValue(Convert.ToDouble(val)) Else newcell(i, style:=useStyle).SetCellValue(If(val Is Nothing, "", val.ToString())) End If Next 為什麼這樣做比較好? * 容錯率高:如果你的 Property 從 Integer 改成 Decimal,這段程式碼會自動適應,不用手動去改第 N 行的樣式。 * 可讀性強:邏輯集中在 Select Case,一眼就能看出你的排版規則。 * 擴充性:如果要加第 4 種樣式(例如日期),只要加一個 Case 就好。 備用方案:Excel 公式生成(若你堅持要產生 68 行寫死的 Code) 如果你必須要把程式碼展開(例如為了除錯或特殊需求),可以用這個 Excel 公式判斷關鍵字(String, Integer, Decimal)。 假設 A 欄是 Public Property Item_No As String: 在 B 欄使用此公式(請依實際情況微調): ="newcell("&ROW(A1)-1&", style:=" & IF(ISNUMBER(SEARCH("String", A1)), "StyleText", IF(OR(ISNUMBER(SEARCH("Integer", A1)), ISNUMBER(SEARCH("Long", A1))), "StyleInt", "StyleDec")) & ").SetCellValue(item." & TRIM(MID(A1, FIND("Property",A1)+9, FIND(" As",A1)-FIND("Property",A1)-9)) & ")" 公式邏輯: * 樣式判斷: * 偵測到 "String" -> StyleText * 偵測到 "Integer" 或 "Long" -> StyleInt * 其他(預設為小數) -> StyleDec * 產出代碼:產出類似 newcell(0, style:=StyleText).SetCellValue(item.Item_No)。 下一步: 你的這 68 個欄位中,是否包含需要特殊處理的「日期格式」(如 yyyy/MM/dd)?如果有,我幫你補上日期的 Case 判斷,讓你一次到位。













