NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。

【方案2】让CAD在加载过程中把类库加载到内存
【方案3】是发现缺少了哪个库,就用插件程序加载进去

c#中三方库操作excel多种方式,对比如下:

综合对比

特性NPOIAspose.CellsCOM Interop (Excel.Application)
授权与成本免费开源 (Apache 2.0)商业授权 (约$3,000/开发者)免费 (需安装Office)
依赖项纯.NET库 (无依赖)纯.NET库 (无依赖)需安装Microsoft Office
部署环境任意环境 (服务器/客户端)任意环境 (服务器/客户端)仅客户端 (需安装Office)
性能⭐⭐⭐⭐ (较快)⭐⭐⭐⭐ (优化良好)⭐ (非常慢)
功能完整性⭐⭐⭐ (基础功能完善)⭐⭐⭐⭐⭐ (100%功能覆盖)⭐⭐⭐⭐⭐ (原生支持)
内存占用50-100 MB100-200 MB300-500 MB+
稳定性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐ (常崩溃)
多线程支持✅ 良好✅ 优秀❌ 极差
文档支持GitHub Wiki专业技术文档+支持MSDN文档
学习曲线中等中等复杂
版本兼容性向后兼容好版本升级需注意Office版本强依赖

详细分析

1. NPOI (POI for .NET)

优点:

