.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 ...
随机推荐
- Linux&Ubuntu之更换服务器
前言 更换网卡.主板上的板载网卡.主板是服务器硬件维护的常规操作.通常新换(板载)网卡的MAC地址会变更,而部分服务器更换主板也会导致板载网卡MAC地址变化.由于CAS(Ubuntu)系统会将新MAC ...
- c# 泛型原理(旧)
前言 说起泛型可能很多人刚才看到的时候肯定会说牛逼啊,厉害啊,这东西少写了不少代码,我总结了泛型的一个优点,那就是少写代码,额,专业点吧. 优点:增加代码的重复利用率,代码重用. 先不讲原理吧,来讲下 ...
- Canvas图形编辑器-数据结构与History(undo/redo)
Canvas图形编辑器-数据结构与History(undo/redo) 这是作为 社区老给我推Canvas,于是我也学习Canvas做了个简历编辑器 的后续内容,主要是介绍了对数据结构的设计以及His ...
- java调用QQ影音进行截图
import java.awt.Graphics2D; import java.awt.Image; import java.awt.Robot; import java.awt.Toolkit; i ...
- js 实现双指缩放
前言随着智能手机.平板电脑等触控设备的普及,交互方式也发生了改变.相对于使用鼠标和键盘进行交互的电脑,触控设备可以直接使用手指进行交互,而且基本上都支持多点触控.多点触控最常见的操作莫过于双指缩放了. ...
- 在Windows电脑上快速运行AI大语言模型-Llama3
概述 近期 Meta 发布了最新的 Llama3 模型,并开源了开源代码.Meta Llama 3 现已推出 8B 和 70B 预训练和指令调整版本,可支持广泛的应用程序. 并且 Llama 3 在语 ...
- 将 Terraform 生态粘合到 Kubernetes 世界
简介: 为了更高效,统一的管理云服务,IaC 思想近年来盛行,其中 Terrafrom 更是成功得到了几乎所有的云厂商的采纳和支持.以 Terrafrom 模型为核心的云服务 IaC 生态已经形成.然 ...
- 深度解析|基于 eBPF 的 Kubernetes 一站式可观测性系统
简介:阿里云 Kubernetes 可观测性是一套针对 Kubernetes 集群开发的一站式可观测性产品.基于 Kubernetes 集群下的指标.应用链路.日志和事件,阿里云 Kubernete ...
- 阿里云 VPC 内网性能测试最佳实践
简介:本文介绍了在阿里云 VPC 内网执行性能测试的方法.相较于传统的公网性能测试,VPC 内网性能测试完全在客户 VPC 环境进行,无需暴露服务到公网,安全性更高,灵活性更强. 作者:风起 背景 ...
- 殷浩详解DDD:领域层设计规范
简介: 在一个DDD架构设计中,领域层的设计合理性会直接影响整个架构的代码结构以及应用层.基础设施层的设计.但是领域层设计又是有挑战的任务,特别是在一个业务逻辑相对复杂应用中,每一个业务规则是应该放在 ...