C#使用MiniExcel读取excel表格文件

使用MiniExcel读取excel表格文件

MiniExecl提供了几种读取方法。

准备测试数据

测试类:

   public class Person
   {
       public int Id { get; set; }

       public string Name { get; set; }

       public string Description { get; set; }

       public double Value { get; set; }
   }

测试数据:

在这里插入图片描述

方法一:以行列号来读取

使用MiniExcel.Query方法读取一个IEnumerable<dynamic>动态类型dynamic的集合

 var rows = MiniExcel.Query("test1.xlsx").ToList();

在这里插入图片描述

然后使用rows[0].A使用行号获取第几行,然后使用列号A、B、C…来获取对应的单元格的值

打断点可以看到各列的值的类型,读出来的都是dynamic,但是实际是由对应的类型,带字符的基本都是string,数值类型都是double,需要自己先处理一下

在这里插入图片描述

A,B,C列都是动态类型,但是实际数据根据单元格里数据不同,类型不同,可以统一对数据进行转换

/// <summary>
/// 动态类型转字符串,自动判空
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public string DynamicToString(dynamic data)
{
    return data == null ? "" : (string)data.ToString();
}

完整代码:

  
  private void Init()
  {
      //方法1
      var rows = MiniExcel.Query("test1.xlsx").ToList();
      for (int i = 1; i < rows.Count; i++)//跳过首行
      {
          Person person = new Person
          {
              Id = int.Parse(DynamicToString(rows[i].A)),
              Name = DynamicToString(rows[i].B),
              Description = DynamicToString(rows[i].C),
              Value = double.Parse(DynamicToString(rows[i].D)),
          };
          list.Add(person);
      }
  }

  /// <summary>
  /// 动态类型转字符串,自动判空
  /// </summary>
  /// <param name="data"></param>
  /// <returns></returns>
  public string DynamicToString(dynamic data)
  {
      return data == null ? "" : (string)data.ToString();
  }

效果:
在这里插入图片描述

方法二:使用第一行的名称进行读取

使用首行(标题行)的名称进行读取

在这里插入图片描述

读取的方法:

添加参数,设置使用头行读取,useHeaderRow: true

   var rows = MiniExcel.Query("test1.xlsx", useHeaderRow: true).ToList();

在这里插入图片描述

此时,读取的集合中已经没有首行,可以不用特殊处理


   var rows = MiniExcel.Query("test1.xlsx", useHeaderRow: true).ToList();
  for (int i = 0; i < rows.Count; i++)
  {
      Person person = new Person
      {
          Id = int.Parse(DynamicToString(rows[i].Id)),
          Name = DynamicToString(rows[i].Name),
          Description = DynamicToString(rows[i].Description),
          Value = double.Parse(DynamicToString(rows[i].Value)),
      };
      list.Add(person);
  }
 

实现效果一样

方法三:反序列化

首行标题跟类的属性名称一样,可以直接进行转换类型

在这里插入图片描述

直接返回对应类型的集合

 var rows = MiniExcel.Query<Person>("test1.xlsx").ToList();

这种方法最简单,但是对表格格式要求比较高,第一行必须为首行,否则无法实现

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年全球运维大会(GOPS上海站):运维精英齐聚一堂,共探行业新知(附大会核心PPT下载)

随着信息技术的飞速发展&#xff0c;运维作为保障企业信息化系统稳定运行的关键环节&#xff0c;其重要性日益凸显。GOPS 主要面向运维行业的中高端技术人员&#xff0c;包括运维、开发、测试、架构师等群体。目的在于帮助IT技术从业者系统学习了解相关知识体系&#xff0c;让创…

Docker容器化技术(使用Docker搭建论坛)

第一步&#xff1a;删除容器镜像文件 [rootlocalhost ~]# docker rm -f docker ps -aq b09ee6438986 e0fe8ebf3ba1第二步&#xff1a;使用docker拉取数据库 [rootlocalhost ~]# docker run -d --name db mysql:5.7 02a4e5bfffdc81cb6403985fe4cd6acb0c5fab0b19edf9f5b8274783…

RocketMQ—如何解决消息堆积问题

RocketMQ—如何解决消息堆积问题 一般认为单条队列消息差值大于等于10万时&#xff0c;就算消息队列了。 生产者生产速度远远大于消费者消费的速度 我们可以增加消费者数量&#xff0c;但是需要满足消费者数量 小于等于 队列数量。 一般消费方消费消息是IO操作&#xff0c;…

Leetcode 118. 杨辉三角

题目描述&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输…

Logstash 详细介绍、安装与使用

目录 1. Logstash 概述2. 工作原理3. 安装和配置1. 安装&#xff08;两种方法&#xff09;2. 测试运行3. 配置输入和输出 4. 使用 Grok 过滤器插件解析 Web 日志5. 使用 Geoip 过滤器插件增强数据6. 配置接收 Beats 的输入 1. Logstash 概述 Logstash 是一个具有实时管道功能的…

手把手教你苹果MacBook电脑清理内存怎么清理?

随着时间的推移&#xff0c;我们的电脑上总会不知不觉地堆积起各种各样的应用和文件。有些应用可能只是一时兴起安装&#xff0c;用过一次之后便束之高阁&#xff1b;有些文件则是工作、学习中产生的&#xff0c;但随着时间的推移已经变得毫无用处。这些不常用的应用和无用文件…

