C#使用EPPlus讀寫Excel

依賴EPPlus

獲取依賴可以閱讀:Nuget For Unity插件介紹_nugetforunity-CSDN博客


可以參閱該篇快速入門:在Unity中使用Epplus寫Excel_unity epplus-CSDN博客


下面是我封裝的幾個方法:


要在合適的時機配置許可證,比如你的工具類的靜態函數.建議使用版本7.7.1

  #region Excel封裝,使用Eppluspublic class ExcelRowData{/// <summary>/// 來自那張表/// </summary>public string BelongSheetName { get; set; }/// <summary>/// 來自哪一行(從2開始,第一行為表頭)/// </summary>public int RowNumber { get; set; }/// <summary>/// key=列名 value=數據/// </summary>public Dictionary<string, string> Data { get; set; }}#region 讀/// <summary>/// 讀取 Excel 文件,返回所有工作表的數據(含行號)/// </summary>public static Dictionary<string, List<ExcelRowData>> ReadExcelAllSheets(string filePath){if (!File.Exists(filePath))throw new FileNotFoundException("Excel 文件不存在", filePath);var result = new Dictionary<string, List<ExcelRowData>>();using (var package = new ExcelPackage(new FileInfo(filePath))){foreach (var worksheet in package.Workbook.Worksheets){var sheetData = ReadWorksheet(worksheet);result[worksheet.Name] = sheetData;}}return result;}/// <summary>/// 讀取指定工作表的數據(含行號)/// </summary>public static List<ExcelRowData> ReadExcelSheet(string filePath, string sheetName){if (!File.Exists(filePath))throw new FileNotFoundException("Excel 文件不存在", filePath);using (var package = new ExcelPackage(new FileInfo(filePath))){var worksheet = package.Workbook.Worksheets[sheetName];if (worksheet == null)throw new ArgumentException($"未找到工作表:{sheetName}");return ReadWorksheet(worksheet);}}/// <summary>/// 讀取單個工作表的數據(第一行為表頭,返回包含行號的結構)/// </summary>private static List<ExcelRowData> ReadWorksheet(ExcelWorksheet worksheet){var result = new List<ExcelRowData>();if (worksheet.Dimension == null)return result;int rowCount = worksheet.Dimension.End.Row;int colCount = worksheet.Dimension.End.Column;var sheetName = worksheet.Name;// 讀取表頭var headers = new List<string>();for (int col = 1; col <= colCount; col++){var header = worksheet.Cells[1, col].Text.Trim();if (string.IsNullOrEmpty(header))throw new Exception($"表頭第 {col} 列為空,請檢查Excel文件格式。");headers.Add(header);}// 讀取數據行for (int row = 2; row <= rowCount; row++){var rowDict = new Dictionary<string, string>();for (int col = 1; col <= colCount; col++){string cellValue = worksheet.Cells[row, col].Text.Trim();if (string.IsNullOrEmpty(cellValue))throw new Exception($"工作表 '{worksheet.Name}' 第 {row} 行,第 {col} 列({headers[col - 1]})單元格為空,請檢查數據完整性。");string header = headers[col - 1];rowDict[header] = cellValue;}result.Add(new ExcelRowData { BelongSheetName = sheetName, RowNumber = row, Data = rowDict });}return result;}#endregion#region 寫/// <summary>/// 將單張表的數據寫入 Excel 文件(如果文件不存在會自動創建)/// </summary>/// <param name="sheetName">工作表名稱,不能為空或空白</param>/// <param name="rows">該表的數據行列表,不能為空且至少包含一行數據</param>/// <param name="filePath">可選,指定輸出文件路徑。如果為 null 或空,則默認保存到桌面“Excel”目錄下,并以當前時間戳+GUID命名文件</param>/// <exception cref="ArgumentException">當 sheetName 為空或 rows 為空時拋出異常</exception>public static void WriteExcelSingleSheet(string sheetName, List<ExcelRowData> rows, string filePath = null){if (string.IsNullOrWhiteSpace(sheetName))throw new ArgumentException("工作表名稱不能為空", nameof(sheetName));if (rows == null || rows.Count == 0)throw new ArgumentException("數據不能為空", nameof(rows));string desktopExcelPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Excel");Directory.CreateDirectory(desktopExcelPath);if (string.IsNullOrWhiteSpace(filePath)){filePath = Path.Combine(desktopExcelPath, $"Excel_{DateTime.Now:yyyyMMdd_HHmmss}_{Guid.NewGuid()}.xlsx");}using (var package = new ExcelPackage(filePath)){var ws = package.Workbook.Worksheets.Add(sheetName);// 寫表頭var headers = rows[0].Data.Keys.ToList();for (int col = 0; col < headers.Count; col++){ws.Cells[1, col + 1].Value = headers[col];}// 寫數據行for (int rowIndex = 0; rowIndex < rows.Count; rowIndex++){var rowData = rows[rowIndex].Data;int excelRow = rowIndex + 2;int colIndex = 1;foreach (var header in headers){rowData.TryGetValue(header, out string cellValue);ws.Cells[excelRow, colIndex].Value = cellValue;colIndex++;}}package.Save();}}/// <summary>/// 將多個表的數據寫入同一個 Excel 文件(如果文件不存在會自動創建)/// </summary>/// <param name="excelData">字典,key 為工作表名稱,value 為對應的該表數據行列表,字典不能為空且至少含有一個表數據</param>/// <param name="filePath">可選,指定輸出文件路徑。如果為 null 或空,則默認保存到桌面“Excel”目錄下,并以當前時間戳+GUID命名文件</param>/// <exception cref="ArgumentNullException">當 excelData 為 null 或為空時拋出異常</exception>public static void WriteExcelAllSheets(Dictionary<string, List<ExcelRowData>> excelData, string filePath = null){if (excelData == null || excelData.Count == 0)throw new ArgumentNullException(nameof(excelData));string desktopExcelPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Excel");Directory.CreateDirectory(desktopExcelPath);if (string.IsNullOrWhiteSpace(filePath)){filePath = Path.Combine(desktopExcelPath, $"Excel_{DateTime.Now:yyyyMMdd_HHmmss}_{Guid.NewGuid()}.xlsx");}using (var package = new ExcelPackage(filePath)){foreach (var sheetData in excelData){WriteSheetToPackage(sheetData.Key, sheetData.Value, package);}package.Save();}}private static void WriteSheetToPackage(string sheetName, List<ExcelRowData> rows, ExcelPackage package){if (string.IsNullOrWhiteSpace(sheetName))throw new ArgumentException("工作表名稱不能為空", nameof(sheetName));if (rows == null || rows.Count == 0)throw new ArgumentException("數據不能為空", nameof(rows));var ws = package.Workbook.Worksheets.Add(sheetName);// 寫表頭var headers = rows[0].Data.Keys.ToList();for (int col = 0; col < headers.Count; col++){ws.Cells[1, col + 1].Value = headers[col];}// 寫數據行for (int rowIndex = 0; rowIndex < rows.Count; rowIndex++){var rowData = rows[rowIndex].Data;int excelRow = rowIndex + 2;int colIndex = 1;foreach (var header in headers){rowData.TryGetValue(header, out string cellValue);ws.Cells[excelRow, colIndex].Value = cellValue;colIndex++;}}}#endregion#endregion

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95205.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95205.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95205.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

