20250916 Npoi

更新 發佈閱讀 8 分鐘

好的,了解了。這個情境非常清晰:「建立」與「讀取」是兩個獨立的步驟。 你既然已經成功建立了檔案,現在要讀取它,那麼 FileMode.Open 就是完全正確的選擇。如果在 File.Open 這一步就拋出 InvalidOperationException,問題點幾乎可以鎖定在資源未被釋放。 核心問題:檔案被前一個「建立」程序鎖定 當你用 NPOI 的 workbook.Write(stream) 寫入檔案後,如果那個檔案流 (FileStream) 沒有被明確地關閉 (.Close()) 或釋放 (.Dispose()),作業系統會認為這個檔案還在使用中,並將其鎖定。 當你立刻又嘗試用 File.Open 去讀取同一個檔案時,作業系統會拒絕這個請求,因為檔案正被你自己鎖著。這個底層的 I/O 拒絕,在上層的 .NET 程式碼中,根據上下文,就可能被包裝成 IOException 或更不直觀的 InvalidOperationException。 精準解決方案:使用 Using 陳述式徹底分離操作 Using 陳述式是 VB.NET 中處理 I/O、資料庫連線等資源的最佳實踐。它能保證不論 Try 區塊內的程式碼是成功執行完畢還是中途發生錯誤,Using 所管理的物件 (如此處的 FileStream) 都會被自動、即時地釋放。 將你的「建立」與「讀取」程式碼徹底分開,並各自用 Using 包起來。 步驟 1:確保你的「建立」程式碼是這樣寫的 ' --- 建立檔案的程序 --- Dim createFilePath As String = "C:\temp\MyNewExcelFile.xlsx" Dim workbook As New XSSFWorkbook() ' ... (此處是你用 NPOI 填入資料的程式碼) workbook.CreateSheet("Data").CreateRow(0).CreateCell(0).SetCellValue("Test Value 123") Try ' 使用 Using 來保證 FileStream 會被自動關閉,解除檔案鎖定 Using fs As New FileStream(createFilePath, FileMode.Create, FileAccess.Write) workbook.Write(fs) End Using ' << 當程式執行到這裡,fs 就被關閉了,檔案鎖定被解除 Console.WriteLine("檔案建立並已成功釋放。") Catch ex As Exception ' 處理建立過程可能發生的錯誤 Console.WriteLine($"建立檔案時發生錯誤: {ex.Message}") End Try 步驟 2:現在,你可以安全地「讀取」它 ' --- 讀取檔案的程序 --- Dim readFilePath As String = "C:\temp\MyNewExcelFile.xlsx" If Not File.Exists(readFilePath) Then Console.WriteLine("錯誤:找不到要讀取的檔案。") Return ' 或 Exit Sub End If Try Dim cellValue As String = "" ' 同樣使用 Using 來管理讀取的 FileStream Using fs As New FileStream(readFilePath, FileMode.Open, FileAccess.Read) ' 從檔案流建立 workbook 物件 Dim readWorkbook As New XSSFWorkbook(fs) ' 獲取第一個工作表 Dim sheet = readWorkbook.GetSheetAt(0) ' 或者用 GetSheet("SheetName") If sheet IsNot Nothing Then ' 獲取第一行 Dim row = sheet.GetRow(0) If row IsNot Nothing Then ' 獲取第一個儲存格 Dim cell = row.GetCell(0) If cell IsNot Nothing Then ' 讀取儲存格的值 (最安全的方式是先判斷型別) Select Case cell.CellType Case NPOI.SS.UserModel.CellType.String cellValue = cell.StringCellValue Case NPOI.SS.UserModel.CellType.Numeric cellValue = cell.NumericCellValue.ToString() ' ... 可以加入更多型別判斷 Case Else cellValue = cell.ToString() ' 通用方法 End Select End If End If End If End Using ' << 讀取完畢,檔案流在此被自動關閉 Console.WriteLine($"成功讀取到的值為:'{cellValue}'") Catch ex As Exception ' 處理讀取過程可能發生的錯誤,例如檔案毀損 Console.WriteLine($"讀取檔案時發生錯誤: {ex.Message}") End Try 總結與啟發 * 分離關注點:建立就是建立,讀取就是讀取。將它們視為兩個完全獨立的交易。 * Using 是你的朋友:對於任何實現了 IDisposable 介面的物件 (如 FileStream, MemoryStream, SqlConnection),永遠優先使用 Using 陳述式。它可以根除 99% 的資源洩漏與鎖定問題。 * 防禦性程式設計:在讀取時,總是先用 File.Exists 檢查檔案是否存在,並在存取 sheet, row, cell 之前,都先判斷它們是否為 Nothing,這能避免大量的 NullReferenceException。


