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. HTTP协议是什么

    1.http全称Hypertext Trsnsfer Protocol超文本传输协议 2.最初发明是用来在浏览器和web服务器之间传输超文本信息的 3.泛义上属于应用层的协议   ,很多其他应用(比如 ...

  2. java 多态的深入理解

    简单来说 : 多态 能够很好的解决代码耦合性的问题 考虑这样一个场景 有个人 买了辆捷达汽车 .这个系统应该如何设计呢? public class JettaCar { public void run ...

  3. ListView 删除item删除不了的问题解决办法

    下面的方法是删除不了item的: Integer pos = Integer.valueOf(msg.getBody().toString()); adapter.getList().remove(p ...

  4. ubuntu下安装maven(转载)

    下载maven http://maven.apache.org/download.cgi 解压 tar -xzvf apache-maven-3.0.5-bin.tar.gz 配置环境变量 sudo ...

  5. SpringMVC作用域传值几种方式

    一.SpringMVC 作用域传值的几种方式 1  使用原生Servlet 1.1 在 HandlerMethod 参数中添加作用域对象 1.1.1 ServletContext不能在方法参数中获取, ...

  6. 52.tableViewCell重用机制避免重复显示问题

    表刷新超出页面显示的内容会重复出现 -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSInd ...

  7. Python图表绘制:matplotlib绘图库入门(转)

    matplotlib 是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图.而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中. 它的文档相当完备,并 ...

  8. yum 安装报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"

    [root@venn09 ~]# yum install -y vim Loaded plugins: fastestmirror Could not retrieve mirrorlist http ...

  9. 2018.12.30 bzoj3028: 食物(生成函数)

    传送门 生成函数模板题. 我们直接把每种食物的生成函数列出来: 承德汉堡:1+x2+x4+...=11−x21+x^2+x^4+...=\frac 1{1-x^2}1+x2+x4+...=1−x21​ ...

  10. 2018.11.01 NOIP训练 木棒分组(搜索+剪枝)

    传送门 测试搜索的时候状态定义错了233. 我们把木棒从大到小排序. 然后保证每一组搜到的木棒出现的长度是从大到小递减的. 直接定义现在搜的木棒从什么位置开始,当前这一组的总长度,之前几组的总长度. ...