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 ...
随机推荐
- SNMP 优秀帖子
-- 比较系统的描述http://blog.sina.com.cn/s/blog_54837cf301011607.html 几个SNMP官方网站(搜索关键字:snmplibrary C#):http ...
- Redis的数据结构之Set
存储Set 和List类型不同的是,Set集合中不允许出现重复的元素 Set可包含的最大元素数量是4294967295 存储set常用命令: 添加/删除元素 获取集合中的元素 集合中的差集运算 集合中 ...
- [LeetCode] 45. Jump Game II_ Hard tag: Dynamic Programming
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- MATLAB算术运算符和常用函数
1 算术运算符 Matlab中的算术运算符按优先级由高到低为: (1) ^ 幂 (2) * 乘 / 右除(正常除) ...
- Android Profiler内存检测
Memory Profiler是Android Profiler中的一个组件,Android Profiler是Android3.0用来替换之前Android Monitor的观察工具,主要用来观察内 ...
- 22.C# 事件
1.事件的含义 事件和异常类似,它们都是由对象引发,我们可以提供代码处理它们.不同的是事件并没有使用try ..catch这样的代码来处理,而是要订阅事件,订阅的含义是提供一段事件处理代码,在事件发送 ...
- Xamarin 自定义 ToolbarItem 溢出菜单实现(Popover/Popup) 弹出下拉效果
使用 Rg.Plugins.Popup 插件 1. 新建 PopupMenu.xaml <?xml version="1.0" encoding="utf-8& ...
- 【Python学习】yield send我就说这么多
C#的yield已经忘得差不多了.又遇到python的yield.iterator def testYield(): print 'yield1' m = yield 1 print 'm =' , ...
- py001
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple -------------------------------- ...
- vue-cli教程
转:https://jspang.com/post/vue-cli2.html#toc-5ca