首页 > 其他分享 >Excel导入、导出库:ExcelKit

Excel导入、导出库:ExcelKit

时间:2023-02-28 11:55:06浏览次数:75  
标签:Sheet 读取 Excel 导出 导入 context ExcelKit Converter

Excel导入、导出库:ExcelKit

仓库地址:https://github.com/AdvanceOpen/ExcelKit.Sample

ExcelKit

Excel导入导出套件,支持百万级(几百万亦可)数据导出和读取(由于Excel原因,此处仅限xlsx)而不占用多少内存,方便易用的方法让导入导出更易使用 支持.Net Core,docker,win下皆可使用,包采用的是.Net Standard2.1

使用方式:Nuget安装:Install-Package ExcelKit

**重要提示:如果另外安装了NPOI,请使用NPOI2.4.1版本;已增加Web项目使用示例,可直接运行


ExcelKitAttribute详解:

Code:字段编码,如Name、Age; 读取时不指定Code默认使用字段名

Desc:字段描述[必指定],对应Excel列头中的文本,如 姓名、地址,

AllowNull:字段是否允许为空,一般用于读取

Converter:转换器[导出时],组件中提供了常用的转换器,如需自定义,则继承自IExportConverter并实现方法

ConverterParam:转换器辅助参数[导出时],导出时使用,如日期格式化导出,导出保留的小数位等;如果是字符串,则多个参数使用|分隔

Sort:字段顺序[导出时],导出和读取都可能用到

Width:列宽[导出时],指定Excel列宽度

Align:对齐方式[导出时],指定Excel列中的文本对齐方式

FontColor:字体颜色[导出时],指定Excel列中的字体颜色,枚举项

ForegroundColor:前景色[导出时],指定Excel列的填充色,枚举项

HeadRowFrozen:是否启用表头行冻结[导出时]

HeadRowFilter:是否启用表头行筛选[导出时]

IsIgnore:是否完全忽略

IsOnlyIgnoreRead:是否仅读取时忽略

IsOnlyIgnoreWrite:是否仅导出时忽略



Converter详解:

Converter为内置的接口IExportConverter,主要是为了导出使用;目前提供了单泛型参数,双泛型参数的版本。使用者可以根据接口实现自己的Converter。 程序内部提供了常用的Converter,命名空间为:ExcelKit.Core.Infrastructure.Converter ,内置如下:

  • BoolConverter(导出后显示为:是 否)
  • DateTimeFmtConverter(日期格式化Converter,如需自定义日期格式,需指定ConverterParam,使用详见下方示例)
  • DecimalPointDigitConverter(小数类Converter,如需指定保留几位小数,需指定ConverterParam,使用详见下方示例)
  • EnumConverter(枚举Converter,需要在枚举上方打上此特性[System.ComponentModel.Description(“用户类型”)],导出时就会根据指定的描述展示对应的文字,如果枚举加了可空,则使用时Converter = typeof(EnumConverter<UserStatusEnum?>))
  • EnumerableConverter(集合类Converter,如字段定义为public List SkuSellRegion { get; set; }则上方Converter = typeof(EnumerableConverter),导出后会自动拆分为字符串,以,分隔的长文本)

1.导出

  • 支持并发多Sheet导出
  • 单Sheet最大数据量为1048200
  • 可直接保存到本地或者生成Excel信息
  • 支持导出时自动拆分Sheet,默认达到1048200时,超过的数据会自动用 _{number}向后自动拆分Sheet,也可在CreateSheet时自定义单Sheet大小
  • 导出流程为:创建Excel文件 -> 创建Sheet -> 为某个Sheet追加数据 -> 保存或生成Excel信息
  • 多Sheet导出时,一定注意创建的Sheet名称,后面AppendData需要指定Sheet名称,两边要一致。
  • 并发导出时,一个任务对应一个Sheet

1.1 泛型类型

public class UserDto