高性能Web服務器

一、Web服務基礎介紹 1.1、互聯網發展歷程 1993年3月2日&#xff0c;中國科學院高能物理研究所租用AT&T公司的國際衛星信道建立的接入美國SLAC國家實驗室的64K專線正式開通&#xff0c;成為我國連入Internet的第一根專線。 1995年馬云開始創業并推出了一個web網站中國黃…

《算法導論》第 16 章 - 貪心算法

大家好&#xff01;今天我們來深入探討《算法導論》第 16 章的核心內容 —— 貪心算法。貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優&#xff08;即最有利&#xff09;的選擇&#xff0c;從而希望導致結果是全局最好或最優的算法。它在許多優化問題中都有廣泛應…

Redis面試精講 Day 18:Redis網絡優化與連接管理

【Redis面試精講 Day 18】Redis網絡優化與連接管理 開篇 歡迎來到"Redis面試精講"系列第18天&#xff0c;今天我們將深入探討Redis網絡優化與連接管理技術。在分布式系統中&#xff0c;Redis的網絡性能和連接管理直接影響整個系統的響應速度和穩定性。掌握這些優化…

Centos8系統在安裝Git包時,報錯:“沒有任何匹配: git”

報錯類型&#xff1a; sudo dnf install git Repository AppStream is listed more than once in the configuration Repository BaseOS is listed more than once in the configuration Repository extras is listed more than once in the configuration Repository fasttrac…