using (var fs = new FileStream("test.xlsx", FileMode.Create)) { IWorkbook workbook = new XSSFWorkbook(); // xlsx格式 ISheet sheet = workbook.CreateSheet("Sheet1"); // 添加数据 IRow row = sheet.CreateRow(0); row.CreateCell(0).SetCellValue("Hello"); row.CreateCell(1).SetCellValue("NPOI"); workbook.Write(fs); }
  • 💰 零成本:完全免费,Apache 2.0许可

  • 🚀 高性能:内存操作,处理速度快

  • ☁️ 无依赖:不依赖Office,适合服务器端使用

  • 📦 轻量级:NuGet包仅5-10MB

  • 🔄 格式支持:完美支持xls/xlsx格式

缺点:

  • ⚠️ 高级功能有限

    • 数据透视表支持不完善

    • 复杂图表功能较弱

    • 条件格式实现复杂

  • 📚 文档不足:官方文档较简略,依赖社区示例

  • 🧩 API设计:部分接口不够直观

适用场景: 报表导出、数据导入导出、简单格式操作等基础需求

2. Aspose.Cells

优点:

  • 🧩 功能全面

    • 100% Excel功能覆盖

    • 完美支持数据透视表、高级图表

    • 公式计算引擎

    • 格式转换(PDF/HTML/CSV等)

  •  

  • 3. COM Interop (Excel.Application)

    优点:

    🛡️ 稳定可靠:商业级质量保证

  • 📊 高性能处理:优化的大数据量处理

  • 🔄 版本兼容:支持从Excel 97到最新格式

  • 🔌 原生支持:100% Excel功能兼容

  • 🧩 VBA移植:可直接转换VBA代码

  • 🎨 所见即所得:实时可视化操作

最终建议

  1. 优先选择NPOI - 对于大多数场景足够且免费

  2. 投资Aspose当

    • 需要处理复杂Excel功能

    • 要求高稳定性

    • 预算允许($3,000+/开发者)

  3. 完全避免COM互操作 - 除非在受控客户端环境且无替代方案

您遇到的"Evaluation Only"问题正是Aspose商业授权的典型表现。若预算有限,迁移到NPOI是明智选择,尽管可能需要调整部分高级功能实现方式。

        public void Npoi(){try{// 步骤1:创建 XSSF 工作簿(对应 .xlsx 格式)using (IWorkbook workbook = new XSSFWorkbook()){// 步骤2:删除默认创建的所有工作表(新建工作簿默认有一个 "Sheet1")while (workbook.NumberOfSheets > 0){workbook.RemoveSheetAt(0); // 按索引删除工作表(从0开始)}// 步骤3:创建名为 "乘法表" 的新工作表ISheet sheet = workbook.CreateSheet("乘法表");// 步骤4:设置表头(第一行第一列,合并单元格 A1-I1)IRow headerRow = sheet.CreateRow(0); // 行索引从0开始(第一行)ICell headerCell = headerRow.CreateCell(0); // 列索引从0开始(第一列)headerCell.SetCellValue("九九乘法表");// 合并单元格(行范围:0-0,列范围:0-8,对应 A1 到 I1)CellRangeAddress headerMergeRegion = new CellRangeAddress(0, 0, 0, 8);sheet.AddMergedRegion(headerMergeRegion);// 步骤5:生成九九乘法表内容(从第二行开始,行索引1)for (int i = 1; i <= 9; i++) // 外层循环:被乘数(1-9){IRow dataRow = sheet.CreateRow(i); // 创建第 i+1 行(行索引i)for (int j = 1; j <= i; j++) // 内层循环:乘数(1到被乘数){ICell cell = dataRow.CreateCell(j - 1); // 列索引 = j-1(从0开始)cell.SetCellValue($"{j}*{i}={i * j}"); // 格式示例:"2*3=6"}}// 步骤6:设置列宽(可选,根据内容自适应宽度)for (int col = 0; col < 9; col++){sheet.AutoSizeColumn(col); // 自动调整列宽以适应内容}// 调用格式设置函数(核心封装功能)SetSheetFormat(sheet);// 步骤7:获取桌面路径并保存文件string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);string savePath = Path.Combine(desktopPath, "九九乘法表.xlsx");using (FileStream fs = new FileStream(savePath, FileMode.Create, FileAccess.Write)){workbook.Write(fs); // 将工作簿写入文件流}Z.ed.WriteMessage($"Excel 文件已成功保存到:{savePath}");}}catch (Exception ex){Z.ed.WriteMessage($"操作失败,错误信息:{ex.Message}");}}/// <summary>/// 封装:设置工作表格式(字体加粗、边框、对齐、自动列宽)/// </summary>/// <param name="sheet">需要设置格式的工作表</param>static void SetSheetFormat(ISheet sheet){IWorkbook workbook = sheet.Workbook; // 获取工作簿引用(用于创建样式)#region 样式定义// 表头字体样式(加粗)IFont headerFont = workbook.CreateFont();headerFont.FontHeightInPoints = 12; // 字体大小headerFont.Boldweight = (short)FontBoldWeight.Bold; // 加粗// 内容单元格样式(边框+居中对齐)ICellStyle contentStyle = workbook.CreateCellStyle();contentStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; // 水平居中contentStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; // 垂直居中// 设置黑色细边框(上下左右)contentStyle.BorderTop = BorderStyle.Thin;contentStyle.BorderBottom = BorderStyle.Thin;contentStyle.BorderLeft = BorderStyle.Thin;contentStyle.BorderRight = BorderStyle.Thin;contentStyle.TopBorderColor = IndexedColors.Black.Index;contentStyle.BottomBorderColor = IndexedColors.Black.Index;contentStyle.LeftBorderColor = IndexedColors.Black.Index;contentStyle.RightBorderColor = IndexedColors.Black.Index;// 表头单元格样式(合并后单独设置)ICellStyle headerStyle = workbook.CreateCellStyle();headerStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center;headerStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;headerStyle.SetFont(headerFont); // 应用加粗字体#endregion#region 处理表头格式// 表头行(第0行)IRow headerRow = sheet.GetRow(0);if (headerRow != null){// 合并后的表头单元格(A1)ICell headerCell = headerRow.GetCell(0);if (headerCell != null){headerCell.CellStyle = headerStyle; // 应用表头样式}}#endregion#region 获取表格最大行和列int maxRow = sheet.LastRowNum; // 最后一行索引(从0开始)int maxCol = 0;// 遍历所有行获取最大列数for (int rowNum = 0; rowNum <= maxRow; rowNum++){IRow row = sheet.GetRow(rowNum);if (row != null && row.LastCellNum > maxCol){maxCol = row.LastCellNum; // 记录当前行的最大列数}}#endregion#region 应用内容格式(所有单元格)for (int rowNum = 0; rowNum <= maxRow; rowNum++){IRow row = sheet.GetRow(rowNum) ?? sheet.CreateRow(rowNum); // 确保行存在for (int colNum = 0; colNum < maxCol; colNum++){ICell cell = row.GetCell(colNum) ?? row.CreateCell(colNum); // 确保单元格存在cell.CellStyle = contentStyle; // 应用内容样式(边框+对齐)}}#endregion#region 自动调整列宽for (int colNum = 0; colNum < maxCol; colNum++){sheet.AutoSizeColumn(colNum); // 自动调整列宽// 适当增加列宽(避免内容过紧)sheet.SetColumnWidth(colNum, sheet.GetColumnWidth(colNum) + 1000);}#endregion}/// <summary>/// 生成九九乘法表数据到指定工作表/// </summary>/// <param name="sheet">目标工作表</param>

唯一文件名:          
               

  string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);string dateTimeStr = DateTime.Now.ToString("yyyyMMdd_HHmmss");string savePath = Path.Combine(desktopPath, $"九九乘法表_{dateTimeStr}.xlsx");

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84095.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go字符串切片操作详解:str1[:index]

在Go语言中&#xff0c;return str1[:index] 是一个​​字符串切片操作​​&#xff0c;它截取字符串的一部分。让我们深入解析这个操作的含义和原理&#xff1a; 基本语法和含义 str1&#xff1a;原始字符串[:index]&#xff1a;切片操作符str1[:index]&#xff1a; ​​起始…

NVIDIA Dynamo:数据中心规模的分布式推理服务框架深度解析

NVIDIA Dynamo&#xff1a;数据中心规模的分布式推理服务框架深度解析 摘要 NVIDIA Dynamo是一个革命性的高吞吐量、低延迟推理框架&#xff0c;专为在多节点分布式环境中服务生成式AI和推理模型而设计。本文将深入分析Dynamo的架构设计、核心特性、代码实现以及实际应用示例&…

408第一季 - 数据结构 - 栈与队列的应用

括号匹配 用瞪眼法就可以知道的东西 栈在表达式求值运用 先简单看看就行&#xff0c;题目做了就理解了 AB是操作符,也是被狠狠加入后缀表达式了&#xff0c;然后后面就是*&#xff0c;只要优先级比栈顶运算符牛逼就放里面&#xff0c;很显然&#xff0c;*比牛逼 继续前进&#…

Ubuntu 下开机自动执行命令的方法

Ubuntu 下开机自动执行命令的方法&#xff08;使用 crontab&#xff09; 在日常使用 Ubuntu 或其他 Linux 系统时&#xff0c;我们常常需要让某些程序或脚本在系统启动后自动运行。例如&#xff1a;启动 Clash 代理、初始化服务、定时同步数据等。 本文将介绍一种简单且常用的…

jpackage 打包 jar包 为exe可执行程序

jpackage --input target/ --main-jar note.jar --runtime-image H:/Dpanbeifeng/apps/finalshell/jre --type app-image --dest output/ --main-class com.textmanager.Main --icon logo2.png --name 猫咪快笔记 jpackage 打包指令详细介绍 jpackage 概述 jpackage 是…

H5移动端性能优化策略(渲染优化+弱网优化+WebView优化)

一、渲染优化&#xff1a;首屏速度提升的核心​​ ​​1. 关键页面采用SSR或Native渲染​​ ​​适用场景​​&#xff1a;首页、列表页、详情页等强内容展示页面 ​​优化原理​​&#xff1a; ​​SSR&#xff08;服务端渲染&#xff09;​​&#xff1a;在服务端生成完整…

Matlab | matlab中的图像处理详解

MATLAB 图像处理详解 这里写目录标题图像处理 MATLAB 图像处理详解一、图像基础操作1. 图像读写与显示2. 图像信息获取3. 图像类型转换二、图像增强技术1. 对比度调整2. 去噪处理3. 锐化处理三、图像变换1. 几何变换2. 频域变换四、图像分割1. 阈值分割2. 边缘检测3. 区域分割五…

keysight是德科技N9923A网络分析仪

keysight是德科技N9923A网络分析仪 简  述&#xff1a;N9923A 是一款使用电池供电的便携式射频矢量网络分析仪&#xff0c;其中包括全 2 端口网络分析仪、电缆和天线测试仪、故障点距离测试仪、功率计以及 1 通道和 2 通道矢量电压表。 主要特性与技术指标 网络分析仪 * 2…

idea不识别lombok---实体类报没有getter方法

介绍 本篇文章&#xff0c;主要讲idea引入lombok后&#xff0c;在实体类中加注解Data&#xff0c;在项目启动的时候&#xff0c;编译不通过&#xff0c;报错xxx.java没有getXxxx&#xff08;&#xff09;方法。 原因有以下几种 1. idea没有开启lombok插件 2. 使用idea-2023…

本地主机部署开源企业云盘Seafile并实现外部访问

Seafile是一个开源、专业、可靠的云存储平台&#xff1b;解决文件集中存储、共享和跨平台访问等问题。这款软件功能强大&#xff0c;界面简洁、操作方便。 本文将详细的介绍如何利用本地主机部署 Seafile&#xff0c;并结合nat123&#xff0c;实现外网访问本地部署的 Seafile …

【从0-1的CSS】第1篇:CSS简介,选择器以及常用样式

文章目录 CSS简介CSS的语法规则选择器id选择器元素选择器类选择器选择器优先级 CSS注释 CSS常用设置样式颜色颜色名称(常用)RGB(常用)RGBA(常用)HEX(常用)HSLHSLA 背景background-colorbackground-imagebackground-size 字体text-aligntext-decorationtext-indentline-height 边…

SpringBoot+MySQL家政服务平台 设计开发

概述 基于SpringBootMySQL开发的家政服务平台完整项目&#xff0c;该系统实现了用户预约、服务管理、订单统计等核心功能&#xff0c;采用主流技术栈开发&#xff0c;代码规范且易于二次开发。 主要内容 系统功能架构 本系统采用前后端分离架构&#xff0c;前端提供用户交互…

3.1 HarmonyOS NEXT分布式数据管理实战:跨设备同步、端云协同与安全保护

HarmonyOS NEXT分布式数据管理实战&#xff1a;跨设备同步、端云协同与安全保护 在万物互联的时代&#xff0c;数据的跨设备流转与安全共享是全场景应用的核心需求。HarmonyOS NEXT通过分布式数据管理技术&#xff0c;实现了设备间数据的实时同步与端云协同&#xff0c;为开发…

高保真组件库:数字输入框

拖入一个文本框。 拖入一个矩形,作为整个数字输入框的边框,边框颜色为灰色DCDEE2,圆角半径为4。 拖入一个向上的箭头图标作为增加按钮,再拖入一个矩形,将向上箭头图标放入矩形内。矩形:18x15,边框颜色DCDEE2,边框左下可见,箭头图标:8x5,矩形置底,组合在一起命名”增…

【力扣链表篇】19.删除链表的倒数第N个节点

题目&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]…

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…

wpf ListBox 去除item 单击样式

在WPF中去除ListBox项的单击样式&#xff0c;可以通过修改ItemContainerStyle来实现。以下是解决方案&#xff1a; <ListBox><ListBox.ItemContainerStyle><Style TargetType"ListBoxItem"><Setter Property"Background" Value"…

A Execllent Software Project Review and Solutions

The Phoenix Projec: how do we produce software? how many steps? how many people? how much money? you will get it. i am a pretty judge of people…a prank

Android 视图系统入门指南

1. View&#xff1a;界面的最小单位 本质&#xff1a;屏幕上的一个矩形区域&#xff0c;能显示内容或接收触摸。比喻&#xff1a;就像乐高积木&#xff0c;是组成界面的最小单位。常见子类&#xff1a; TextView&#xff08;文字积木&#xff09;、Button&#xff08;按钮积木…

【走好求职第一步】求职OMG——见面课测验4

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01;博主码字不易点个关注吧~~ 1.单选题(2分) 下列不属于简历撰写技巧原则的是&#xff08; A &#xff09; A.具体性 B.相关性 C.匹配性 2.单选题(2分) 笔试的下一步一般是:( B &…