{

[ExcelKit(Desc = "账号", Width = 20, IsIgnore = false, Sort = 20, Align = TextAlign.Right, FontColor = DefineColor.LightBlue)]

public string Account { get; set; }

[ExcelKit(Desc = "昵称", Width = 50, Sort = 10, FontColor = DefineColor.Rose, ForegroundColor = DefineColor.LemonChiffon)]

public string Name { get; set; }

[ExcelKit(Desc = "金额", Width = 20, Sort = 10, Converter = typeof(DecimalPointDigitConverter), ConverterParam = 2)]

public decimal Money { get; set; } = 20;

[ExcelKit(Desc = "创建时间", Width = 50, Sort = 10, Converter = typeof(DateTimeFmtConverter), ConverterParam = "yyyy-MM-dd")]

public DateTime CreateDate { get; set; } = DateTime.Now;

}

using  (var context = ContextFactory.GetWriteContext("测试导出文件"))

{

   Parallel.For(1, 4, index =&gt;

{

      var sheet = context.CrateSheet&lt;UserDto&gt;($"Sheet{index}");

 for  (int i = 0; i &lt;  1000000; i++)

 {

          sheet.AppendData&lt;UserDto&gt;($"Sheet{index}", new UserDto { Account = $"{index}-{i}-2010211", Name = $"{index}-{i}-用户", CreateDate = DateTime.Now, Money = Convert.ToDouble(i)  });

 }

});

   filePath = context.Save();

   Console.WriteLine($"文件路径:{filePath}");

}

1.2 动态字段类型

using  (var context = ContextFactory.GetWriteContext("测试导出文件"))

{

   var sheet = context.CrateSheet("Sheet1", new List&lt;ExcelKitAttribute&gt;()

{

new  ExcelKitAttribute(){ Code = "Account", Desc = "账号",Width=60  },

new  ExcelKitAttribute(){ Code = "Name", Desc = "昵称"  }

}, 5);

for  (int i = 0; i &lt;  10; i++)

{

       sheet.AppendData("Sheet1", new Dictionary&lt;string, object&gt;()

{

{"Account", $"{i}-2010211"  }, {"Name", $"{i}-用户用户"  }

});

}

   filePath = context.Save();

   Console.WriteLine($"文件路径:{filePath}");

}

2.读取

  • 读取主要是按照Sheet索引(默认从1开始)或者Sheet名称(默认Sheet1)
  • 目前仅支持单Sheet读取,多Sheet同时读取暂未加入
  • 此方式读取时,读取成功的数据在SucData中,读取一行返回一行,故不像一次性全部读取出来那般占内存
  • 对于读取失败的数据,ReadXXXOptions中有 FailData ,会返回读取失败的源数据及失败相关信息,方便记录及导出到新的Excel中
  • FailData仅仅是读取Excel失败或者转换为目标数据失败才会进FailData,在SucData中的函数本身如果抛错不会进入FailData
  • ReadXXXOptions中的DataStartRow(默认从1开始)和DataEndRow(可空不传则读完)代表读取的数据条数位置,不配置采用默认值
  • ReadRowsOptions仅仅是读取行数据,数据返回的是一行,没有对应的Key,默认情况下,空单元格会被直接忽略,返回的行数据都是有值的,当需要返回包含空的单元格时,配置ReadEmptyCell为true,同时指定Excel的列信息ColumnHeaders数组,里面的元素为”A” “B” “C”等,即表头列信息,Excel中可看到

2.1 读取行(默认按照Sheet索引读取,此处为读取第一个Sheet)

var context = ContextFactory.GetReadContext();

context.ReadRows("测试导出文件.xlsx", new  ReadRowsOptions()

{

SucData = (rowdata, rowindex) =&gt;

{

   Console.WriteLine(JsonConvert.SerializeObject(rowdata));

}

});

2.2 读取行(可指定Sheet名称或者Sheet索引,此处指定按照Sheet名称读取)

var context = ContextFactory.GetReadContext();