glide緩存策略和緩存命中

一 緩存策略 1 Glide 的 diskCacheStrategy() 一共有 5 種枚舉值&#xff08;DiskCacheStrategy&#xff09;&#xff0c;每種的作用和區別如下&#xff1a;1. DiskCacheStrategy.ALL 作用&#xff1a;同時緩存原始圖片&#xff08;原圖數據&#xff09;和經過變換&#xff08;…

如何將PDF文檔進行高效編輯處理!

PDF文件可以在任何設備上以相同的格式查看&#xff0c;無論操作系統或軟件環境如何&#xff0c;可以確保修改后的文檔仍然保持原有的布局和格式。它完全免費&#xff0c;下載后雙擊即可運行&#xff0c;無需安裝&#xff0c;使用非常方便。它具備出色的文本編輯功能&#xff0c…

應用層模擬面試題

模擬面試-C第一題(開發音視頻處理模塊)在開發音視頻處理模塊時&#xff0c;FFmpeg資源&#xff08;AVFrame*&#xff09;需要自動釋放。如何用unique_ptr定制刪除器替代手動av_frame_free()&#xff1f;寫出代碼并解釋RAII優勢。參考答案&#xff1a;auto frame_deleter[](AVFr…

分享一款基于STC8H8K32U-45I-LQFP48單片機的4路數字量輸入輸出模塊

4路數字量輸入輸出模塊產品說明產品特性輸入部分&#xff1a; 4路光耦隔離數字量輸入通道支持NPN和PNP兩種輸入方式&#xff0c;可通過撥碼開關切換輸入電壓范圍&#xff1a;10-30VDC典型應用&#xff1a;可連接按鈕開關、接近開關、光電傳感器等數字信號設備輸出部分&#xff…

redis常見的性能問題

Redis 的性能問題通常源于配置不當、數據結構誤用、資源瓶頸或架構缺陷。以下是 Redis 常見的性能問題及優化方案&#xff0c;結合線上經驗整理&#xff1a;&#x1f9e0; ?一、內存相關問題??1. 內存不足&#xff08;OOM&#xff09;???現象?&#xff1a;OOM errors、響…

Blender 基礎操作

基礎操作 一、視角控制 ①旋轉視角 &#xff1a; 拖動鼠標中鍵 ②平移視角 &#xff1a; shift 鼠標中鍵 ③放大\縮小 &#xff1a;鼠標滾輪 二、物體控制 1、重要 ① 移動物體 : G ② 旋轉物體 : R ③ 縮放物體 : S 2、不重要 ④ 新建物體 : shift A ⑤ 復制物體 : shift D…

Go 語言三大核心數據結構深度解析:數組、切片(Slice)與映射(Map)

&#x1f680;Go 語言三大核心數據結構深度解析&#xff1a;數組、切片&#xff08;Slice&#xff09;與映射&#xff08;Map&#xff09; 在 Go 語言的開發領域&#xff0c;數組、切片與映射 這三大核心數據結構猶如構建程序的基石&#xff0c;支撐著各類數據的存儲與處理。它…

《Webpack與Vite熱模塊替換機制深度剖析與策略抉擇》

