最近做项目需要导入一部分数据, 导入的数据的中, 有部分的百分比数据使用的是excel 的百分比, 有部分的数据使用的是字符串形式的格式,(数据来源于不同的人统计), 格式略微有点乱, 要求导入系统的时候, 将所有百分比的数据转换成百分制的数据存储起来.

因为之前项目使用的读取excel 的组件式NPOI , 所以我也就直接使用npoi来读, 我用的NPOI是2.0的版本的, 不算太新.

常规读取的时候, 是按照下面的方式读取到ICell的

IWorkbook workbook = null;
var workbook = NPOI.SS.UserModel.WorkbookFactory.Create(fileStream);
ISheet sheet = workbook .GetSheetAt(0);
IRow firstRow = sheet.GetRow(1);
ICell cell = firstRow.GetCell(0);

  这样获取到ICell对象以后, 可以通过ICell.CellType 判断到单元格的数据类型, 从 ICell.CellStyle.DataFormat可以去到单元格的格式, 但是问题来了: CellStyle.DataFormat只能获取到一个格式的数字编码(例如186), 不能获取到具体的格式是什么(例如0.00%).

  那么需要有地方完成从格式数字编码到具体的格式之间的转换, 我从网上找了好久, 没有找到具体的方法, 后来想了想excel是xml格式的, 要不还是先从excel下手.

ok, 先把excel后缀改为.rar, 然后解压, 解压后找到\xl\styles.xml, 这个就是excel的样式文件, 打开看看, 发现数据格式就在最开始的地方, 是个一个<numFmt numFmtId="178" formatCode="0.000%"/>的数值, 蛮清楚, 不过总不能自己去硬解码样式吧, 这样也太土了点, 想想先按下不表, 还是从NPOI 下手.

后来咨询了下同事, 同事也没有干过这种事情, 不过给了点先线索, 他用过一个检查单元格是否是时间格式的方法, 在NPOI的UserModel命名空间下, 不过他用的那个方法是用来检查excel 的内置格式的, 不包含自定义格式.  我一想也许获取样式的代码在其他命名空间下,  好吧, 开始翻dll吧(苦逼, 没有找到api, 直接用vs看dll 的命名空间下有哪些类)

  好在NPOI不是很大, 翻到第二个dll就找打了线索, NPOI.OOXML.dll下有个类 NPOI.XSSF.UserModel.XSSFDataFormat, 这个类有个方法NPOI.XSSF.UserModel.XSSFDataFormat.GetFormat(short) 看起来像是获取格式的, 但是XSSFDataFormat这个类的构造函数是这样的:XSSFDataFormat(NPOI.XSSF.Model.StylesTable), 要求传入一个StylesTable对象, 找打这个StylesTable的类定义, 发现这个类的构造函数没有参数, 也没有create方法, 好像不对.

这个时候, 同事出了个主意: 这个NPOI是开源了, 把源代码下下来, 看看有没有StylesTable的实例, 想了下, 好主意. 几分钟, 代码就下下来了, 整个项目搜索StylesTable , 马上就发现了一行代码

StylesTable st = ((XSSFWorkbook)workbook).GetStylesSource();

哈哈, 原来是在IWookbook的实现类了, 难怪在接口上找不到.

  把上面的代码给成这样:

IWorkbook workbook = null;
StylesTable st = ((XSSFWorkbook)workbook ).GetStylesSource();
XSSFDataFormat df = new XSSFDataFormat(st);
var workbook = NPOI.SS.UserModel.WorkbookFactory.Create(fileStream);
ISheet sheet = workbook .GetSheetAt(0);
IRow firstRow = sheet.GetRow(1);
ICell cell = firstRow.GetCell(0);
string formatCode = df.GetFormat(cell.CellStyle.DataFormat);
if (formatCode.EndsWith("%"))
{
}

  

  这样获取到的formatcode就是"0.000%" 格式的, 瞬间爽了.

  最后发现: 开源的东西, 最好的办法是去源代码里面找你要的东西, 加上google的线索, 绝对事半功倍.

后来经 烽火情怀 提醒, 有简单方法: ICell.CellStyle.GetDataFormatString()就能获取到格式字符串.

