.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 ...
随机推荐
- 第十四篇:JavaScript基础
一.CSS内容补充之position 10.position:fixed:固定div在页面的一个位置: top:0; right:0; left:0; position:absolute + rela ...
- spring boot 手动value和自动注入配置的区别[五]
前言 前面两篇中,写道我们注入配置的方式,是通过是注解的方式完成,如下: @ConfigurationProperties(prefix ="person") 这意味着: 我们写一 ...
- 云原生之在kubernetes集群下部署mysql应用
一.Mysql介绍 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库.MySQL是一种开源的关系型数据库管理系统,可将数据保存在不同的表中,而不是将所有数据放在一个大的仓库内,从而 ...
- deepspeed 训练多机多卡报错 ncclSystemError Last error
最近在搞分布式训练大模型,踩了两个晚上的坑今天终于爬出来了 我们使用 2台 8*H100 遇到过 错误1 10.255.19.85: ncclSystemError: System call (e.g ...
- 最最最简单使用Docker部署Wordpress
普通Docker部署 这种方式我用过,但是总体来说是比较麻烦的.但是可以简单说一下流程,总体流程如下: 安装Docker环境 拉取Wordpress镜像,运行镜像 拉取MySql镜像,运行镜像 Wor ...
- drf——基于apiview写过滤、排序和分页
基于APIView带过滤和排序 from rest_framework.views import APIView from .models import Book from .serializer i ...
- 阿里云2020上云采购季,你的ECS买好了吗?
阿里云2020上云采购季,超级品类日,天天有爆款. 今日爆款推荐:云服务器. 重磅推荐两款,限时抢购. 新品共享型s6: 企业级共享型n4: 想看更多云产品,来阿里云采购季: https://www. ...
- 一文说清linux system load
简介:双十一压测过程中,常见的问题之一就是load 飙高,通常这个时候业务上都有受影响,比如服务rt飙高,比如机器无法登录,比如机器上执行命令hang住等等.本文就来说说,什么是load,load是 ...
- [FE] Quasar BEX 预览版指南
BEX(Browser Extension)是 Quasar 基于同一套代码允许编译成浏览器扩展来运行,支持 Firefox & Chrome. 截止目前(2019/12/25), bex 模 ...
- C语言的指针不能与数组之前的内存进行比较
标准允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较,但是不允许与指向数组第一个元素之前的那个内存位置的指针进行比较. 案例一 #define DATAMAX 5 int ...