留言
avatar-img
留言分享你的想法!
avatar-img
Pocheng Chiu的沙龍
0會員
4內容數
Pocheng Chiu的沙龍的其他內容
2025/09/09
好的,這是一個非常常見且重要的優化場景。一個清晰、整齊的 Modal 介面能大大提升使用者體驗。 讓我為你提供一個結構清晰、易於理解且美觀的解決方案。我們將運用 Bootstrap 的網格系統 (Grid System) 和表單元件 (Form Controls) 來達成這個目標。 優化核心思路
2025/09/09
好的,這是一個非常常見且重要的優化場景。一個清晰、整齊的 Modal 介面能大大提升使用者體驗。 讓我為你提供一個結構清晰、易於理解且美觀的解決方案。我們將運用 Bootstrap 的網格系統 (Grid System) 和表單元件 (Form Controls) 來達成這個目標。 優化核心思路
2025/09/05
了解 🙌 你希望 預設用 SetCellValue(Double) 寫入數字,但又要能處理「可能為空白」的情況。 重點在於:空白不要強制變成 0(否則格式會顯示成 -),而是真的留空。 --- ✅ 寫法範例 Public Sub SetNumberCell(cell As ICell, s
2025/09/05
了解 🙌 你希望 預設用 SetCellValue(Double) 寫入數字,但又要能處理「可能為空白」的情況。 重點在於:空白不要強制變成 0(否則格式會顯示成 -),而是真的留空。 --- ✅ 寫法範例 Public Sub SetNumberCell(cell As ICell, s
2025/09/04
太好了,下面把「標題置中、文字靠左、數字靠右且四捨五入為整數、0/空白顯示“-”、字體 11、欄寬自動」全部統整成可重用的 VB.NET + NPOI 範本。你只要複製貼上即可。 1) 共用樣式工廠 Imports NPOI.SS.UserModel Imports NPOI.XSSF.Use
2025/09/04
太好了,下面把「標題置中、文字靠左、數字靠右且四捨五入為整數、0/空白顯示“-”、字體 11、欄寬自動」全部統整成可重用的 VB.NET + NPOI 範本。你只要複製貼上即可。 1) 共用樣式工廠 Imports NPOI.SS.UserModel Imports NPOI.XSSF.Use
看更多
你可能也想看
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
本法省去開啟EXCEL檔,轉存為CSV檔之手動作業,縮短作業時間,提高工作效率,尤其是對象為複數個檔案場合
Thumbnail
本法省去開啟EXCEL檔,轉存為CSV檔之手動作業,縮短作業時間,提高工作效率,尤其是對象為複數個檔案場合
Thumbnail
將圖片添加到PDF文件中可以提升內容質量,使其更具吸引力。無論您是在製作專業文件、報告或演示文稿,插入圖片都是非常重要的。以下是使用各種工具進行操作的方法
Thumbnail
將圖片添加到PDF文件中可以提升內容質量,使其更具吸引力。無論您是在製作專業文件、報告或演示文稿,插入圖片都是非常重要的。以下是使用各種工具進行操作的方法
Thumbnail
今日無操作, 不知道是系統更新還是怎樣,過去可以複製貼上的功能被修改掉了,需要思考一下如何快速更新文章了。
Thumbnail
今日無操作, 不知道是系統更新還是怎樣,過去可以複製貼上的功能被修改掉了,需要思考一下如何快速更新文章了。
Thumbnail
接續上一篇 Step2:VC#專案建立 Step3:IIS新建站台 Step4:VC#架設到IIS中
Thumbnail
接續上一篇 Step2:VC#專案建立 Step3:IIS新建站台 Step4:VC#架設到IIS中
Thumbnail
Lua 開檔寫檔的運用 io.output()...
Thumbnail
Lua 開檔寫檔的運用 io.output()...
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
成功加入Anytype之後就可以開始探索這一個開源的筆記軟體了^_^ 開始Anytype之前..... 1.刪除所有初始物件 2.思考自己的使用需求 3.不著急學會所有功能
Thumbnail
成功加入Anytype之後就可以開始探索這一個開源的筆記軟體了^_^ 開始Anytype之前..... 1.刪除所有初始物件 2.思考自己的使用需求 3.不著急學會所有功能
Thumbnail
這一集用最新的Vite工具去創建初始檔案。Vite用於創建和構建Web應用程序,具有快速的啟動時間、即時熱更新、小型體積、支持多種框架和可擴展性等優點。
Thumbnail
這一集用最新的Vite工具去創建初始檔案。Vite用於創建和構建Web應用程序,具有快速的啟動時間、即時熱更新、小型體積、支持多種框架和可擴展性等優點。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News