当前位置: 首页 > article >正文

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");

 

 

相关文章:

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

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

怎么让Comfyui导出的图像不包含工作流信息,

为了数据安全&#xff0c;让Comfyui导出的图像不包含工作流信息&#xff0c;导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo&#xff08;推荐&#xff09;​​ 在 save_images 方法中&#xff0c;​​删除或注释掉所有与 metadata …...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)

macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 &#x1f37a; 最新版brew安装慢到怀疑人生&#xff1f;别怕&#xff0c;教你轻松起飞&#xff01; 最近Homebrew更新至最新版&#xff0c;每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...