20251222 npoi動態匯出excel標題

更新 發佈閱讀 9 分鐘

既然是用 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 判斷,讓你一次到位。


留言
avatar-img
留言分享你的想法!
avatar-img
Pocheng Chiu的沙龍
0會員
23內容數
Pocheng Chiu的沙龍的其他內容
2025/11/21
沒問題,**「逐行驗證(Row-by-Row)」**是處理資料上傳最靈活的策略。 這種做法的好處是:解耦。 驗證邏輯只專注於「這一行對不對」,而不用管整張表怎麼跑。這讓你可以在迴圈中隨時決定要「蒐集所有錯誤」還是「遇到錯誤立刻停止」。 以下是調整後的架構,專注於單行處理: 1. 定義單行驗證結果 (
2025/11/21
沒問題,**「逐行驗證(Row-by-Row)」**是處理資料上傳最靈活的策略。 這種做法的好處是:解耦。 驗證邏輯只專注於「這一行對不對」,而不用管整張表怎麼跑。這讓你可以在迴圈中隨時決定要「蒐集所有錯誤」還是「遇到錯誤立刻停止」。 以下是調整後的架構,專注於單行處理: 1. 定義單行驗證結果 (
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。 我
看更多
你可能也想看
Thumbnail
不是每個人都適合自己操盤,懂得利用「專業」,才是績效拉開差距的開始
Thumbnail
不是每個人都適合自己操盤,懂得利用「專業」,才是績效拉開差距的開始
Thumbnail
勇鷹高教機問題繼續卡關,對照漢翔目前的處境,其實相當尷尬 「機瘟」若持續卡彈,漢翔就得繼續承擔中科院的罰款壓力;若是順利交機,接下來的營收缺口要靠什麼來填補? 1.台海情勢日益嚴峻,戰機維修與後勤支援需求提高 2.國防預算大幅成長,相關專案持續釋出 3.無人機的加強投入 4.微型電網的正式營運
Thumbnail
勇鷹高教機問題繼續卡關,對照漢翔目前的處境,其實相當尷尬 「機瘟」若持續卡彈,漢翔就得繼續承擔中科院的罰款壓力;若是順利交機,接下來的營收缺口要靠什麼來填補? 1.台海情勢日益嚴峻,戰機維修與後勤支援需求提高 2.國防預算大幅成長,相關專案持續釋出 3.無人機的加強投入 4.微型電網的正式營運
Thumbnail
台經院預測 2025 年台灣 GDP 成長率為 3.15%,依賴科技出口與消費同步成長。 瑞銀分析台灣在 AI 技術與先進半導體製造的優勢,能減少川普貿易戰的影響,但巨大貿易順差仍是美國政策的目標。
Thumbnail
台經院預測 2025 年台灣 GDP 成長率為 3.15%,依賴科技出口與消費同步成長。 瑞銀分析台灣在 AI 技術與先進半導體製造的優勢,能減少川普貿易戰的影響,但巨大貿易順差仍是美國政策的目標。
Thumbnail
  本自動化交易紀錄,主要為自行開發的台指期當沖策略,採用XQ全球贏家進行自動化交易買賣,主要商品為台指期,定期紀錄交易績效,透過嚴謹的執行策略是交易的重點,定期的檢視交易績效並分享上來給大家一起檢視就是要持續並有紀律的執行。
Thumbnail
  本自動化交易紀錄,主要為自行開發的台指期當沖策略,採用XQ全球贏家進行自動化交易買賣,主要商品為台指期,定期紀錄交易績效,透過嚴謹的執行策略是交易的重點,定期的檢視交易績效並分享上來給大家一起檢視就是要持續並有紀律的執行。
Thumbnail
策略一: 長期斜率 (2) 4945        陞達科技–X 8097        常珵–X,同短期 策略二: 短期斜率 (2) 3529        力旺–X 8097        常珵–X
Thumbnail
策略一: 長期斜率 (2) 4945        陞達科技–X 8097        常珵–X,同短期 策略二: 短期斜率 (2) 3529        力旺–X 8097        常珵–X
Thumbnail
這裡有三道設計過的考題,如果你認真閱讀完本文,你應該知道歌手、詞曲作家、唱片公司、策展公司,誰能分享利益,呃,如果你是圈內人,更知道誰能分多少? 呃,好吧,給諸位一點暗示,產業供應鏈在下方…… 資深蛙友應該知道為什麼咱這麼熟悉影視產業,提示:跟選秀節目有關,知道答案的只能在回應中偷偷跟版友說。
Thumbnail
這裡有三道設計過的考題,如果你認真閱讀完本文,你應該知道歌手、詞曲作家、唱片公司、策展公司,誰能分享利益,呃,如果你是圈內人,更知道誰能分多少? 呃,好吧,給諸位一點暗示,產業供應鏈在下方…… 資深蛙友應該知道為什麼咱這麼熟悉影視產業,提示:跟選秀節目有關,知道答案的只能在回應中偷偷跟版友說。
Thumbnail
策略一: 長期斜率 (3) 3324 雙鴻–X在蛻變線下時間沒有一年 3483 力致–X沒有蛻變 2492 華新科–X在蛻變線下時間沒有一年 策略二: 短期斜率 (1) 3306 鼎天–X沒有蛻變
Thumbnail
策略一: 長期斜率 (3) 3324 雙鴻–X在蛻變線下時間沒有一年 3483 力致–X沒有蛻變 2492 華新科–X在蛻變線下時間沒有一年 策略二: 短期斜率 (1) 3306 鼎天–X沒有蛻變
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News