EPPLUS——CAD c#讀寫EXCEL的第三方庫

?EPPLUS(可支持NET35)

在 CAD 的 C# 二次開發中,使用 EPPLUS 庫處理 Excel 文件具有以下顯著優點,尤其在兼容性、便捷性和性能等方面契合 CAD 項目的需求:

1. 跨.NET 版本兼容性強,適配 CAD 多環境部署

  • 多框架支持:EPPLUS 從早期的.NET 3.5 到最新的.NET 4.8 均能穩定運行,而 CAD 二次開發中常面臨不同 AutoCAD 版本(如 2014-2024)對應不同.NET 框架的情況(例如老版本 CAD 可能基于.NET 3.5,新版本基于.NET 4.5+)。這種兼容性避免了因框架不匹配導致的開發適配問題,無需為不同 CAD 版本單獨調整代碼。
  • 部署輕量:無需額外安裝.NET 擴展包,只需引用 EPPLUS.dll 即可集成,適合 CAD 插件的輕量化部署(CAD 插件通常要求安裝包簡潔,避免依賴沖突)。

2. 無需安裝 Office,解決 CAD 環境依賴痛點

  • 無 COM 組件依賴:傳統 Excel 操作庫(如 Microsoft.Office.Interop.Excel)依賴本地 Office 安裝,而 CAD 服務器或用戶環境可能未安裝 Office,或存在版本沖突(如 CAD 后臺服務場景)。EPPLUS 基于純.NET 代碼,通過 EPPlus 命名空間直接操作 Excel 文件(.xlsx 格式),完全脫離 Office 環境,避免因 COM 組件引發的權限、穩定性問題(如 CAD 進程中 COM 組件崩潰)。
  • 跨平臺潛力:雖然 CAD 主要運行在 Windows,但 EPPLUS 支持.NET Core(需適配版本),若未來涉及 CAD 跨平臺開發(如 Linux 環境的輕量化 CAD 工具),可無縫遷移。

3. 高效處理 CAD 數據,適配工程場景需求

  • 大數據量導出:CAD 圖紙常包含大量構件、屬性數據(如管線參數、構件坐標),EPPLUS 采用流式處理(Streaming 模式),可高效生成包含數萬行數據的 Excel 文件,內存占用低,避免 CAD 進程因內存溢出卡頓。例如,導出建筑模型的所有構件屬性時,性能優勢明顯。
  • 格式與圖表定制:支持自定義 Excel 格式(如單元格樣式、行列凍結、條件格式)、生成工程報表常用的圖表(如工程量柱狀圖、構件分布餅圖),便于將 CAD 數據可視化。例如,可將圖紙中的鋼筋分布數據直接生成 Excel 圖表,輔助施工交底。
  • 批量導入支持:支持從 Excel 導入參數到 CAD 模型(如通過 Excel 表格批量創建構件),EPPLUS 的解析效率高,可處理包含復雜公式或合并單元格的工程表格,減少手動錄入誤差。

4. 開發便捷性與社區支持

  • API 簡潔易用:EPPLUS 的 API 設計貼近 Excel 操作邏輯(如 Workbook→Worksheet→Cell 層級操作),C# 開發者可快速上手,無需深入學習復雜模型。例如,讀取 CAD 選中構件的屬性并寫入 Excel,代碼量少且邏輯清晰。
  • 開源與商業靈活選擇:免費版(LGPL 協議)適合個人或開源項目,商業版(EPPlus Professional)提供更完善的技術支持和企業授權,滿足 CAD 項目的商業發布需求(如設計院插件需合規授權)。
  • 錯誤處理友好:支持 Excel 文件異常解析(如損壞文件)和內存管理,減少 CAD 插件因 Excel 操作導致的崩潰風險,提升用戶體驗。

5. 與 CAD 對象模型無縫集成

  • 數據映射便捷:可直接將 CAD 對象(如 Entity、BlockReference)的屬性(如坐標、圖層、自定義參數)映射到 Excel 單元格,無需復雜轉換。例如,遍歷圖紙中所有門窗構件,將其尺寸、材質等屬性導出到 Excel 表格。
  • 事務性操作支持:配合 CAD 的事務機制(如 Transaction),可在 Excel 操作中結合 CAD 的撤銷 / 重做功能,確保數據一致性(如導入 Excel 參數失敗時,CAD 操作可回滾)。

總結

