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
Pocheng Chiu的沙龍
0會員
24內容數
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
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
Thumbnail
全新版本的《三便士歌劇》如何不落入「復刻經典」的巢臼,反而利用華麗的秀場視覺,引導觀眾在晚期資本主義的消費愉悅之中,而能驚覺「批判」本身亦可能被收編——而當絞繩升起,這場關於如何生存的黑色遊戲,又將帶領新時代的我們走向何種後現代的自我解構?
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
Thumbnail
長期以來,西方美學以《維特魯威人》式的幾何比例定義「完美身體」,這種視覺標準無形中成為殖民擴張與種族分類的暴力工具。本文透過分析奈及利亞編舞家庫德斯.奧尼奎庫的舞作《轉轉生》,探討當代非洲舞蹈如何跳脫「標本式」的文化觀看。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
這一集用最新的Vite工具去創建初始檔案。Vite用於創建和構建Web應用程序,具有快速的啟動時間、即時熱更新、小型體積、支持多種框架和可擴展性等優點。
Thumbnail
這一集用最新的Vite工具去創建初始檔案。Vite用於創建和構建Web應用程序,具有快速的啟動時間、即時熱更新、小型體積、支持多種框架和可擴展性等優點。
Thumbnail
接續上一篇 Step2:VC#專案建立 Step3:IIS新建站台 Step4:VC#架設到IIS中
Thumbnail
接續上一篇 Step2:VC#專案建立 Step3:IIS新建站台 Step4:VC#架設到IIS中
Thumbnail
今日無操作, 不知道是系統更新還是怎樣,過去可以複製貼上的功能被修改掉了,需要思考一下如何快速更新文章了。
Thumbnail
今日無操作, 不知道是系統更新還是怎樣,過去可以複製貼上的功能被修改掉了,需要思考一下如何快速更新文章了。
Thumbnail
將圖片添加到PDF文件中可以提升內容質量,使其更具吸引力。無論您是在製作專業文件、報告或演示文稿,插入圖片都是非常重要的。以下是使用各種工具進行操作的方法
Thumbnail
將圖片添加到PDF文件中可以提升內容質量,使其更具吸引力。無論您是在製作專業文件、報告或演示文稿,插入圖片都是非常重要的。以下是使用各種工具進行操作的方法
Thumbnail
成功加入Anytype之後就可以開始探索這一個開源的筆記軟體了^_^ 開始Anytype之前..... 1.刪除所有初始物件 2.思考自己的使用需求 3.不著急學會所有功能
Thumbnail
成功加入Anytype之後就可以開始探索這一個開源的筆記軟體了^_^ 開始Anytype之前..... 1.刪除所有初始物件 2.思考自己的使用需求 3.不著急學會所有功能
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
工具功能 (1) 彈性任意查詢檔案,如對來源目錄設定,檔案修改日期 設定,檔名特定字串或副檔名設定後,自動查出明細,並可展開至各階子目錄處理     (2) 依查詢後結果,可產出 LIST ,提供查詢結果之確認,再依此對檔案作複 (3) 可對檔案作移動,複製至別處,刪除處理,使電腦可騰出硬碟空間
Thumbnail
本法省去開啟EXCEL檔,轉存為CSV檔之手動作業,縮短作業時間,提高工作效率,尤其是對象為複數個檔案場合
Thumbnail
本法省去開啟EXCEL檔,轉存為CSV檔之手動作業,縮短作業時間,提高工作效率,尤其是對象為複數個檔案場合
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
若說易卜生的《玩偶之家》為 19 世紀的女性,開啟了一扇離家的窄門,那麼《海妲.蓋柏樂》展現的便是門後的窒息世界。本篇文章由劇場演員 Amily 執筆,同為熟稔文本的演員,亦是深刻體察制度縫隙的當代女性,此文所看見的不僅僅是崩壞前夕的最後發聲,更是女人被迫置於冷酷的制度之下,步步陷入無以言說的困境。
Thumbnail
Lua 開檔寫檔的運用 io.output()...
Thumbnail
Lua 開檔寫檔的運用 io.output()...
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News