context.ReadRows("测试导出文件.xlsx", new  ReadRowsOptions()

{

 ReadWay = ReadWay.SheetName,

SucData = (rowdata, rowindex) =&gt;

{

   Console.WriteLine(JsonConvert.SerializeObject(rowdata));

}

});

2.3 泛型读取Sheet

var context = ContextFactory.GetReadContext();

context.ReadSheet&lt;UserDto&gt;("测试导出文件.xlsx", new ReadSheetOptions&lt;UserDto&gt;()

{

SucData = (rowdata, rowindex) =&gt;

{

   Console.WriteLine(JsonConvert.SerializeObject(rowdata));

}

});

2.4 动态读取Sheet

var context = ContextFactory.GetReadContext();

context.ReadSheet("测试导出文件.xlsx", new  ReadSheetDicOptions()

{

DataEndRow = 10,

ExcelFields = new  (string field, ColumnType type, bool allowNull)[]

{

("账号",ColumnType.String,false)),("昵称",ColumnType.String,false))

},

SucData = (rowdata, rowindex) =&gt;

{

   Console.WriteLine(JsonConvert.SerializeObject(rowdata));

}

});

转自:Excel导入、导出库:ExcelKit - huihuiyule - 博客园 (cnblogs.com)

标签:Sheet,读取,Excel,导出,导入,context,ExcelKit,Converter
From: https://www.cnblogs.com/angelzheng/p/17163532.html

相关文章

  • sas 多个sheet页导入
     1.sql读取sheet名太长的也可导入procsql; connecttoexcel(path="文件路径"); createtablebook1as select*fromconnectiontoexcel(select......
  • excel使用笔记
    excel在办公中必不可少,熟练使用对工作帮助很大。文章目录​​打开多个excel文档慢​​​​选择​​​​选择整个范围​​​​选取有数据的整个范围​​​​选中到底部​​​......
  • excel 根据某单元格的值设置整行颜色(条件格式)
    场景任务排期的时候,优先级不同,设置成为不同的背景色,看起来直观很多。操作过程假设单元格内容为如下:需求1高需求2中需求3低需求4不做需求5完成框选作用区域(就是所有文......
  • navicat从备份文件导入sql
    场景接别人的一个项目bilibili,只有​​.psc​​文件(navicat备份文件)。该如何导入呢?解决方案新建数据库bilibili,双击打开数据库。还原备份从这种直接把数据导入到库里。......
  • springboot集成easyexcel(阿里)
    poi比较占用内存。easyexcel性能优化不少,值得一看。pom.xml中添加:<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.6</......
  • idea导入tomcat8源码搭建源码调试环境
    从apachetomcat下载tomcat8源码1.下载到源码后,tomcat默认使用ant作为包管理工具,本地调试时创建pom.xml,手动创建一个pom.xml放入源码根目录<?xmlversion="1.0"encodin......
  • 利用网页表格导出EXCEL表格加线框及表格内部间距的问题
    输出时使用类似HTML表格形式:<tableborder="1"cellspacing="0"cellpadding="0"><tr><td>...<td><td><tablewidth="100%"border="1"cellspacing="0"cellpadding="2">&......
  • DataTable的行列转换及多表头HTML表格转Excel
    需要解决的问题:1、根据数据库中多个不同字段名称的以行形式表现的数据转为以列形式展现的数据;2、HTML多表头数据展示,做到数据“一个萝卜一个坑”,并求出多条数据的合计数据。......
  • 多文件夹下Excel指定列的提取合并
    一、前言大家好,我是崔艳飞,工作中经常遇到,从多个文件夹下的Excel中,提取指定列,再合并成新的Excel。几个文件夹还能应付,但要是有成百上千个文件夹,你就要哭了,本文针对此问题,实......
  • 软件开发流程-路飞项目需求- pip永久换源-虚拟环境-路飞项目前后端创建-包导入-后端项
    目录软件开发流程-路飞项目需求-pip永久换源-虚拟环境-路飞项目前后端创建-包导入-后端项目调整目录今日内容概要今日内容详细1软件开发流程2路飞项目需求3pip永久换源......