NPOI 的使用姿势
NPOI 正确的使用姿势
主要是需要注意公式和日期类型的单元格的读取。
/// <summary>
/// 打开指定 Excel 文件
/// </summary>
/// <param name="fileName">指定要打开的文件名</param>
/// <returns>Excel 文件对应的单元格</returns>
internal ExcelDataGrid Open(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName))
{
throw new ArgumentNullException(nameof(fileName));
}
var sourceFs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
var extensions = new FileInfo(fileName).Extension;
IWorkbook workbook = null;
IFormulaEvaluator evaluator = null;
if (extensions.Equals(".xlsx", StringComparison.CurrentCultureIgnoreCase))
{
workbook = new XSSFWorkbook(sourceFs);
evaluator = new XSSFFormulaEvaluator(workbook);
}
else if (extensions.Equals(".xls", StringComparison.CurrentCultureIgnoreCase))
{
workbook = new HSSFWorkbook(sourceFs);
evaluator = new HSSFFormulaEvaluator(workbook);
}
else
{
throw new ArgumentException("不支持的文件扩展名");
}
var sheet = workbook.GetSheetAt(0);
var result = new ExcelDataGrid();
var rowIndex = -1;
var columnIndex = -1;
foreach (var row in GetRows(sheet))
{
rowIndex++;
columnIndex = -1;
foreach (var column in row.Cells)
{
columnIndex++;
result[rowIndex, columnIndex] = GetCellValue(evaluator, column);
}
}
sourceFs.Close();
workbook.Close();
return result;
}
/// <summary>
/// 获取<see cref="ISheet"/>中的行
/// </summary>
/// <param name="sheet">指定获取的<see cref="ISheet"/>实例</param>
/// <returns><see cref="ISheet"/>中的行</returns>
private IEnumerable<IRow> GetRows(ISheet sheet)
{
if (sheet == null)
{
throw new ArgumentNullException(nameof(sheet));
}
var enumerator = sheet.GetEnumerator();
while (enumerator.MoveNext())
{
yield return enumerator.Current as IRow;
}
}
/// <summary>
/// 获取单元格的显示值
/// </summary>
/// <param name="evaluator">单元格公式计算器</param>
/// <param name="cell">单元格</param>
/// <returns>单元格显示的值</returns>
private string GetCellValue(IFormulaEvaluator evaluator, ICell cell)
{
switch (cell.CellType)
{
case CellType.Blank:
return string.Empty;
case CellType.Boolean:
return cell.BooleanCellValue.ToString();
case CellType.Error:
return cell.ErrorCellValue.ToString();
case CellType.Formula:
cell = evaluator.EvaluateInCell(cell);
return GetCellValue(evaluator, cell);
case CellType.Numeric:
if (DateUtil.IsCellDateFormatted(cell))
return cell.DateCellValue.ToString();
else
return cell.NumericCellValue.ToString();
case CellType.String:
return cell.StringCellValue;
case CellType.Unknown:
return "Unknow";
default:
return "";
}
}
NPOI 的使用姿势的更多相关文章
- ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据
ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...
- c# NPOI 导出23万条记录耗时12秒
先上测试代码: string connectionString = "Server=localhost;Initial Catalog=******;User ID=sa;Password= ...
- .NET Core使用NPOI导出复杂Word详解
前言: 最近使用NPOI做了个导出Word文档的功能,关于使用.NET Core 导出Word文档的方式有很多.最终我为什么选择了NPOI来实现了这个功能,首先是NPOI是一个开源,免费且容易上手的第 ...
- .NET Core使用NPOI导出复杂,美观的Excel详解
前言: 这段时间一直专注于数据报表的开发,当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦.客户要求要导出优雅,美观的Excel文档格式的来展示数据,当时的第一想法就是使用NPOI开源库来做 ...
- .NET Core 首例 Office 开源跨平台组件(NPOI Core)
前言 最近项目中,需要使用到 Excel 导出,找了一圈发现没有适用于 .NET Core的,不依赖Office和操作系统限制的 Office 组件,于是萌生了把 NPOI 适配并移植到 .NET C ...
- 免费高效实用的.NET操作Excel组件NPOI(.NET组件介绍之六)
很多的软件项目几乎都包含着对文档的操作,前面已经介绍过两款操作文档的组件,现在介绍一款文档操作的组件NPOI. NPOI可以生成没有安装在您的服务器上的Microsoft Office套件的Excel ...
- C#通过NPOI操作Excel
参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-post.html http://www.yuanjiaocheng.net/w ...
- 基于NPOI的Excel数据导入
从Excel导入数据最令人头疼的是数据格式的兼容性,特别是日期类型的兼容性.为了能够无脑导入日期,折腾了一天的NPOI.在经过测试确实可以导入任意格式的合法日期后,写下这篇小文,与大家共享.完整代码请 ...
- NPOI导出Excel
using System;using System.Collections.Generic;using System.Linq;using System.Text;#region NPOIusing ...
随机推荐
- p12文件和mobileprovision文件
http://www.cnblogs.com/YouXianMing/p/3848188.html https://www.jianshu.com/p/73c430f468e8 https://blo ...
- 树莓派与Linux系统之间文件传输
最近因为要学习Python,于是把放在家里接了一年灰的树莓派又给搜出来了,刚买那会也捣鼓了好一阵子, 基本操作都学会了,但现在又忘光了,只能又从头开始搞了,首先第一个要解决的是怎么把文件从电脑传输到树 ...
- rpm和yum模拟安装
在更新安装包之前,我们可能会想做一个测试运行,换句话说,模拟而不是实际安装更新的包,以确定在安装之前是否有任何需要处理的问题. 以测试更新openssh2为例: yum update openssh2 ...
- @ResponseBody ResponseEntity
1.产生疑问 我们知道,如果在 Controller 的某个方法上加上 @ResponseBody 注解,那么你就能拿到 json 数据. 如果你只是知道这么用,那么你应该知道 ResponseBod ...
- Freemaker Replace函数的正则表达式运用
replace(param1,param2,param3) param1 正则表达式:param2 将匹配的字符替换成指定字符:param3 模式 param3 参数如下 模式 i r m ...
- vue 封装组件
props 接收数据 props对象里面 键值 是对改数据的 数据类型 的规定.做了规范,使用者就只能传输指定类型的数据,否则报警告 先根据要求写出完整的代码,再一一用参数实现组件封装 这里试着封装一 ...
- ArcGIS为面要素生成邻接矩阵
1. 分析工具——>空间关联 使用注意,直接用FID似乎不可行,我是自己重新建了一个"String"字段,值用字段计算器从FID获取过来.之后按照上面的步骤才成功. 实现主要 ...
- ORACLE——EXTRACT() 截取日期时间的函数使用
1.截取日期的 年: --使用方法 EXTRACT(YEAR FROM DATE) SQL> SELECT EXTRACT( YEAR FROM SYSDATE ) FROM DUAL; --结 ...
- httpappplication 和 httpmodule 的理解(转载,写的很好)
第一部分:转载自Artech IIS与ASP.NET管道 ASP.NET管道 以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET ...
- Complex类的实现
#include<iostream> #include<cmath> using namespace std; class complex{ public: complex() ...