NET npoi帮助类
nuget添加npoi
/// <summary>
/// npoi帮助类
/// </summary>
public static class NpoiHelper
{
/// <summary>
/// 根据文件路径,获取表格集合
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static List<DataTable> GetDataTableList(string filePath)
{
var list = new ConcurrentBag<DataTable>(); using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
var isExcel2007 = filePath.IsExcel2007();
var workBook = stream.GetWorkbook(isExcel2007);
var sheetIndexList = new List<int>();
for (int i = ; i < workBook.NumberOfSheets; i++) sheetIndexList.Add(i);
Parallel.ForEach(sheetIndexList, new ParallelOptions
{
MaxDegreeOfParallelism =
}, (source, state, index) =>
{
try
{
if (!workBook.IsSheetHidden(source))
list.Add(GetDataTableToY(workBook, source));
}
catch (NPOI.POIFS.FileSystem.OfficeXmlFileException nopiEx)
{
Console.WriteLine($"SheetIndex:{index}\t\tException:{nopiEx.Message}");
}
catch (Exception e)
{
Console.WriteLine(e);
}
});
} return list.ToList();
} /// <summary>
/// 根据sheet索引,把数据转换为datatable,以Y轴为准
/// </summary>
/// <param name="workBook"></param>
/// <param name="sheetIndex">sheet索引</param>
/// <param name="validRowIndex"></param>
/// <returns></returns>
public static DataTable GetDataTableToY(IWorkbook workBook, int sheetIndex, int validRowIndex = )
{
var sheet = workBook.GetSheetAt(sheetIndex);
var table = new DataTable(sheet.SheetName); // 设置最大列,默认为1
var maxColumnNum = ;
// 不是有效列集合,连续超过三行不读取后续所有列
var noValidColumnList = new List<int>();
// 列:按照列把数据填充到datatable中,防止无限列出现
for (var columnIndex = ; columnIndex < maxColumnNum; columnIndex++)
{
var column = new DataColumn();
table.Columns.Add(column);
noValidColumnList.Add(columnIndex);
// 列中所有数据都是null为true
var isAllEmpty = true;
// 行
for (var rowIndex = ; rowIndex < sheet.LastRowNum; rowIndex++)
{
if (columnIndex == ) table.Rows.Add(table.NewRow());
var itemRow = sheet.GetRow(rowIndex);
if (itemRow == null) continue;
maxColumnNum = maxColumnNum < itemRow.LastCellNum ? itemRow.LastCellNum : maxColumnNum;
// 把格式转换为utf-8
var itemCellValue = itemRow.GetValue(columnIndex).FormatUtf8String();
if (!itemCellValue.IsNullOrWhiteSpace()) isAllEmpty = false;
table.Rows[rowIndex][columnIndex] = itemCellValue;
} // 当前列有值
if (!isAllEmpty)
noValidColumnList.Clear();
// 连续空白列超过三行 或 有空白行且当前行为最后一行
else if (noValidColumnList.Count > || (noValidColumnList.Count > && columnIndex == maxColumnNum - ))
{
for (var i = noValidColumnList.Count - ; i >= ; i--)
table.Columns.RemoveAt(noValidColumnList[i]);
break;
}
}
// 得到一个sheet中有多少个合并单元格
int sheetMergeCount = sheet.NumMergedRegions;
for (var i = ; i < sheetMergeCount; i++)
{
// 获取合并后的单元格
var range = sheet.GetMergedRegion(i);
sheet.IsMergedRegion(range);
var cellValue = string.Empty;
for (var mRowIndex = range.FirstRow; mRowIndex <= range.LastRow; mRowIndex++)
{
for (var mColumnIndex = range.FirstColumn; mColumnIndex <= range.LastColumn; mColumnIndex++)
{
var itemCellValue = table.Rows[range.FirstRow][range.FirstColumn].FormatUtf8String();
if (!itemCellValue.IsNullOrWhiteSpace())
cellValue = itemCellValue;
table.Rows[mRowIndex][mColumnIndex] = cellValue;
}
}
} return table;
} #region 公共方法 /// <summary>
/// 判断excel是否是2007版本:.xls
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static bool IsExcel2007(this string filePath)
{
return Path.GetExtension(filePath)?.ToLower() == ".xls";
} /// <summary>
/// 根据版本创建IWorkbook对象
/// </summary>
/// <param name="stream"></param>
/// <param name="isExcel2007"></param>
/// <returns></returns>
public static IWorkbook GetWorkbook(this Stream stream, bool isExcel2007)
{
return isExcel2007 ? (IWorkbook)new HSSFWorkbook(stream) : new XSSFWorkbook(stream);
}
/// <summary>
/// 获取XSSFRow的值(全部统一转成字符串)
/// </summary>
/// <param name="row"></param>
/// <param name="index"></param>
/// <returns></returns>
public static string GetValue(this IRow row, int index)
{
var rowCell = row.GetCell(index);
return GetValueByCellStyle(rowCell, rowCell?.CellType);
} /// <summary>
/// 根据单元格的类型获取单元格的值
/// </summary>
/// <param name="rowCell"></param>
/// <param name="type"></param>
/// <returns></returns>
public static string GetValueByCellStyle(ICell rowCell, CellType? type)
{
string value = string.Empty;
switch (type)
{
case CellType.String:
value = rowCell.StringCellValue;
break;
case CellType.Numeric:
if (DateUtil.IsCellInternalDateFormatted(rowCell))
{
value = DateTime.FromOADate(rowCell.NumericCellValue).ToString();
}
else if (DateUtil.IsCellDateFormatted(rowCell))
{
value = DateTime.FromOADate(rowCell.NumericCellValue).ToString();
}
//有些情况,时间搓?数字格式化显示为时间,不属于上面两种时间格式
else if (rowCell.CellStyle.GetDataFormatString() == null)
{
value = DateTime.FromOADate(rowCell.NumericCellValue).ToString();
}
else if (rowCell.CellStyle.GetDataFormatString().Contains("$"))
{
value = "$" + rowCell.NumericCellValue.ToString();
}
else if (rowCell.CellStyle.GetDataFormatString().Contains("¥"))
{
value = "¥" + rowCell.NumericCellValue.ToString();
}
else if (rowCell.CellStyle.GetDataFormatString().Contains("¥"))
{
value = "¥" + rowCell.NumericCellValue.ToString();
}
else if (rowCell.CellStyle.GetDataFormatString().Contains("€"))
{
value = "€" + rowCell.NumericCellValue.ToString();
}
else
{
value = rowCell.NumericCellValue.ToString();
}
break;
case CellType.Boolean:
value = rowCell.BooleanCellValue.ToString();
break;
case CellType.Error:
value = ErrorEval.GetText(rowCell.ErrorCellValue);
break;
case CellType.Formula:
// TODO: 是否存在 嵌套 公式类型
value = GetValueByCellStyle(rowCell, rowCell?.CachedFormulaResultType);
break;
}
return value;
} #endregion }
NET npoi帮助类的更多相关文章
- NPOI 帮助类
NPOI 帮助类 代码实现了来自于互联网 using System; using System.Data; using System.IO; using System.Text; using NPOI ...
- NPOI帮助类
/// <summary> /// NPOI导出帮助类 /// </summary> public class NPOIHelper { /// <summary> ...
- NPOI Excel类
using System;using System.Collections.Generic;using System.Linq;using System.Text;using NPOI.HSSF.Us ...
- NPOI操作类
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...
- NPOI帮助类(Excel转DataTable、DataTable转Excel)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.SS. ...
- NPOI工具类
NPOI调用方法 DataTable dt = new DataTable(); Dictionary<string, string> header = new Dictionary< ...
- 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)
很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...
- 总结一下工作中遇到的NPOI以及在ASP.NET MVC中的使用
1.前言 相信大家在工作中经常要遇到一些导入导出Execl操作.学习贵在分享,分享使人快乐,园子里的前辈已经有很多好的文章,鄙人也是能力有限,在这里把这些好的文章总结,方便以后再工作中使用. NPOI ...
- .NET使用NPOI组件将数据导出Excel
.NPOI官方网站:http://npoi.codeplex.com/ 可以到此网站上去下载最新的NPOI组件版本 2.NPOI在线学习教程(中文版): http://www.cnblogs.com/ ...
随机推荐
- (转贴)fusionCharts属性参考API
一.FusionCharts的分类 关于FusionCharts的基本介绍我就不在这里浪费篇幅了,想了解的朋友自己去www.baigoogedu.com里面找吧.我就说说FusionCharts的官方 ...
- 使用xtrabackup备份innodb引擎的数据库
innodb引擎的数据库可以使用mysqldump备份,如果表很大几十个G甚至上百G,显示用mysqldump备份会非常慢.然后使用xtrabackup 可以很快的在线备份innodb数据库.Inno ...
- canvas 实现贪吃蛇游戏
var canvas = document.getElementById('canvas'); var cxt = canvas.getContext('2d'); // 定时器 var timer; ...
- Ubuntu18.04网易云音乐双击运行
18.04 之后发现无法运行网易云音乐,后发现必须给sudo权限还能运行,但是每次都打开终端sudo很麻烦.看网上很多人是修改什么什么文件,,,没仔细看. 我觉得,恩,,写行脚本,双击运行也可行且很方 ...
- TOMCAT内存溢出及大小调整的实现方法
一.tomcat内存设置问题 收藏 在使用Java程序从数据库中查询大量的数据或是应用服务器(如tomcat.jboss,weblogic)加载jar包时会出现java.lang.OutOfMemor ...
- 2019.01.14 codeforces685B. Kay and Snowflake(树形dp)
传送门 题意简述:给出一棵树,求每个子树的重心. 首先通过画图可以观察出一个性质,我们从叶子结点向根节点递推重心的话重心的位置是不会下降的. 然后由于一个点的重心要么是自己,要么在重儿子子树内,因此如 ...
- TCP/IP协议(4):网络层
网络层上有IP.ICMP.IGMP等协议. 1.IP地址 在OSI模型中,三层网络层负责IP地址,IP数据报帧头中的源地址和目的地址就是指IP地址.IPV4类型IP地址为32位4个字节,IPV6类型I ...
- s5-12 RIP
什么是RIP? RIP:Routing information protocol,路由选择信息协议 1988年,RFC1058 RIPv1:有类的路由选择协议 RIPv2:无类的路由选择协议,支持CI ...
- UVa 11762 Race to 1 (数学期望 + 记忆化搜索)
题意:给定一个整数 n ,然后你要把它变成 1,变换操作就是随机从小于等于 n 的素数中选一个p,如果这个数是 n 的约数,那么就可以变成 n/p,否则还是本身,问你把它变成 1 的数学期望是多少. ...
- .net Json JavaScriptSerializer JsonHelper类
结合.net 的JavaScriptSerializer 类实现Json数据处理 调用1: Model.Users m = BLL.UsersBLL.GetUserById(Convert.ToInt ...