從早期簡單的文件合并工具,到如今功能強大、高度自動化的Webpack和Vite,它們重塑了前端開發的流程與效率。而熱模塊替換(HMR, Hot Module Replacement)機制,作為其中關鍵的一環,更是成為開發者提升開發體驗、加速項目迭代的秘密武器。Webpack,作為前端構建領域的先驅者,…

虛擬樂隊“天鵝絨落日”:AI生成音樂引發的行業風暴

引言近日&#xff0c;音樂行業掀起了一陣關于一支名為“The Velvet Sundown”&#xff08;天鵝絨落日&#xff09;樂隊的新聞熱潮。原因何在&#xff1f;這支樂隊很可能并非真正的樂隊&#xff0c;其音樂也或許是由人工智能生成的。事實上&#xff0c;越來越多的共識認為&#…

c++ final override 關鍵字

1.finalfinal 防止子類繼承&#xff0c;用于類或虛函數&#xff0c;限制繼承或重寫class Base final {}; // Base類不能被繼承class Base { public:virtual void foo() final; // 禁止子類重寫foo() };2.overrideoverride 子類中重寫父類中函數&#xff0c;&#xff0c;僅用于…

劍橋大學最新研究:基于大語言模型(LLM)的分子動力學模擬框架,是MD的GPT時刻還是概念包裝?

近期&#xff0c;劍橋大學 Michele Vendruscolo 團隊在預印本平臺上發布了一項最新研究&#xff0c;提出了一個名為 MD-LLM 的框架&#xff0c;旨在為高效研究蛋白質動態提供一種全新的思路。簡單來說&#xff0c;他們希望借助大語言模型&#xff08;LLM&#xff09;&#xff0…

MySQL梳理:其他

MySQL數據庫技術知識合集&#xff0c;涵蓋InnoDB存儲引擎的區管理機制、緩沖池機制等核心技術要點。本文檔將持續補充MySQL相關的重要技術知識點。 &#x1f4cb; 目錄 模塊一&#xff1a;InnoDB區狀態管理機制 1.1 核心設計思想1.2 四種區狀態詳解1.3 漸進式空間分配策略1.4…

影刀 —— 飛書電子表格

以獲取列上第一個可用行為例我們需要獲取的分別是 憑證 和 表格唯一標識首先來看如何獲取憑證在飛書開發者后臺創建應用然后添加權限發版拿App ID 和 App Secret下面來創建電子表格&#xff01;&#xff01;&#xff01;注意這個表格一定不要創建到知識庫里面如果創建到知識庫里…

1.二維圖像處理(完整版)

目錄 1.變換矩陣 2.在矩陣的基礎上添加各種變換形式 3.開始變換 4.計算變換矩陣參數 新算子 二、閾值分割 新算子 三、blob分析案例 1.焊點 2.石頭 3.木材 4.車牌 5.骰子 新算子 四、傅里葉變換頻域分析 問題一 五、濾波處理 1.均值濾波 2.中值濾波 3.高斯…

【linux基礎】Linux 文本處理核心命令指南

Linux 文本處理核心命令指南 文本處理是 Linux 系統管理的核心能力&#xff0c;約 80% 的配置文件操作都依賴于文本處理技術。本指南詳細講解 echo、重定向、cat、grep、wc 和 vim 等關鍵命令&#xff0c;涵蓋從基礎操作到高級技巧的完整知識體系&#xff0c;并配有實用案例演示…

基于深度學習YOLOv12的草莓成熟度檢測系統(YOLOv12+YOLO數據集+UI界面+登錄注冊界面+Python項目源碼+模型)https://www.bilibili.com/video/BV1

一、項目介紹 本項目構建了一套基于深度學習 YOLOv12 的草莓成熟度識別檢測系統&#xff0c;旨在實現對草莓在不同成熟階段的高精度、實時檢測與分類。系統采用 YOLO 格式數據集&#xff0c;將草莓分為 3 個類別&#xff1a;生&#xff08;raw&#xff09;、半熟&#xff08;tu…