mirror of
https://gitee.com/dotnetchina/MiniExcel.git
synced 2024-12-02 03:47:41 +08:00
Migrated repository
docs | ||
drafts | ||
samples/xlsx | ||
src | ||
tests | ||
.gitattributes | ||
.gitignore | ||
appveyor.yml | ||
LICENSE.md | ||
README.md |
Features
Avoid large file OOM(out of memoery)
by IEnumerable LazyStep By Step getting one row cells
not until all rows read in memory
e.g: Comparison of MiniExcel Query and ExcelDataReader/EPPlus/ClosedXml of reading large Xlsx File- Support .NET Standard 2.0/.NET 4.6/.NET 5
- Mini (Less than 100KB) and without any third party library dependencies
- Like Dapper dynamic/type mapping query
- Create excel by AnonymousType/DapperRows/List/Array/Set/Enumrable/DataTable/Dictionary
- Dapper query style
Installation
You can install the package from NuGet
Release Notes
Please Check Release Notes
Execute a query and map the results to a strongly typed IEnumerable
public class UserAccount
{
public Guid ID { get; set; }
public string Name { get; set; }
public DateTime BoD { get; set; }
public int Age { get; set; }
public bool VIP { get; set; }
public decimal Points { get; set; }
}
using (var stream = File.OpenRead(path))
var rows = stream.Query<UserAccount>();
Execute a query and map it to a list of dynamic objects without using head
- dynamic key is
A.B.C.D..
MiniExcel | 1 |
---|---|
Github | 2 |
using (var stream = File.OpenRead(path))
{
var rows = stream.Query().ToList();
Assert.Equal("MiniExcel", rows[0].A);
Assert.Equal(1, rows[0].B);
Assert.Equal("Github", rows[1].A);
Assert.Equal(2, rows[1].B);
}
Execute a query with first header row
Column1 | Column2 |
---|---|
MiniExcel | 1 |
Github | 2 |
using (var stream = File.OpenRead(path))
{
var rows = stream.Query(useHeaderRow:true).ToList();
Assert.Equal("MiniExcel", rows[0].Column1);
Assert.Equal(1, rows[0].Column2);
Assert.Equal("Github", rows[1].Column1);
Assert.Equal(2, rows[1].Column2);
}
Query Mapping Type
Create Excel Xlsx file by ICollection Anonymous Type/Datatable
var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx");
MiniExcel.SaveAs(path, new[] {
new { Column1 = "MiniExcel", Column2 = 1 },
new { Column1 = "Github", Column2 = 2}
});
Datatable:
var path = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.xlsx");
var table = new DataTable();
{
table.Columns.Add("Column1", typeof(string));
table.Columns.Add("Column2", typeof(decimal));
table.Rows.Add("MiniExcel", 1);
table.Rows.Add("Github", 2);
}
MiniExcel.SaveAs(path, table);
Create File Result :
Column1 | Column2 |
---|---|
MiniExcel | 1 |
Github | 2 |
SaveAs Stream
using (var stream = new FileStream(path, FileMode.CreateNew))
{
stream.SaveAs(values);
}
Query First
using (var stream = File.OpenRead(path))
Assert.Equal("HelloWorld", stream.QueryFirst().A);
performance: MiniExcel/ExcelDataReader/ClosedXML/EPPlus
SQLite & Dapper Large Size File
SQL Insert Avoid OOM (out of memory)
using (var connection = new SQLiteConnection(connectionString))
{
connection.Open();
using (var transaction = connection.BeginTransaction())
using (var stream = File.OpenRead(path))
{
var rows = stream.Query();
foreach (var row in rows)
connection.Execute("insert into T (A,B) values (@A,@B)", new { row.A, row.B }, transaction: transaction);
transaction.Commit();
}
}
ASP.NET Core 3.1 or MVC 5 Download Excel Xlsx API Demo
public class ExcelController : Controller
{
public IActionResult Download()
{
var values = new[] {
new { Column1 = "MiniExcel", Column2 = 1 },
new { Column1 = "Github", Column2 = 2}
};
var stream = new MemoryStream();
stream.SaveAs(values);
return File(stream,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"demo.xlsx");
}
}
TODO
Please Check Project · todo
Limitations and caveats
- Custom datetime/timespan format can't mapping to DateTime/TimeSpan type
- Same column name use last right one
- Must be a non-abstract type with a public parameterless constructor
Reference
- Query logic learn from ExcelDataReader
- Query Style learn from StackExchange/Dapper