.net core 转 excel datatable list<t> 互转 xlsx
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using Castle.Core.Internal;
using Microsoft.AspNetCore.Http;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using OfficeOpenXml; namespace Gaea.OfficeManagement
{
public static class ExcelHelper
{ public static DataTable ExcelToTable (Stream ExcelFileStream, int SheetIndex, int HeaderRowIndex)
{
ExcelPackage package = new ExcelPackage(ExcelFileStream);
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.Commercial;
ExcelWorksheet worksheet = package.Workbook.Worksheets[SheetIndex];//选定 指定页 int rows = worksheet.Dimension.End.Row;
//获取worksheet的列数
int cols = worksheet.Dimension.End.Column; DataTable dt = new DataTable(worksheet.Name);
DataRow dr = null;
for (int i = HeaderRowIndex; i <= rows; i++)
{
if (i > 1)
dr = dt.Rows.Add(); for (int j = 1; j <= cols; j++)
{
//默认将第一行设置为datatable的标题
if (i == HeaderRowIndex)
dt.Columns.Add(GetString(worksheet.Cells[i, j].Value));
//剩下的写入datatable
else
dr[j - 1] = GetString(worksheet.Cells[i, j].Value);
}
}
return dt;
} private static string GetString(object obj)
{
try
{
return obj.ToString();
}
catch (Exception ex)
{
return "";
}
} /// <summary>
/// 将excel转换为datatable
/// </summary>
/// <param name="filePaht">文件路径</param>
/// <param name="startRow">读取数据的起始行</param>
/// <returns>DataTable</returns>
public static DataTable ExcelToDataTable(IFormFile file, int startRow)
{ MemoryStream ms = new MemoryStream();
file.CopyTo(ms);
ms.Seek(0, SeekOrigin.Begin); //声明一个变量
ISheet sheet = null;
DataTable data = new DataTable();
//int startRow = 3;
try
{
//读取excel文件
//FileStream fs = new FileStream(filePaht, FileMode.Open, FileAccess.Read);
IWorkbook workbook = new XSSFWorkbook(ms);
//读取excel的第一个sheet页
sheet = workbook.GetSheetAt(0);
if (sheet != null)
{
//起始行
IRow firstRow = sheet.GetRow(startRow);
int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数
//循环添加列
for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
{
//如果导入的是端午活动的手机号码
if(startRow==1)
{
firstRow.Cells[0].SetCellType(CellType.String);
} //添加列
DataColumn column = new DataColumn(firstRow.GetCell(i).StringCellValue);
data.Columns.Add(column);
}
//最后一列的标号
int rowCount = sheet.LastRowNum;
for (int i = startRow+1; i <= rowCount; ++i)
{
IRow row = sheet.GetRow(i);
if (row == null) continue; //没有数据的行默认是null //创建行
DataRow dataRow = data.NewRow();
int index = 0;
for (int j = row.FirstCellNum; j < cellCount; ++j)
{
//填充列
dataRow[index] = row.GetCell(j)?.ToString();
index++;
}
//填充行
data.Rows.Add(dataRow);
}
}
return data;
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
return null;
}
} public static async Task<MemoryStream> ExportAsync(this DataTable table)
{
var stream = new MemoryStream(); //如果您在非商业环境中使用EPPlus
//根据Polyform非商业许可证:
ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial; using (ExcelPackage package = new ExcelPackage())
{
// add a new worksheet to the empty workbook
ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Sheet1");
//First add the headers
for (int i = 1; i <= table.Columns.Count; i++)
{
worksheet.Cells[1, i].Value = $"{(table.Columns[i - 1].Caption.IsNullOrWhiteSpace() ? table.Columns[i - 1].ColumnName : table.Columns[i - 1].Caption)}";
worksheet.Cells[1, i].Style.Font.Bold = true;
}
//worksheet.Cells[1, 1].Value = "ID";
//worksheet.Cells[1, 2].Value = "Name";
//worksheet.Cells[1, 3].Value = "Gender";
//worksheet.Cells[1, 4].Value = "Salary (in $)"; for (int i = 2; i <= table.Rows.Count; i++)
{
for (int j = 1; j <= table.Columns.Count; j++)
{
worksheet.Cells[i, j].Value = $"{table.Rows[i - 2][j - 1]}";
}
} ////Add values
//worksheet.Cells["A2"].Value = 1000;
//worksheet.Cells["B2"].Value = "Jon";
//worksheet.Cells["C2"].Value = "M";
//worksheet.Cells["D2"].Value = 5000; //worksheet.Cells["A3"].Value = 1001;
//worksheet.Cells["B3"].Value = "Graham";
//worksheet.Cells["C3"].Value = "M";
//worksheet.Cells["D3"].Value = 10000; //worksheet.Cells["A4"].Value = 1002;
//worksheet.Cells["B4"].Value = "Jenny";
//worksheet.Cells["C4"].Value = "F";
//worksheet.Cells["D4"].Value = 5000; //package.Save(); //Save the workbook.
await package.SaveAsAsync(stream); stream.Seek(0, SeekOrigin.Begin);//没这句话就格式错 return stream;
}
} public static DataTable ToDataTable<T>(this IEnumerable<T> collection)
{
var props = typeof(T).GetProperties();
var dt = new DataTable();
dt.Columns.AddRange(props.Select(p =>
{
var col = new DataColumn(p.Name, p.PropertyType); var attrdisplay = p.GetAttributes<DisplayAttribute>().FirstOrDefault();
if (attrdisplay != default)
{
if (!string.IsNullOrWhiteSpace(attrdisplay.Name))
{
col.Caption = attrdisplay.Name;
}
else if (!string.IsNullOrWhiteSpace(attrdisplay.ShortName))
{
col.Caption = $"{attrdisplay.ShortName}";
}
else if (!string.IsNullOrWhiteSpace(attrdisplay.Description))
{
col.Caption = attrdisplay.Description;
}
} var attrdisplayname = p.GetAttributes<DisplayNameAttribute>().FirstOrDefault();
if (attrdisplayname != default && !string.IsNullOrWhiteSpace(attrdisplayname.DisplayName))
{
col.Caption = $"{attrdisplayname.DisplayName}";
} var attrdesc = p.GetAttributes<DescriptionAttribute>().FirstOrDefault();
if (attrdesc != default && !string.IsNullOrWhiteSpace(attrdesc.Description))
{
col.Caption = $"{attrdesc.Description}";
} var attrcol = p.GetAttributes<ColumnAttribute>().FirstOrDefault();
if (attrcol != default && !string.IsNullOrWhiteSpace(attrcol.Name))
{
col.Caption = $"{attrcol.Name}";
} return col;
}).ToArray());
if (collection.Count() > 0)
{
for (int i = 0; i < collection.Count(); i++)
{
ArrayList tempList = new ArrayList();
foreach (PropertyInfo pi in props)
{
object obj = pi.GetValue(collection.ElementAt(i), null);
tempList.Add(obj);
}
object[] array = tempList.ToArray();
dt.LoadDataRow(array, true);
}
}
return dt;
} }
}
.net core 转 excel datatable list<t> 互转 xlsx的更多相关文章
- JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动
JavaScript日历控件开发 概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果代码地址:https://github.com/aspwebc ...
- “DataTable”是“System.Data.DataTable”和“Microsoft.Office.Interop.Excel.DataTable”之间的不明确的引用
“DataTable”是“System.Data.DataTable”和“Microsoft.Office.Interop.Excel.DataTable”之间的不明确的引用 造成这个错误的原因是,在 ...
- Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel
Asp.Net Core 导入Excel数据到Sqlite数据库并重新导出到Excel 在博文"在Asp.Net Core 使用 Sqlite 数据库"中创建了ASP.NET Co ...
- Java解析Excel工具类(兼容xls和xlsx)
依赖jar <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml&l ...
- NPOI json转Excel DataTable转Excel ,Excel转DataTable
JsonToExcel: public static void JsonToExcel(List<Dictionary<string, object>> json, strin ...
- asp.net core导入excel
接昨天的导出 导入excel内容 对比昨天导出的内容增加了一行实体属性名称作为标题行,这样到转换为实体的时候才能找到对应的属性. 导入代码 public IActionResult InportExc ...
- Asp.net Core导出Excel
本篇文章是在MVC设计模式下,基于windows系统的Excel导出 1.前台的实现不用我多说了吧,加一个a标签链接地址跳到它所调用的方法里面,可以根据当前页面的查询条件去传值,从而查询出你想要的数据 ...
- .Net Core的Excel导入
1.前台代码,layui模板 2.后台代码,后台实现 (1)导入 (2)数据验证 (3)将导入数据存储在数据库中 (4)定义保存导入数据接口 (5)接口的实现调用业务层 (6)业务层接口 (7)业务层 ...
- .net core 导出Excel(epplus 创建excel )
[Route("getopenfrequencyexcel")] [HttpGet] public IActionResult GetOpenFrequencyExcel(int ...
- ASP.NET MVC NPOI导入Excel DataTable批量导入到数据库
使用NPOI导入Excel 首先在MVC项目中导入NPOI 查询NPOI安装,排序依据,选择:最高下载量,选择第一个. 在控制器中创建ExcelController 在Index视图中写入代码: @u ...
随机推荐
- nginx重新整理——————http请求的11个阶段中的content阶段[十八]
前言 简单介绍一下content 阶段. 正文 下面介绍一下root和alias. 这个前面其实就提交过了,这里再说明一下. 功能都是一样的:将url映射为文件路径,以返回静态文件内容. 差别:roo ...
- Tencent 闲聊对话机器人接口调用,画像:设计员小白
from datetime import datetime import time import requests from hashlib import md5 from urllib import ...
- 阿里云 MSE 支持 Go 语言流量防护
简介: OpenSergo 开源项目联合 Sentinel 项目,正在制定.完善限流降级标准,方便不同语言应用通过统一控制面来实现统一的微服务治理.阿里云微服务引擎(MSE)也会逐步支持 OpenSe ...
- 数据湖揭秘—Delta Lake
简介:Delta Lake 是 DataBricks 公司开源的.用于构建湖仓架构的存储框架.能够支持 Spark,Flink,Hive,PrestoDB,Trino 等查询/计算引擎.作为一个开放 ...
- 利器解读!Linux 内核调测中最最让开发者头疼的 bug 有解了|龙蜥技术
简介:通过在Anolis 5.10 内核中增强 kfence 的功能,实现了一个线上的.精准的.可定制的内存调试解决方案. 编者按:一直持续存在内核内存调测领域两大行业难题: "内存被改& ...
- 开源 1 年半 star 破 1.2 万的 Dapr 是如何在阿里落地的?
简介: Dapr 是 2019 年 10 月微软开源的可移植.事件驱动分布式运行时,它使开发人员能够轻松地构建运行在云平台和边缘的弹性而微服务化的无状态和有状态的应用程序,从而降低基于微服务架构构建现 ...
- 用python编写向通信产品发送AT指令的程序实例
一.安装pyserial包pip install pyserial 二.实例代码 # -*- coding: utf-8 -*- import time import hashlib from ser ...
- WPF 设置 IncludePackageReferencesDuringMarkupCompilation 属性导致分析器不工作
本文记录在 WPF 项目里面设置 IncludePackageReferencesDuringMarkupCompilation 属性为 False 导致了项目所安装的分析器不能符合预期工作 设置 I ...
- dotnet 读 WPF 源代码笔记 为什么自定义的 UserControl 用户控件不能跨程序集继承
从设计上,用户控件 UserControl 就不是一个合适用来多次继承的类型,更不要说进行跨程序集继承自定义的 UserControl 用户控件.对于大部分的用户控件来说,都是采用组合现有的控件来实现 ...
- WPF 基础 2D 图形学知识 判断点是否在线段上
在知道一个使用两个点表示的线段,和另一个点,求另一个点是否在线段上 本文算法属于通用的算法,可以在 WPF 和 UWP 和 Xamarin 等上运行,基本上所有的 .NET 平台都能执行 如下图,如果 ...