在 CAD C# 二次開發中,EPPLUS 憑借跨框架兼容性、無 Office 依賴、高效數據處理能力,成為工程數據報表生成、批量參數導入導出的理想選擇。尤其在需要適配不同 CAD 版本、避免環境依賴、處理大量工程數據的場景下,其優勢更為突出,可顯著提升插件的穩定性和開發效率。

?public class EPPlus{// 主方法:導出數據庫到Excel[CommandMethod("Epp")]public void 讀取數據庫ToExcel_EPPlus(){// ====================== 步驟1:配置數據庫連接 ======================string connectionString ="Data Source=rm-wz9a";// 生成Excel路徑(桌面+時間戳命名)string fileName = string.Format("{0:yyyyMMddHHmmss}.xlsx", DateTime.Now);string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);string filePath = Path.Combine(desktopPath, fileName);using (ExcelPackage package = new ExcelPackage()){try{// ====================== 步驟4:為每個表創建Sheet并寫入數據 ======================foreach (string tableName in tableNames){try{// 創建工作表(表名作為Sheet名,限制31字符)string sheetName = tableName.Length > 31 ? tableName.Substring(0, 31) : tableName;ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(sheetName);// 讀取表結構和數據(通過自定義類TableData)TableData tableData = ReadTableData(connection, tableName);//if (tableData.Headers.Count == 0 || tableData.Data.Count == 0)//{//    Z.ed.WriteMessage($"表 {tableName} 無數據或結構,跳過");//    continue;//}// ====================== 步驟5:寫入表頭(帶樣式) ======================for (int col = 0; col < tableData.Headers.Count; col++){worksheet.Cells[1, col + 1].Value = tableData.Headers[col];// 表頭樣式:加粗、淺藍背景、自動換行(EPPlus 4.x 樣式設置)worksheet.Cells[1, col + 1].Style.Font.Bold = true;worksheet.Cells[1, col + 1].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells[1, col + 1].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightBlue);worksheet.Cells[1, col + 1].Style.WrapText = true;}// 步驟6:寫入表數據并設置格式for (int row = 0; row < tableData.Data.Count; row++){for (int col = 0; col < tableData.Data[row].Length; col++){object cellValue = tableData.Data[row][col];worksheet.Cells[row + 2, col + 1].Value = cellValue;// 根據字段類型設置 Excel 格式Type columnType = tableData.ColumnTypes[col];if (columnType == typeof(DateTime)){// 日期時間格式(Excel 自定義格式)worksheet.Cells[row + 2, col + 1].Style.Numberformat.Format = "yyyy-mm-dd hh:mm:ss";}else if (columnType == typeof(decimal) || columnType == typeof(double)){// 數值格式(保留2位小數)worksheet.Cells[row + 2, col + 1].Style.Numberformat.Format = "#,##0.00";}// 可擴展其他類型(如整數、布爾值等)}}// 定義表格范圍(表頭+數據行):第1行到最后一行數據,第1列到最后一列int lastRow = tableData.Data.Count + 1;  // 數據行從第2行開始,最后一行是數據行數+1(表頭占1行)int lastCol = tableData.Headers.Count;var tableRange = worksheet.Cells[1, 1, lastRow, lastCol];// 設置外邊框(上下左右)tableRange.Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;tableRange.Style.Border.Top.Color.SetColor(System.Drawing.Color.Black);tableRange.Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;tableRange.Style.Border.Bottom.Color.SetColor(System.Drawing.Color.Black);tableRange.Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;tableRange.Style.Border.Left.Color.SetColor(System.Drawing.Color.Black);tableRange.Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;tableRange.Style.Border.Right.Color.SetColor(System.Drawing.Color.Black);// ====================== 設置內部橫線(單元格之間的橫線) // 范圍:第1行到倒數第1行(最后一行的下邊框是外框,無需重復設置)var horizontalRange = worksheet.Cells[1, 1, lastRow - 1, lastCol];horizontalRange.Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;horizontalRange.Style.Border.Bottom.Color.SetColor(System.Drawing.Color.Black);// ====================== 設置內部豎線(單元格之間的豎線) ======================// 范圍:第1列到倒數第1列(最后一列的右邊框是外框,無需重復設置)var verticalRange = worksheet.Cells[1, 1, lastRow, lastCol - 1];verticalRange.Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;verticalRange.Style.Border.Right.Color.SetColor(System.Drawing.Color.Black);// 自動調整列寬worksheet.Cells[1, 1, tableData.Data.Count + 1, tableData.Headers.Count].AutoFitColumns();}catch (Exception ex){Z.ed.WriteMessage($"處理表 {tableName} 失敗: {ex.Message}");}}}// ====================== 步驟7:保存Excel文件 ======================FileInfo fileInfo = new FileInfo(filePath);package.SaveAs(fileInfo);Z.ed.WriteMessage($"Excel文件已保存至: {filePath}");// 自動打開文件(可選)System.Diagnostics.Process.Start("explorer.exe", filePath);}catch (Exception ex){Z.ed.WriteMessage($"系統錯誤: {ex.Message}");}}}public class TableData{public List<string> Headers { get; set; }  // 表頭(列名+類型)public List<Type> ColumnTypes { get; set; }  // 新增:字段類型(如 typeof(DateTime))public List<object[]> Data { get; set; }    // 表數據}}?

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

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

相關文章

Linux知識回顧總結----進程狀態

本章將會介紹進程的一些概念&#xff1a;馮諾伊曼體系結構、進程是什么&#xff0c;怎么用、怎么表現得、進程空間地址、物理地址、虛擬地址、為什么存在進程空間地址、如何感性得去理解進程空間地址、環境變量是如何使用的。 目錄 1. 馮諾伊曼體系結構 1.1 是什么 1.2 結論 …

微信小程序之bind和catch

這兩個呢&#xff0c;都是綁定事件用的&#xff0c;具體使用有些小區別。 官方文檔&#xff1a; 事件冒泡處理不同 bind&#xff1a;綁定的事件會向上冒泡&#xff0c;即觸發當前組件的事件后&#xff0c;還會繼續觸發父組件的相同事件。例如&#xff0c;有一個子視圖綁定了b…

Android Test3 獲取的ANDROID_ID值不同

Android Test3 獲取的ANDROID_ID值不同 這篇文章來說明上一篇文章中說到的一個現象&#xff1a;在同一個項目中&#xff0c;創建不同的 app module&#xff0c;運行同一段測試代碼&#xff0c;獲取到的 ANDROID_ID 的值不同。 我也是第一次認真研究這個現象&#xff0c;這個還…

JSON 和 LabVIEW Data Types 互相轉換

使用JSONtext C:\Program Files (x86)\National Instruments\LabVIEW 2021\examples\JDP Science\JSONtext JSONtext LabVIEW Data Types.vi

docker和docker-compose的版本對應關系怎么看?

docker和docker-compose的版本對應關系怎么看&#xff1f;最近在安裝這兩個工具&#xff0c;像知道他們的版本對應關系&#xff0c;查了不少資料才找到。 雖然 Docker 和 Docker Compose 的版本并不嚴格綁定&#xff0c;但是在某些情況下&#xff0c;新版本的 Docker Compose …

郵科ODM攝像頭:多維度護航高鐵安全系統方案解析

?高鐵作為現代交通的重要支柱&#xff0c;其安全穩定運行依賴于高效的監控體系。攝像頭系統作為高鐵安全管理的“視覺感知中樞”&#xff0c;憑借多場景覆蓋、智能分析以及環境適應性設計&#xff0c;在行車安全、設備維護、乘客服務等方面發揮著不可或缺的作用。本文將從技術…

盒模型小全

CSS盒子模型詳解 1. 定義 CSS盒子模型是用于描述HTML元素在頁面中布局和表現的核心概念之一。在CSS中&#xff0c;所有HTML元素都被視為一個矩形的盒子&#xff0c;這些盒子封裝了周圍的HTML元素&#xff0c;并允許在其他元素和周圍元素邊框之間的空間放置內容。 2. 組成部分…

自定義鼠標效果 - 瀏覽器擴展使用教程

自定義鼠標效果 - 瀏覽器擴展使用教程 這里寫目錄標題 自定義鼠標效果 - 瀏覽器擴展使用教程功能特點安裝方法Chrome/Edge瀏覽器 使用指南1. 更改鼠標光標樣式2. 啟用鼠標軌跡效果3. 自定義軌跡效果點狀/彩虹/漸隱軌跡&#xff1a;表情軌跡&#xff1a; 管理自定義光標支持的文…

基于SpringBoot實現的課程答疑系統設計與實現【源碼+文檔】

基于SpringBootVue實現的課程答疑系統采用前后端分離架構方式&#xff0c;系統設計了管理員、學生、老師三種角色&#xff0c;系統實現了用戶登錄與注冊、個人中心、學生管理、老師管理、科目類型管理、學生問題管理、老師回答管理、老師信息管理、關注列表管理、交流區、輪播圖…

御微半導體面試總結

前一陣子在公司干的難受&#xff0c;所以再合肥這邊面試了幾家公司&#xff0c;挑一個御微半導體來說一下吧&#xff0c;公司主要是做半導體晶元測量的&#xff0c;具體啥我也不太明白。 公司產品線多&#xff0c;每條產品線配有獨立的軟件、結構、光學控制等人員開發語言和框…

Android Compose 自定義圓形取色盤

val Dp.toPx: Floatget() {var scale 3f // MyApplication.context.resources.displayMetrics.apply { // scale density // }return value * scale}val colors List(360) { i ->Color.hsv(360f - i, 1f, 1f) // 360到1的所有HSV顏色 }Preview …

vscode 配置 latex

下載插件 安裝插件前自行安裝 texlive, 按照 https://tug.org/texlive/ 要求安裝 找到 settings 打開 json 文件 在 json 文件中添加如下配置 "latex-workshop.latex.tools": [{"name": "latexmk","command": "latexmk",&qu…

安寶特方案丨船舶智造的“AR+AI+作業標準化管理解決方案”(質檢)

船舶質檢管理現狀&#xff1a;質檢環節部分依賴人工檢測&#xff0c;質檢員依據質量標準對產品進行抽檢或全檢。人工質檢受質檢員主觀因素影響較大&#xff0c;不同質檢員對標準的把握可能存在差異。 一、痛點與需求 1 Arbigtec 人工經驗依賴嚴重&#xff1a; 質檢員的檢測準確…

jenkins gerrit-trigger插件配置

插件gerrit-trigger下載好之后要在Manage Jenkins -->Gerrit Trigger-->New Server 中新增Gerrit Servers 配置好保存后點擊“狀態”查看是否正常

ubuntu24.04下 zookeeper3.8.4 集群的配置

1、環境 1.1 三臺機器網絡互通&#xff0c;并做hosts解析 準備三臺及以上ubuntu24.04主機&#xff08;奇數&#xff09; rootzk-node01:~# hostname zk-node01rootzk-node01:~# cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 u24-server10.0.49.215 zk-node01 10.0.4…

火山引擎 veFuser:面向擴散模型的圖像與視頻生成推理服務框架

資料來源&#xff1a;火山引擎-開發者社區 DiT 模型與推理挑戰 近年來&#xff0c;擴散模型&#xff08;Diffusion Models&#xff09;在生成式人工智能領域取得了突破性進展&#xff0c;尤其是在圖像和視頻生成方面表現卓越。基于 Transformer 的擴散模型&#xff08;DiT, D…

動態多目標進化算法:VARE(Vector Autoregressive Evolution)求解DF1-DF14,提供完整MATLAB代碼

一、VARE簡介 VARE&#xff08;Vector Autoregressive Evolution&#xff09;算法是2023年提出的一種新型的動態多目標優化&#xff08;DMO&#xff09;算法&#xff0c;旨在有效處理隨時間變化的多目標優化問題。它通過結合向量自回歸&#xff08;VAR&#xff09;模型和環境感…

【JavaEE】-- HTTPS

文章目錄 1. HTTPS是什么&#xff1f;2. 加密是什么&#xff1f;2.1 引入對稱加密&#xff08;效率高&#xff09;2.2 引入非對稱加密&#xff08;效率低&#xff09;2.3 引入證書2.3.1 數據簽名2.3.2 通過證書解決中間人攻擊 1. HTTPS是什么&#xff1f; HTTP也是一個應用層協…

撰寫腳本,通過發布/joint_states話題改變機器人在Rviz中的關節角度

撰寫腳本&#xff0c;通過發布/joint_states話題改變機器人在Rviz中的關節角度 提問 為我寫一個改變關節base_spherical_center_high_joint角度的python腳本吧。適用于ROS2的humble 回答 下面是一個適用于 ROS 2 Humble 的 Python 腳本&#xff0c;它會以指定頻率持續發布 …

Redis : Hash類型

哈希類型 哈希類型的命令 hset 設置key指定的字段&#xff08;field&#xff09;的值&#xff08;value&#xff09; 也可以設置多組field和value hget 獲得哈希中指定字段的值 如果該字段為空或者key為空則返回nil hexists 判斷哈希中是否有該字段的值 如果有則會返回1…