Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/weihanli/weihanli.npoi
NPOI Extensions, excel/csv importer/exporter for IEnumerable<T>/DataTable, fluentapi(great flexibility)/attribute configuration
https://github.com/weihanli/weihanli.npoi
csharp csv dataset datatable excel fluentapi npoi office weihanli
Last synced: 2 days ago
JSON representation
NPOI Extensions, excel/csv importer/exporter for IEnumerable<T>/DataTable, fluentapi(great flexibility)/attribute configuration
- Host: GitHub
- URL: https://github.com/weihanli/weihanli.npoi
- Owner: WeihanLi
- License: apache-2.0
- Created: 2018-01-15T01:57:48.000Z (almost 7 years ago)
- Default Branch: dev
- Last Pushed: 2024-12-11T15:57:54.000Z (10 days ago)
- Last Synced: 2024-12-13T00:05:42.249Z (9 days ago)
- Topics: csharp, csv, dataset, datatable, excel, fluentapi, npoi, office, weihanli
- Language: C#
- Homepage: https://weihanli.github.io/WeihanLi.Npoi/index.html
- Size: 2.18 MB
- Stars: 203
- Watchers: 13
- Forks: 53
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
README
# WeihanLi.Npoi
[![WeihanLi.Npoi](https://img.shields.io/nuget/v/WeihanLi.Npoi)](https://www.nuget.org/packages/WeihanLi.Npoi/)
[![WeihanLi.Npoi Latest](https://img.shields.io/nuget/vpre/WeihanLi.Npoi)](https://www.nuget.org/packages/WeihanLi.Npoi/absoluteLatest)
## Build Status
[![Azure Pipeline Build Status](https://weihanli.visualstudio.com/Pipelines/_apis/build/status/WeihanLi.WeihanLi.Npoi?branchName=dev)](https://weihanli.visualstudio.com/Pipelines/_build/latest?definitionId=13&branchName=dev)
[![Github Build Status](https://github.com/WeihanLi/WeihanLi.Npoi/actions/workflows/dotnetcore.yml/badge.svg)](https://github.com/WeihanLi/WeihanLi.Npoi/actions/workflows/dotnetcore.yml)
## Intro
[NPOI](https://github.com/tonyqus/npoi) extensions based on target framework `netstandard2.0`.
There're a lot of useful extensions for you, core features are as follows:
- mapping a excel file data to a `DataTable` or `List`/`IEnumerable`
- export `IEnumerable` or `DataTable` data to Excel file or Excel file bytes or even write excel file stream to your stream
- export `IEnumerable` or `DataTable` data to csv file or bytes.
- custom configuration/mappings by Attribute or FluentAPI(inspired by [FluentExcel](https://github.com/Arch/FluentExcel/))
- great flexibility by fluent InputFormatter/OutputFormatter/ColumnInputFormatter/ColumnOutputFormatter/CellReader### GetStarted
1. Export list/dataTable to Excel/csv
``` csharp
var entities = new List();
entities.ToExcelFile(string excelPath);
entities.ToExcelBytes(ExcelFormat excelFormat);
entities.ToCsvFile(string csvPath);
entities.ToCsvBytes();
```2. Read Excel/csv to List
``` csharp
// read excel first sheet content to List
var entityList = ExcelHelper.ToEntityList(string excelPath);// read excel first sheet content to IEnumerable
var entityList = ExcelHelper.ToEntities(string excelPath);// read excel sheetIndex sheet content to a List
// you can custom header row index via sheet attribute or fluent api HasSheet
var entityList1 = ExcelHelper.ToEntityList(string excelPath, int sheetIndex);var entityList2 = CsvHelper.ToEntityList(string csvPath);
var entityList3 = CsvHelper.ToEntityList(byte[] csvBytes);
```3. Read Excel/csv to DataTable
``` csharp
// read excel to dataTable directly,by default read the first sheet content
var dataTable = ExcelHelper.ToDataTable(string excelPath);// read excel workbook's sheetIndex sheet to dataTable directly
var dataTableOfSheetIndex = ExcelHelper.ToDataTable(string excelPath, int sheetIndex);// read excel workbook's sheetIndex sheet to dataTable,custom headerRowIndex
var dataTableOfSheetIndex = ExcelHelper.ToDataTable(string excelPath, int sheetIndex, int headerRowIndex);// read excel to dataTable use mapping relations and settings from typeof(T),by default read the first sheet content
var dataTableT = ExcelHelper.ToDataTable(string excelPath);// read csv file data to dataTable
var dataTable1 = CsvHelper.ToDataTable(string csvFilePath);
```More Api here:
### Define Custom Mapping and settings
1. Attributes
Add `ColumnAttribute` on the property of the entity which you used for export or import
Add `SheetAttribute` on the entity which you used for export or import,you can set the `StartRowIndex` on your need(by default it is `1`)
for example:
``` csharp
public class TestEntity
{
[Column("Id")]
public int PKID { get; set; }[Column("Bill Title")]
public string BillTitle { get; set; }[Column("Bill Details")]
public string BillDetails { get; set; }[Column("CreatedBy")]
public string CreatedBy { get; set; }[Column("CreatedTime")]
public DateTime CreatedTime { get; set; }
}public class TestEntity1
{
[Column("Username")]
public string Username { get; set; }[Column(IsIgnored = true)]
public string PasswordHash { get; set; }[Column("Amount")]
public decimal Amount { get; set; } = 1000M;[Column("WechatOpenId")]
public string WechatOpenId { get; set; }[Column("IsActive")]
public bool IsActive { get; set; }
}
```1. FluentApi (Recommended)
You can use FluentApi for great flexibility
for example:
``` csharp
var setting = FluentSettings.For();
// ExcelSetting
setting.HasAuthor("WeihanLi")
.HasTitle("WeihanLi.Npoi test")
.HasDescription("WeihanLi.Npoi test")
.HasSubject("WeihanLi.Npoi test");setting.HasSheetConfiguration(0, "SystemSettingsList", true);
// setting.HasSheetConfiguration(1, "SystemSettingsList", 1, true);// setting.HasFilter(0, 1).HasFreezePane(0, 1, 2, 1);
setting.Property(_ => _.SettingId)
.HasColumnIndex(0);setting.Property(_ => _.SettingName)
.HasColumnTitle("SettingName")
.HasColumnIndex(1);setting.Property(_ => _.DisplayName)
.HasOutputFormatter((entity, displayName) => $"AAA_{entity.SettingName}_{displayName}")
.HasInputFormatter((entity, originVal) => originVal.Split(new[] { '_' })[2])
.HasColumnTitle("DisplayName")
.HasColumnIndex(2);setting.Property(_ => _.SettingValue)
.HasColumnTitle("SettingValue")
.HasColumnIndex(3);setting.Property(_ => _.CreatedTime)
.HasColumnTitle("CreatedTime")
.HasColumnIndex(4)
.HasColumnWidth(10)
.HasColumnFormatter("yyyy-MM-dd HH:mm:ss");setting.Property(_ => _.CreatedBy)
.HasColumnInputFormatter(x => x += "_test")
.HasColumnIndex(4)
.HasColumnTitle("CreatedBy");setting.Property(x => x.Enabled)
.HasColumnInputFormatter(val => "Enabled".Equals(val))
.HasColumnOutputFormatter(v => v ? "Enabled" : "Disabled");setting.Property("HiddenProp")
.HasOutputFormatter((entity, val) => $"HiddenProp_{entity.PKID}");setting.Property(_ => _.PKID).Ignored();
setting.Property(_ => _.UpdatedBy).Ignored();
setting.Property(_ => _.UpdatedTime).Ignored();
```### More
see some articles here:
more usage:
Get a workbook
``` csharp
// load excel workbook from file
var workbook = LoadExcel(string excelPath);// prepare a workbook accounting to excelPath
var workbook = PrepareWorkbook(string excelPath);// prepare a workbook accounting to excelPath and custom excel settings
var workbook = PrepareWorkbook(string excelPath, ExcelSetting excelSetting);// prepare a workbook whether *.xls file
var workbook = PrepareWorkbook(bool isXls);// prepare a workbook whether *.xls file and custom excel setting
var workbook = PrepareWorkbook(bool isXlsx, ExcelSetting excelSetting);
```Rich extensions
``` csharp
List ToEntityList([NotNull]this IWorkbook workbook)DataTable ToDataTable([NotNull]this IWorkbook workbook)
ISheet ImportData([NotNull] this ISheet sheet, DataTable dataTable)
int ImportData([NotNull] this IWorkbook workbook, IEnumerable list,
int sheetIndex)int ImportData([NotNull] this ISheet sheet, IEnumerable list)
int ImportData([NotNull] this IWorkbook workbook, [NotNull] DataTable dataTable,
int sheetIndex)ToExcelFile([NotNull] this IEnumerable entityList,
[NotNull] string excelPath)int ToExcelStream([NotNull] this IEnumerable entityList,
[NotNull] Stream stream)byte[] ToExcelBytes([NotNull] this IEnumerable entityList)
int ToExcelFile([NotNull] this DataTable dataTable, [NotNull] string excelPath)
int ToExcelStream([NotNull] this DataTable dataTable, [NotNull] Stream stream)
byte[] ToExcelBytes([NotNull] this DataTable dataTable)
byte[] ToExcelBytes([NotNull] this IWorkbook workbook)
int WriteToFile([NotNull] this IWorkbook workbook, string filePath)
object GetCellValue([NotNull] this ICell cell, Type propertyType)
T GetCellValue([NotNull] this ICell cell)
void SetCellValue([NotNull] this ICell cell, object value)
byte[] ToCsvBytes(this IEnumerable entities, bool includeHeader)
ToCsvFile(this IEnumerable entities, string filePath, bool includeHeader)
void ToCsvFile(this DataTable dt, string filePath, bool includeHeader)
byte[] ToCsvBytes(this DataTable dt, bool includeHeader)
```
### Samples
- [dotnetcore sample](https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/samples/DotNetCoreSample/Program.cs)
- [More samples in unit test](https://github.com/WeihanLi/WeihanLi.Npoi/blob/dev/test/WeihanLi.Npoi.Test/ExcelTest.cs)
- [Guide posts](https://weihanli.github.io/WeihanLi.Npoi/articles/intro.html)### Acknowledgements
- Thanks for the contributors and users for this project
- Thanks JetBrains for the open source ReSharper license### Contact
Contact me: