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帮助类的更多相关文章

  1. NPOI 帮助类

    NPOI 帮助类 代码实现了来自于互联网 using System; using System.Data; using System.IO; using System.Text; using NPOI ...

  2. NPOI帮助类

    /// <summary> /// NPOI导出帮助类 /// </summary> public class NPOIHelper { /// <summary> ...

  3. NPOI Excel类

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using NPOI.HSSF.Us ...

  4. NPOI操作类

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  5. NPOI帮助类(Excel转DataTable、DataTable转Excel)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using NPOI.SS. ...

  6. NPOI工具类

    NPOI调用方法 DataTable dt = new DataTable(); Dictionary<string, string> header = new Dictionary< ...

  7. 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)

    很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...

  8. 总结一下工作中遇到的NPOI以及在ASP.NET MVC中的使用

    1.前言 相信大家在工作中经常要遇到一些导入导出Execl操作.学习贵在分享,分享使人快乐,园子里的前辈已经有很多好的文章,鄙人也是能力有限,在这里把这些好的文章总结,方便以后再工作中使用. NPOI ...

  9. .NET使用NPOI组件将数据导出Excel

    .NPOI官方网站:http://npoi.codeplex.com/ 可以到此网站上去下载最新的NPOI组件版本 2.NPOI在线学习教程(中文版): http://www.cnblogs.com/ ...

随机推荐

  1. cocos jsb工程转html 工程

    1 CCBoot.js prepare方法:注掉下面这行,先加载moduleConfig中的脚本后加载user脚本 //newJsList = newJsList.concat(jsList); // ...

  2. android windows的一些item属性

    <item name="android:windowFrame">@null</item> :Dialog的windowFrame框为无 <item ...

  3. PHP + Redis 队列实战

    环境 centos6.5 PHP5.3 Redis安装 #yum install redis 1.redis配置认证密码 #vi /etc/redis.conf requirepass mypass ...

  4. Oracle 12c的可插拔数据库PDB

    1. 默认安装之后会有一个可插拔数据库:pdborcl 2. 启动根容器: [oracle@eric ~]$ export ORACLE_SID=orcl [oracle@eric ~]$ sqlpl ...

  5. [C#.Net]KeyDown(KeyUp)和KeyPress的区别

    在keyDown事件里使用keyValue:在keyPress事件里使用keyChar. keyValue转换keyChar:(char)keyValue 验证只有数字和backSpace e.han ...

  6. [C#.Net]判断文件是否被占用的两种方法

    今天开发产线测试Tool时发现日志文件会几率性的被占用,上网浏览找到最简单的代码(API或者FileStream),在这里抛砖引玉下. 第一种方法:API using System.IO; using ...

  7. kbmmw 中的进程管理小工具

    kbmmw 5.6.20 发布了,本版本带来一个小功能,就是可以在kbmmw 应用里面建立和管理进程, 虽然你可以直接调用windows api 做类似的事情,但是kbmmw 里面简化了操作,也加强了 ...

  8. Java语法基础课 动手动脑

    1.枚举类型 它的每个具体值都引用一个特定的对象.相同的值则引用同一个对象. 枚举类型不是java原有数据类型 2.为什么double类型的数值进行运算得不到“数学上精确”的结果? 我们给出的数值,在 ...

  9. 2018.10.26 NOIP训练 数数树(换根dp)

    传送门 换根dpdpdp傻逼题好像不好码啊. 考虑直接把每一个二进制位拆开处理. 先dfsdfsdfs出每个点到1的异或距离. 然后分类讨论一波: 如果一个点如果当前二进制位到根节点异或距离为1,那么 ...

  10. matlab 向量场线积分

    syms t x y z F x=cos(t); y=sin(t); z=*sin(t)^-; F=[x^*y , (/)*x^,x*y ] ; %场函数 V=[diff(x,t),diff(y,t) ...