C# .NET6 .NET CORE EXCEL 导入和导出
使用NPOI导入.xlsx遇到“EOF in header”报错,网上找好很多方法,没解决,最后换成EPPlus.Core导入。
导出默认是.xls。
NPOI 操作类:
using NPOI.HPSF;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Collections;
using System.Data; namespace CommonUtils
{
/// <summary>
/// Excel操作相关
/// </summary>
public class ExcelHelper
{
#region 读取Excel到DataTable /// <summary>
/// 读取Excel文件的内容
/// </summary>
/// <param name="path"></param>
/// <param name="sheetName">工作表名称</param>
/// <returns></returns>
public static DataTable GetDataTable(string path, string sheetName = null)
{
if (path.ToLower().EndsWith(".xlsx"))
return EPPlusHelper.WorksheetToTable(path, sheetName); using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
{
return GetDataTable(file, sheetName);
}
} /// <summary>
/// 从Excel文件流读取内容
/// </summary>
/// <param name="file"></param>
/// <param name="sheetName"></param>
/// <returns></returns>
public static DataTable GetDataTable(Stream file, string contentType, string sheetName = null)
{
//载入工作簿
IWorkbook workBook = null;
if (contentType == "application/vnd.ms-excel")
{
workBook = new HSSFWorkbook(file);
}
else if (contentType == "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
workBook = new XSSFWorkbook(file);
}
else
{
try
{
workBook = new HSSFWorkbook(file);
}
catch
{
try
{
workBook = new XSSFWorkbook(file);
}
catch
{
throw new Exception("文件格式不被支持!");
}
}
} //获取工作表(sheetName为空则默认获取第一个工作表)
var sheet = string.IsNullOrEmpty(sheetName) ? workBook.GetSheetAt(0) : workBook.GetSheet(sheetName);
//生成DataTable
if (sheet != null)
return GetDataTable(sheet);
else
throw new Exception(string.Format("工作表{0}不存在!", sheetName ?? "")); } /// <summary>
/// 读取工作表数据
/// </summary>
/// <param name="sheet"></param>
/// <returns></returns>
private static DataTable GetDataTable(ISheet sheet)
{
IEnumerator rows = sheet.GetRowEnumerator(); DataTable dt = new DataTable(sheet.SheetName); //默认第一个非空行为列头
bool isTitle = true;
//标题行索引
int titleRowIndex = 0;
//默认列头后的第一个数据行,作为DataTable列类型的依据
IRow firstDataRow = null; while (rows.MoveNext())
{
IRow row = null;
if (rows.Current is XSSFRow)//*.xlsx
{
row = (XSSFRow)rows.Current;
}
else//*.xls
{
row = (HSSFRow)rows.Current;
} //是否空行
if (IsEmptyRow(row))
{
if (isTitle)
{
titleRowIndex++;
}
continue;
}
else
{
if (isTitle)
{
firstDataRow = sheet.GetRow(titleRowIndex + 1);//默认列头后的第一个数据行,作为DataTable列类型的依据
}
} DataRow dr = dt.NewRow(); for (int i = 0; i < row.LastCellNum; i++)
{
var cell = row.GetCell(i); if (isTitle)
{
var firstDataRowCell = firstDataRow.GetCell(i);
if (firstDataRowCell != null || cell != null)
{
dt.Columns.Add(cell.StringCellValue.Trim());
}
else
{
dt.Columns.Add(string.Format("未知列{0}", i + 1));
}
}
else
{
if (i > dt.Columns.Count - 1) break;
dr[i] = GetCellValue(cell, dt.Columns[i].DataType);
} }
if (!isTitle && !IsEmptyRow(dr, dt.Columns.Count))
{
dt.Rows.Add(dr);
}
isTitle = false;
} return dt;
} /// <summary>
/// 获取单元格值
/// </summary>
/// <param name="cell"></param>
/// <param name="colType"></param>
/// <returns></returns>
private static object GetCellValue(ICell cell, Type colType)
{
if (cell == null || cell.ToString().ToUpper().Equals("NULL") || cell.CellType == NPOI.SS.UserModel.CellType.Blank)
return DBNull.Value; object val = null;
switch (cell.CellType)
{
case NPOI.SS.UserModel.CellType.Boolean:
val = cell.BooleanCellValue;
break;
case NPOI.SS.UserModel.CellType.Numeric:
var cellValueStr = cell.ToString().Trim();
if (cellValueStr.IndexOf('-') >= 0 || cellValueStr.IndexOf('/') >= 0)
{
DateTime d = DateTime.MinValue;
DateTime.TryParse(cellValueStr, out d);
if (!d.Equals(DateTime.MinValue)) val = cellValueStr;
}
if (val == null)
{
decimal vNum = 0;
decimal.TryParse(cellValueStr, out vNum);
val = vNum;
}
break;
case NPOI.SS.UserModel.CellType.String:
val = cell.StringCellValue;
break;
case NPOI.SS.UserModel.CellType.Error:
val = cell.ErrorCellValue;
break;
case NPOI.SS.UserModel.CellType.Formula:
default:
val = "=" + cell.CellFormula;
break;
} return val;
} /// <summary>
/// 检查是否空数据行
/// </summary>
/// <param name="dr"></param>
/// <returns></returns>
private static bool IsEmptyRow(DataRow dr, int colCount)
{
bool isEmptyRow = true;
for (int i = 0; i < colCount; i++)
{
if (dr[i] != null && !dr[i].Equals(DBNull.Value))
{
isEmptyRow = false;
break;
}
}
return isEmptyRow;
} /// <summary>
/// 检查是否空的Excel行
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
private static bool IsEmptyRow(IRow row)
{
bool isEmptyRow = true;
for (int i = 0; i < row.LastCellNum; i++)
{
if (row.GetCell(i) != null)
{
isEmptyRow = false;
break;
}
} return isEmptyRow;
}
#endregion #region 生成DataTable到Excel /// <summary>
/// 生成Excel数据到路径
/// </summary>
/// <param name="data"></param>
/// <param name="path"></param>
public static void GenerateExcel(DataTable data, string path)
{
var workBook = GenerateExcelData(data);
//保存至路径
using (FileStream fs = File.OpenWrite(path)) //打开一个xls文件,如果没有则自行创建,如果存在则在创建时不要打开该文件!
{
workBook.Write(fs); //向打开的这个xls文件中写入mySheet表并保存。
}
} /// <summary>
/// 生成Excel数据到字节流
/// </summary>
/// <param name="data"></param>
/// <param name="path"></param>
public static byte[] GenerateExcel(DataTable data)
{
var workBook = GenerateExcelData(data);
using (MemoryStream ms = new MemoryStream())
{
workBook.Write(ms);
return ms.GetBuffer();
}
} /// <summary>
/// 生成DataTable到Excel
/// </summary>
/// <param name="data"></param>
/// <param name="path"></param>
private static IWorkbook GenerateExcelData(DataTable data)
{
//创建工作簿
var workBook = new HSSFWorkbook();
//生成文件基本信息
GenerateSummaryInformation(workBook);
//创建工作表
var sheet = workBook.CreateSheet("Sheet1");
//创建标题行
if (data != null && data.Columns.Count > 0)
{
IRow row = sheet.CreateRow(0);
for (int i = 0; i < data.Columns.Count; i++)
{
var cell = row.CreateCell(i);
cell.SetCellValue(data.Columns[i].ColumnName);
}
}
//创建数据行
if (data != null && data.Rows.Count > 0)
{
for (int rowIndex = 1; rowIndex <= data.Rows.Count; rowIndex++)
{
IRow row = sheet.CreateRow(rowIndex);
for (int colIndex = 0; colIndex < data.Columns.Count; colIndex++)
{
var cell = row.CreateCell(colIndex);
var cellValue = data.Rows[rowIndex - 1][colIndex];
switch (data.Columns[colIndex].DataType.Name)
{
case "Byte":
case "Int16":
case "Int32":
case "Int64":
case "Decimal":
case "Single":
case "Double":
double doubleVal = 0;
if (cellValue != null && !cellValue.Equals(System.DBNull.Value))
{
double.TryParse(cellValue.ToString(), out doubleVal);
cell.SetCellValue(doubleVal);
}
break;
case "DateTime":
DateTime dtVal = DateTime.MinValue;
if (cellValue != null && !cellValue.Equals(System.DBNull.Value))
{
DateTime.TryParse(cellValue.ToString(), out dtVal);
if (dtVal != DateTime.MinValue)
{
cell.SetCellValue(dtVal);
}
}
break;
default:
if (cellValue != null && !cellValue.Equals(System.DBNull.Value))
{
cell.SetCellValue(cellValue.ToString());
}
break;
} }
}
} return workBook;
} /// <summary>
/// 创建文档的基本信息(右击文件属性可看到的)
/// </summary>
/// <param name="workBook"></param>
private static void GenerateSummaryInformation(HSSFWorkbook workBook)
{
DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company = "Company"; SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
si.Subject = "Subject";//主题
si.Author = "Author";//作者 workBook.DocumentSummaryInformation = dsi;
workBook.SummaryInformation = si;
} #endregion
}
}
EPPlus.Core 工具类:
//using EPPlus.Extensions;
using OfficeOpenXml;
using System.Data; namespace CommonUtils
{
/// <summary>
/// 使用 EPPlus 第三方的组件读取Excel
/// </summary>
public class EPPlusHelper
{
private static string GetString(object obj)
{ if (obj == null)
return ""; return obj.ToString(); } /// <summary>
///将指定的Excel的文件转换成DataTable (Excel的第一个sheet)
/// </summary>
/// <param name="fullFielPath">文件的绝对路径</param>
/// <returns></returns>
public static DataTable WorksheetToTable(string fullFielPath, string sheetName = null)
{
//如果是“EPPlus”,需要指定LicenseContext。
//EPPlus.Core 不需要指定。
//ExcelPackage.LicenseContext = LicenseContext.NonCommercial; FileInfo existingFile = new FileInfo(fullFielPath); ExcelPackage package = new ExcelPackage(existingFile);
ExcelWorksheet worksheet = null; if (string.IsNullOrEmpty(sheetName))
{
//不传入 sheetName 默认取第1个sheet。
//EPPlus 索引是0
//EPPlus.Core 索引是1
worksheet = package.Workbook.Worksheets[1];
}
else
{
worksheet = package.Workbook.Worksheets[sheetName];
} if (worksheet == null)
throw new Exception("指定的sheetName不存在"); return WorksheetToTable(worksheet);
} /// <summary>
/// 将worksheet转成datatable
/// </summary>
/// <param name="worksheet">待处理的worksheet</param>
/// <returns>返回处理后的datatable</returns>
public static DataTable WorksheetToTable(ExcelWorksheet worksheet)
{
//获取worksheet的行数
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 = 1; i <= rows; i++)
{
if (i > 1)
dr = dt.Rows.Add(); for (int j = 1; j <= cols; j++)
{
//默认将第一行设置为datatable的标题
if (i == 1)
dt.Columns.Add(GetString(worksheet.Cells[i, j].Value));
//剩下的写入datatable
else
dr[j - 1] = GetString(worksheet.Cells[i, j].Value);
}
}
return dt;
}
}
}
使用:
// See https://aka.ms/new-console-template for more information
using CommonUtils;
using System.Data; Console.WriteLine("Hello, World!"); try
{
string dir = AppContext.BaseDirectory;
//2003
string fullName = Path.Combine(dir, "测试excel.xls");
DataTable dt = ExcelHelper.GetDataTable(fullName); Console.WriteLine("Hello, World!" + dir);
//2007
string fullName2 = Path.Combine(dir, "测试excel.xlsx");
//dt = ExcelHelper.GetDataTable(fullName);
//DataTable dt2 = ExcelHelper.GetDataTable(fullName2, "sheetf");
DataTable dt2 = ExcelHelper.GetDataTable(fullName2); string saveFullName = Path.Combine(dir, "save_excel.xls");
//ExcelHelper2.ExportExcelByMemoryStream(saveFullName, dt2);
string saveFullName2 = Path.Combine(dir, "save_excel2.xls");
ExcelHelper.GenerateExcel(dt2, saveFullName2); Console.WriteLine("Hello, World!" + dir);
}
catch (Exception ex)
{
Console.WriteLine("ex:" + ex.Message);
} Console.ReadKey();

