C# EPPlus 访问 Excel表格

EPPlus是什么?

一个访问Excel表格的库,调用相当简单
在这里插入图片描述

怎么访问?

  1. 表格可以简单理解成一个二维数组
  2. 我希望访问表格像二维数组一样简单
  3. 我希望消耗不算太大

封装一个类

下载DLL以及这个文件:《下载传送门->》

注意需要导入EPPlus插件


using OfficeOpenXml;
using System;
using System.IO;namespace ExcelHelper
{public interface ITable{public int RowCount { get; }public int ColumnCount { get; }}public interface ITable<T> : ITable{T this[int row, int column] { get; set; }}public class ExcelStream : IDisposable, ITable<string>{public string SourcePath { get; set; } = string.Empty;public int Sheet { get; set; } = 1;private ConfigTable<string> data = null;public ConfigTable<string> Data{get{if (data == null) throw new NullReferenceException("Please read the data before accessing it");return data;}}public int RowCount => data.RowCount;public int ColumnCount => data.ColumnCount;public string this[int row, int column]{get => Data[row, column];set => Data[row, column] = value;}
//#if NETCOREAPP
//        public ExcelStream(string location, int sheet = 0, bool isCommerical = false)
//        {//#elsepublic ExcelStream(string location, int sheet = 1,bool isCommerical= false){//#endifint x = 0;if(false){int x = 10;}// int x;//OfficeOpenXml.ExcelPackage.LicenseContext = isCommerical ? OfficeOpenXml.LicenseContext.Commercial : OfficeOpenXml.LicenseContext.NonCommercial;SourcePath = location;Sheet = sheet;}private void Create(){using (var package = new ExcelPackage()){package.Workbook.Worksheets.Add("Sheet1");package.SaveAs(new FileInfo(SourcePath));}}/// <summary>/// Read执行的操作是与Excel表进行IO交换,读取到Data/// </summary>public void Read(){if (!File.Exists(SourcePath)) throw new Exception("Please call write to create an empty file before reading a non-existent file");using (var package = new ExcelPackage(new FileInfo(SourcePath))){// 获取工作表ExcelWorksheet worksheet = package.Workbook.Worksheets[Sheet]; // 默认读取第一个工作表.int rowCount;int columnCount;//初始化数据表if (worksheet.Dimension == null){rowCount = 0;columnCount = 0;}else{rowCount = worksheet.Dimension.Rows;columnCount = worksheet.Dimension.Columns;}data = new ConfigTable<string>(rowCount, columnCount);//初始化单元格值for (int i = 0; i < rowCount; i++){for (int j = 0; j < columnCount; j++){data[i, j] = worksheet.Cells[i + 1, j + 1].Text;}}}}/// <summary>/// Write执行的操作是不存在则创建,存在则覆盖写入/// </summary>public void Write(){if (!File.Exists(SourcePath))Create();using (var package = new ExcelPackage(new FileInfo(SourcePath))){ExcelWorksheet worksheet = package.Workbook.Worksheets[Sheet];for (int i = 0; i < data.RowCount; i++){for (int j = 0; j < data.ColumnCount; j++){worksheet.Cells[i + 1, j + 1].Value = data[i, j];}}package.Save();}}/// <summary>/// 添加一个页/// </summary>/// <param name="name"></param>public void AddSheet(string name){using (var package = new ExcelPackage()){package.Workbook.Worksheets.Add(name);package.Save(SourcePath);}}public void Dispose(){data = null;}}public class ConfigTable<T> : ITable<T>{/// <summary>/// 行数/// </summary>public int RowCount { get; private set; } = 0;/// <summary>/// 列数/// </summary>public int ColumnCount { get; private set; } = 0;#pragma warning disable CS8625 // 无法将 null 字面量转换为非 null 的引用类型。private T[,] data = null;
#pragma warning restore CS8625 // 无法将 null 字面量转换为非 null 的引用类型。public ConfigTable(int rowCount, int columnCount){SetSizeAndCopy(rowCount, columnCount);}public ConfigTable(ConfigTable<T> table){SetSizeAndCopy(table.RowCount, table.ColumnCount, false);
#pragma warning disable CS8604 // 引用类型参数可能为 null。table.data.CopyTo(data, 0);
#pragma warning restore CS8604 // 引用类型参数可能为 null。}/// <summary>/// 设置大小并拷贝/// </summary>/// <param name="newRowCount"></param>/// <param name="newColumnCount"></param>/// <param name="copy"></param>/// <exception cref="InvalidOperationException"></exception>public void SetSizeAndCopy(int newRowCount, int newColumnCount, bool copy = true){if (newRowCount < 0 || newColumnCount < 0) throw new InvalidOperationException($"Invalid New Size:[{newRowCount},{newColumnCount}]");int minRowCount = Math.Min(RowCount, newRowCount);int minColumnCount = Math.Min(ColumnCount, newColumnCount);RowCount = newRowCount;ColumnCount = newColumnCount;var temp = data;data = new T[RowCount, ColumnCount];if (temp != null && copy){for (int i = 0; i < minRowCount; i++){for (int j = 0; j < minColumnCount; j++){data[i, j] = temp[i, j];}}}temp = null;}private void IndexOutOfRangeCheck(int row, int column){if (row >= RowCount || row < 0 || column >= ColumnCount || column < 0) throw new IndexOutOfRangeException($"Row:{row}({RowCount - 1})  Column:{column}({ColumnCount - 1})");}public T this[int row, int column]{get{IndexOutOfRangeCheck(row, column);return data[row, column];}set{IndexOutOfRangeCheck(row, column);data[row, column] = value;}}}
}

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

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

相关文章

小程序引入vant-Weapp保姆级教程及安装过程的问题解决

小知识&#xff0c;大挑战&#xff01;本文正在参与“程序员必备小知识”创作活动。 本文同时参与 「掘力星计划」&#xff0c;赢取创作大礼包&#xff0c;挑战创作激励金 当你想在小程序里引入vant时&#xff0c;第一步&#xff1a;打开官方文档&#xff0c;第二步&#xff…

如何把利用paddlepaddle导出的json文件转化为yolo或者voc文件

目录 1. 修改源码&#xff0c;让模型能够生成出对于单个图像的标注。 2. 把数据转为yolo格式 3.把yolo格式转化为xml格式 这两天想偷懒&#xff0c;想让模型先在数据上标一遍&#xff0c;然后我再做修正&#xff0c;主要是图个省事。由于我们主要是利用paddle,模型也是基于p…

What is the difference between Parseval‘s theorem and Plancherel Theorem

Plancherel定理是调和分析里的一个结论, 最早由Michel Plancherel证明, 其可表述为 对同时属于 L 1 ( R ) L^{1}(R) L1(R) 和 L 2 ( R ) L^{2}(R) L2(R) 的函数f来说,其傅立叶变换F属于 L 2 ( R ) L^{2}(R) L2(R) ,且傅立叶变换是等距变换.数学表述为&#xff1a; ∥ f ^ ∥ 2…

如何让一个uniform variable在多级shader中都起作用(类似C语言的全局变量)?

GLSL编程中通常设计多个shader&#xff0c;如vertex shader, fragment shader等等。在最近的某个项目中&#xff0c;我需要定义一个变量&#xff0c;该变量类似C语言中的全局变量&#xff0c;要同时在两个shader中都起作用。c - OpenGL Uniform Across Multiple Shaders - Stac…

JavaScript系列从入门到精通系列第六篇:JavaScrip当中的运算符,主要涉及JavaScript当中的六大数据类型的四则运算

文章目录 前言 一&#xff1a;算数运算符 1&#xff1a;Number类型的四则运算 2&#xff1a;其他数据类型的四则运算 (一)&#xff1a;加法运算 (二)&#xff1a;减法运算 3&#xff1a;乘法运算 4&#xff1a;除法运算 5&#xff1a;取模运算 前言 运算符也叫操作符。…

HarmonyOS之 开发环境搭建

一 鸿蒙简介&#xff1a; 1.1 HarmonyOS是华为自研的一款分布式操作系统&#xff0c;兼容Android&#xff0c;但又区别Android&#xff0c;不仅仅定位于手机系统。更侧重于万物物联和智能终端&#xff0c;目前已更新到4.0版本。 1.2 HarmonyOS软件编程语言是ArkTS&#xff0c…

基于springboot+vue的高校专业实习管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

如何在 Excel 中计算日期之间的天数

计算两个日期之间的天数是 Excel中的常见操作。无论您是规划项目时间表、跟踪时间还是分析一段时间内的趋势&#xff0c;了解如何在 Excel 中查找日期之间的天数都可以提供强大的日期计算功能。 幸运的是&#xff0c;Excel 提供了多种简单的方法来获取两个日期之间的天数。继续…

ARM Cortex-M内核中系统堆栈

文章目录 有无OS的栈结构区别&#xff1a;裸机的任务栈结构带FreeRTOS操作系统的任务栈 ARM的寄存器有哪些特殊寄存器有哪些 关于FreeRTOS中的SP寄存器栈操作【压栈与弹栈的操作】一般函数嵌套调用时sp指针的变化Cortex-M内核的MSP与PSP作用 有无OS的栈结构区别&#xff1a; 裸…

微信店铺小程序开通的效果是什么

微信已经成为众多商家经营的主要场景&#xff0c;随着互联网电商深入&#xff0c;对经营者来说每天线上分享产品/服务/门店信息等已经成为日常&#xff0c;但为了打造品牌及解决传统线下经营困境和线上混乱的信息集、客户便捷触达提升商家效率等难题。 各行业/企业商家都在积极…

基于SpringBoot的社区医院信息平台

目录 前言 一、技术栈 二、系统功能介绍 患者信息管理 护士信息管理 医生信息管理 药品管理员管理 患者添加 安排检查 完成注射列表 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系…

Leetcode刷题笔记--Hot51-60

1--环形链表II 主要思路&#xff1a; 快慢指针&#xff0c;快指针每次走两步&#xff0c;慢指针每次走一步&#xff1b; 第一次相遇时&#xff0c;假设慢指针共走了 f 步&#xff0c;则快指针走了 2f 步&#xff1b; 假设起点到环入口结点的长度为 a&#xff08;不包括入口结点…

基于springboot+vue的华山旅游网(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

[管理与领导-102]:经营与管理的关系:攻守关系;武将文官关系;开疆拓土与守护城池的关系;战斗与练兵的关系;水涨船高,水落船低的关系。

目录 前言&#xff1a; 一、手中拿着锤子,一切看起来都像钉子 1.1 企业经营中过渡强调管理的表现&#xff1f; 1.2 企业经营中过渡强调管理的误区&#xff08;背后深层次的原因&#xff09; 二、无知者的无畏&#xff0c;独断者的自high 2.1 企业经营中过度忽律管理的表…

在线商城项目EShop【ListView、adapter】

要求如下&#xff1a; 1、创建在线商城项目EShop&#xff1b; 2、修改布局文件activity_main.xml&#xff0c;使用LineaLayout和ListView创建商品列表UI&#xff1b; 3、创建列表项布局list_item.xml&#xff0c;设计UI用于显示商品图标、名称和价格信息&#xff1b; 4、创…

能跑通的mmdet3d版本

能跑通的mmdet3d版本 1.0版本 2.0版本

ArrayList常见面试题

简介 ArrayList是我们开发中非常常用的数据存储容器之一&#xff0c;其底层是数组实现的&#xff0c;我们可以在集合中存储任意类型的数据&#xff0c;ArrayList是线程不安全的&#xff0c;非常适合用于对元素进行查找&#xff0c;效率非常高。 线程安全性 对ArrayList的操作…

Node.js环境安装与服务设置,结合内网穿透随时随地公网访问!

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

Hadoop的HDFS高可用方案

一、Hadoop高可用简介 Hadoop 高可用 (High Availability) 分为 HDFS 高可用和 YARN 高可用&#xff0c;两者的实现基本类似&#xff0c;但 HDFSNameNode 对数据存储及其一致性的要求比 YARN ResourceManger 高得多&#xff0c;所以它的实现也更加复杂 1、HDFS系统高可用简介…

【PowerShell】PowerShell的Core版本的额外配置

在PowerShell 7.1 安装完成后,默认情况下打开PowerShell 会直接进入到系统内置的PowerShell,如果希望通过远程连接或者PowerShell Web Access 进入到PowerShell 7环境的界面,就需要进行环境的再配置才能实现PowerShell 7.1 的环境连接。需要为外部的环境提供连接的话需要按照…