自己写的whoami

一、代码 #include<stdio.h> #include<stdlib.h> #include<proc/readproc.h> int main() {struct PROCTAB *pt;struct proc_t *p;char *cmd;ptmalloc(sizeof(struct PROCTAB));pmalloc(sizeof(struct proc_t));ptopenproc(0x0028);while(readproc(pt,p)!NUL…

C++ :内存管理 newdelete

目录 内存区域划分 C的动态内存的管理方式 new new的基本使用方法 【注意事项】 delete 【注意】 new和delete操作自定义类型 operator new 和 operator delete 【关于自定义类型new申请内存】 【原理】 【调用顺序】 【连续开辟空间问题】 malloc/free和…

数据结构 -- 第1章 绪论

1.1.3 起泡排序 局部有序与整体有序 在由一组整数组成的序列A[0, n - 1]中&#xff0c;满足A[i - 1] ≤ A[i]的相邻元素称作顺序的&#xff1b;否则是逆序的。 有序序列中每一对相邻元素都是顺序的&#xff0c;所有相邻元素均顺序的序列&#xff0c;也必然整体有序。 扫描交…

Profinet转CC-LINK网关功能与配置方法

CC-LINK转Profinet网关&#xff08;XD-PNCR20&#xff09;支持CC-Link系统&#xff0c;采用一种开放式架构的工业现场总线协议&#xff0c;允许不同厂商的设备依此协议进行通信。由于其良好的兼容性&#xff0c;CC-Link广泛使用在在制造产业中的机器控制或程序控制中&#xff0…

第十四届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A \mathrm{A} A : 特殊日期试题 B: 与或异或试题 C : \mathrm{C}: C: 平均试题 D: 棋盘试题 E : \mathrm{E}: E: 互质数的个数试题 F: 阶乘的和试题 G: 小蓝的旅行计划试题 H: 太阳试题 I: 高塔试题 J \mathrm{J} J : 反异或 01 串 发现…

怎么把mp4转换成amv格式?如何下载amv格式视频?

MP4&#xff08;MPEG-4 Part 14&#xff09;是一种通用的视频文件格式&#xff0c;广泛用于多媒体应用。作为MPEG-4标准的一部分&#xff0c;MP4以其卓越的压缩性能、出色的视频质量和广泛的兼容性成为当前最流行的视频格式之一。 AMV文件格式的介绍 AMV文件格式起源于中国公司…

day2-C++

1>自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() 代码&#…

Synchronized的锁升级流程

1.步骤 无锁->偏向锁->轻量级锁->重量级锁 2.原因 第一步&#xff1a;无锁 现在有一个共享资源&#xff0c;还没有线程拥有它呢&#xff0c;所以也就不加锁&#xff0c;所以现在就是无锁状态 第二步&#xff1a;轻量级锁 这时候&#xff0c;来了一个线程A&#xf…

python备份库

个人简介 &#x1f468;&#x1f3fb;‍&#x1f4bb;个人主页&#xff1a;九黎aj &#x1f3c3;&#x1f3fb;‍♂️幸福源自奋斗,平凡造就不凡 &#x1f31f;如果文章对你有用&#xff0c;麻烦关注点赞收藏走一波&#xff0c;感谢支持&#xff01; &#x1f331;欢迎订阅我的…

【MIT 6.S081】2020, 实验记录(8),Lab: locks

目录 Task 1&#xff1a;Memory allocator (moderate)</font>Task 2&#xff1a;Buffer cache (hard)</font> Task 1&#xff1a;Memory allocator (moderate) 这个任务就是练习将一把大锁拆分为多个小锁&#xff0c;同时可以更加深入地理解 memory allocator 运行…

镭雕机:如何利用激光技术实现高质量的产品标记

镭雕机是一种利用激光技术实现高质量产品标记的设备。它通过激光束在各种不同的物质表面进行精确的打标&#xff0c;可以产生永久性的标记效果&#xff0c;这些标记不仅精美&#xff0c;而且具有高度的精度和清晰度。以下是镭雕机如何利用激光技术实现高质量产品标记的详细过程…

【LeetCode】84. 柱状图中最大的矩形(困难)——代码随想录算法训练营Day60

题目链接&#xff1a;84. 柱状图中最大的矩形 题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,…

<Senior High School Math>: inequality question

( 1 ) . o m i t (1). omit (1).omit ( 2 ) . ( a 2 − b 2 ) ( x 2 a 2 − y 2 b 2 ) ( x 2 y 2 ) − ( a 2 y 2 b 2 b 2 x 2 a 2 ) ≤ x 2 y 2 − 2 x y ( x − y ) 2 (2). (a^2-b^2)(\frac{x^2}{a^2} - \frac{y^2}{b^2})(x^2y^2)-(\frac{a^2y^2}{b^2}\frac{b^2x^2}{a^…

指针的函数传参的详细讲解(超详细)

如果对指针基础知识已经有可以直接跳到 函数的指针传参与解引用&#xff0c;哪里不明白可以评论&#xff0c;随时解答。 目录 所以就有了一句话&#xff1a;指针就是地址&#xff0c;地址就是指针 对于指针在C语言中&#xff0c;指针类型就是数据类型&#xff0c;是给编译器…