源码:https://gitee.com/runliuv/mypub/tree/master/NetCoreProj,使用vs2022 。
C# .NET6 .NET CORE EXCEL 导入和导出的更多相关文章
- Asp .Net Core Excel导入和导出
ASP .Net Core使用EPPlus实现Api导入导出,这里使用是EPPlus 4.5.2.1版本,.Net Core 2.2.在linux上运行的时候需要安装libgdiplus . 下面我们 ...
- C# Excel导入、导出【源码下载】
本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图.NOPI以及C#代 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入
系列目录 前言 上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看: ASP.NET MVC5+EF6+EasyUI 后台管理系统(6 ...
- C# Excel导入、导出
本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图.NOPI以及C#代 ...
- JXLS (Excel导入、导出工具使用)
JXLS (Excel导入.导出工具使用) 1:简介: jxls是一个简单的.轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局.java中成熟的excel导出工具有p ...
- .Net Core Excel导入导出神器Npoi.Mapper
前言 我们在日常开发中对Excel的操作可能会比较频繁,好多功能都会涉及到Excel的操作.在.Net Core中大家可能使用Npoi比较多,这款软件功能也十分强大,而且接近原始编程.但是直接使用Np ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出
系列目录 昨天文章太过仓促没有补充导出的示例源码,在者当时弄到到很晚没时间做出导出功能,对阅读理解造成影响,现补充一份示例源码,顺便补充导出的功能说明,望理解 示例代码下载 https://yun ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(87)-MVC Excel导入和导出
本文示例代码下载: 链接:http://pan.baidu.com/s/1jHBdgCA 密码:hzh7 ps:Vs数据库脚本在解压目录下,修改web.config数据库链接,示例代码包含:导入,导出 ...
- winform之excel导入和导出
引用命名空间 using Microsoft.Office.Interop.Excel;DataGridView 导出到Excel public static void SaveAs(DataGr ...
- excel 导入 与 导出
Excel导入 public ActionResult Excel(HttpPostedFileBase file) { HttpPostedFileBase fi ...
随机推荐
- es实战-使用IK分词器进行词频统计
简介:通过IK分词器分词并生成词云. 本文主要介绍如何通过 IK 分词器进行词频统计.使用分词器对文章的词频进行统计,主要目的是实现如下图所示的词云功能,可以找到文章内的重点词汇.后续也可以对词进行 ...
- Kubernetes 稳定性保障手册:洞察+预案
简介: 稳定性保障是个复杂的话题,需要有效.可迭代.可持续保障集群的稳定性,系统性的方法或许可以解决该问题. 作者 | 悟鹏来源 | 阿里巴巴云原生公众号 <Kubernetes 稳定性保障手册 ...
- 支持 dotnet 6 的 dnSpy 神器版本
官方的 dnSpy 在 2021 时,由于某些吃瓜的原因 wtfsck 将 dnSpy 给 Archived 掉,在大佬被哄好之前,预计是不再更新.最新官方版本对 dotnet 6 的支持较弱,对于很 ...
- 【强化学习】Markov Decision processes【二】
目录 Markov Decision processes Markov Process Markov reward process Markov Decision processes 马尔可夫决策过程 ...
- goland配置在远程linux里运行代码开发,并debug调适
环境: windows 10 phpstudy8.1.1.3 Vmware安装centos7.6 场景 window10里goland开发,在远程linux里运行,并debug断点调适 步骤: win ...
- 鸿蒙HarmonyOS实战-ArkUI事件(手势方法)
一.手势方法 应用程序的手势操作是指在移动设备上使用手指或手势进行与应用程序交互的方式.手势操作可以包括点击.滑动.双击.捏合等动作,用于实现不同的功能和操作. HarmonyOS中常见的手势操作及其 ...
- Linux中的find
find命令在硬盘上进行文件的查找,比起whereis与locate会比较耗时. 与时间有关的选项 在Linux当中一个文件有mtime,ctime,atime,find在搜索时可以配置这3种时间. ...
- LocalDateTime 时间偏移量的处理
一.代码处理块 // 当前系统时间两年后的时间 LocalDateTime expirationTime = LocalDateTimeUtil.offset(LocalDateTime.now(), ...
- 阿克曼函数(Ackermann function)部分推导
相关题目 已知\(Ackermann function\)为 \[Ack(m,n)=\begin{cases}n+1(m=0) \\ Ack(m-1,1)(m>0,n=0) \\ Ack(m-1 ...
- C 语言编程 — 高级数据类型 — void 类型
目录 文章目录 目录 前文列表 void 类型 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> <C 语言编程 - 基本数据类型> & ...