最近做项目需要导入一部分数据, 导入的数据的中, 有部分的百分比数据使用的是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. 2017 清北济南考前刷题Day 7 afternoon

    期望得分:100+100+30=230 实际得分:100+100+30=230 1. 三向城 题目描述 三向城是一个巨大的城市,之所以叫这个名字,是因为城市中遍布着数不尽的三岔路口.(来自取名力为0的 ...

  2. Django 2.0.1 官方文档翻译: 快速安装向导 (Page5)

    快速安装向导 (Page 5) 在你使用 Django 前,你需要先安装它.我们有一个完整的安装向导,它包含所有涉及的内容,这个向导会指导你进行一个简单的.最小化的安装,当你通过浏览介绍内容的时候,这 ...

  3. 【BZOJ】2006: [NOI2010]超级钢琴

    [题意]给定长度为n的整数序列,求长度为[L,R]的前k大区间和的和.n,k<=500000. [算法]堆+贪心+RMQ [题解]考虑暴力是取所有长度为[L,R]的子串的前k大求和,复杂度O(n ...

  4. 在嵌入式Linux系统(OK6410)中移植Boa 服务器

    OK6410的Boa服务器移植: <一> Boa的编译 1. 从 www.boa.org 下载 Boa 服务器的最新版:boa-0.94.13.tar.gz. 2. 解压:tar xzf ...

  5. 微服务深入浅出(9)-- Nginx

    Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,处理请求是异步非阻塞的,多个连接(万级别)可以对应一个进程.而Apache是同步多进程模型,一个连接对 ...

  6. HDU 1017 A Mathematical Curiosity 数学题

    解题报告:输入两个数,n和m,求两个数a和b满足0<a<b<n,并且(a^2+b^2+m) % (a*b) =0,这样的a和b一共有多少对.注意这里的b<n,并不可以等于n. ...

  7. pandas空值处理与插值

    # coding:utf-8 import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.int ...

  8. JS中数组那些事~

    今天闲的没事,看了一些关于数组的操作,好久木有用过,很多都已经忘记的差不多了,所以今天花了一个小时写了一些demo,准备备份一下方便以后使用~~~ 下面是一些工作当中,经常用到的数组的方法,小伙伴可以 ...

  9. Python练习-一个简单易懂的迭代器,了解一下

    今天我们学习了迭代器,其实可以理解为是一个元素容器被遍历的方式,不难理解,看看下面的小例子: # 编辑者:闫龙 #一个简单的迭代器 l = [1,2,3,4,5,6,7]#建立一个列表l ite = ...

  10. APScheduler API -- apscheduler.triggers.cron

    apscheduler.triggers.cron API Trigger alias for add_job(): cron class apscheduler.triggers.cron.Cron ...