NPOI 读取单元格的格式的更多相关文章

  1. POI读取单元格信息及单元格公式

    Java操作EXCEL的利器一般都是POI和JXL,鄙人只是POI的忠实粉丝.(其实我是没有用过JXL). 现在大多数的excel都是07以上的版本,所以我一般是用07的基础上使用POI. 一.读取单 ...

  2. 转载 NPOI Excel 单元格背景颜色对照表

    NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...

  3. NPOI Excel 单元格背景颜色对照表

    NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 FillForegroundColor 属性实现 Excel 单元格的背景色设置,FillP ...

  4. Excel 单元格自定义格式技巧总结

    第一部分 Excel 中的单元格格式是一个最基本但是又很高级的技能,说它基本是因为我们几乎天天都会用到它,会用它来设置一些简单的格式,比如日期,文本等等:高级是因为利用 Excel 单元格的自定义格式 ...

  5. <转载>NPOI Excel 单元格背景颜色对照表

    我转载地址:http://www.holdcode.com/web/details/117 NPOI Excel 单元格颜色对照表,在引用了 NPOI.dll 后可通过 ICellStyle 接口的 ...

  6. NPOI设置单元格背景色

    NPOI设置单元格背景色在网上有好多例子都是设置为NPOI内置的颜色值 但是想用rgb值来设置背景色,即:通过HSSFPalette类获取颜色值时会抛出异常:Could not Find free c ...

  7. NPOI自定义单元格背景颜色

    经常在NPOI群里聊天时发现有人在问NPOI设置单元格背景颜色的问题,而Tony Qu大神的博客里没有相关教程,刚好最近在做项目时研究了一下这一块,在这里总结一下. 在NPOI中默认的颜色类是HSSF ...

  8. 【转】NPOI自定义单元格背景颜色

    经常在NPOI群里聊天时发现有人在问NPOI设置单元格背景颜色的问题,而Tony Qu大神的博客里没有相关教程,刚好最近在做项目时研究了一下这一块,在这里总结一下. 在NPOI中默认的颜色类是HSSF ...

  9. npoi 设置单元格格式

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. P1075 质因数分解

    P1075 质因数分解 题目描述 已知正整数 n 是两个不同的质数的乘积,试求出两者中较大的那个质数. 输入输出格式 输入格式: 一个正整数 n . 输出格式: 一个正整数 p ,即较大的那个质数. ...

  2. 1130 N的阶乘的长度 V2(斯特林近似)

    1130 N的阶乘的长度 V2(斯特林近似) 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 输入N求N的阶乘的10进制表示的长度.例如6! = 720, ...

  3. 51 nod 1058 N的阶乘的长度

    1058 N的阶乘的长度 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 输入N求N的阶乘的10进制表示的长度.例如6! = 720,长度为3.   In ...

  4. ETL testing

    https://www.tutorialspoint.com/etl_testing/index.htm querysurge-installer-6.0.5-linux-x64  测试ETL的工具.

  5. for-in 和 for

    本文地址:http://www.cnblogs.com/veinyin/p/8745845.html  1 for for ( var i = 0 ; i < len ; i++ ) for 是 ...

  6. js操作控制iframe页面的dom元素

    1.代码1  index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  7. 42、Java装饰者设计模式

    设计模式简介 什么是设计模式?设计模式是可以重复利用的解决方案.软件开发的先驱或者前辈们将之前在开发中遇到的问题进行总结并给出了解决方案,后辈在遇到这些问题之后直接使用这些方案即可解决问题.比如盖高楼 ...

  8. 工具推荐:ATSCAN,功能强大的Perl脚本扫描器

    工具推荐:ATSCAN,功能强大的Perl脚本扫描器 使用perl语言编写的开源的扫描器,功能丰富强大,除了基本的tcp和udp端口扫描之外,还可以搜索wordpress.joomla等网站并进行口令 ...

  9. 图文解说视频直播原理-zz

    本文主要介绍rtmp&hls视频直播原理,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 现在视频直播很火 ...

  10. OpenFlow1.3协议wireshark抓包分析

    OpenFlow v1.0 v1.0协议消息列表如下: 分为三类消息:Controller-to-switch,asynchronous和symmertric. v1.0(包含至少一个流表,每个流表包 ...