C# 读取Excel表格内容,以及NPOI的使用
在实际的开发中,我们可能需要读写word或者Excel的内容,在我开发的项目中,需要读取Excel的内容,并将相对应的内容存储到数据库中,这里简单跟大家分享一下,希望能够帮助一些人。
我相信在读写word和Excel文件时,大家普遍会遇到的一个问题就是,针对office2003以前的版本和2003以后的版本的兼容性问题,在这个问题上,我也是纠结了很久,最后,通过一个简单的技巧解决了,下边,给大家贴出源码供大家参考。
Stream stream = null;
IWorkbook workbook = null;
ISheet sheet = null;//上边这几行都是固定格式,如果你不深究,急着就行
try
{
//重点是这个try、catch。可以仔细观察,两个workbook和sheet的创建和读取是不一样的,07年以后的版本使用XSSFWorkbook和XSSFSheet,03年以前的使用HSSFWorkbook和HSSFSheet
//创建和读取。我在这里使用了try、catch的方法区分,但是有些人会使用if来判断文件的后缀名,我觉得这种方式不保险,因为office文件的后缀名我们可以手动修改的。
stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
workbook = new XSSFWorkbook(stream);
sheet = (XSSFSheet)workbook.GetSheetAt();
}
catch
{
stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
workbook = new HSSFWorkbook(stream);
sheet = (HSSFSheet)workbook.GetSheetAt();
}
到这里,我们完成了文件的读取和空工作表的创建。那么下面的问题就是,在读取Excel表格的时候,我们会关注标题行的顺序问题以及标题行字段多少的问题。很多人都会制作一个导入的模板,这个模板制作的比较严格,就是标题行的顺序要固定,标题行有多少列也要固定,这在实际应用中比较麻烦,因为我们实际应用中可能有些需要导入的数据时从别的系统导出来的,这样就可能导致标题行的顺序和列数都不固定,遇到这样的问题,我们需要能够灵活处理。我给出我的代码:
ArrayList AL = new ArrayList();//创建一个集合,用来存放Excel的标题
int CellsCount = sheet.GetRow().Cells.Count;//获得这个表的第一行的列数,也就是标题行的列数
for (int i = ; i<CellsCount; i++)//将标题行的每一列存储到集合中
{
AL.Add(sheet.GetRow().GetCell(i).StringCellValue);
}
IRow row = null;
ICell cell = null;
for (int i = ; i <= sheet.LastRowNum; i++)//从标题行一下,也就是第二行开始遍历此表
{
//try/catch 来处理07版office之后与之前的版本问题
//try
//{
// row = (XSSFRow) sheet.GetRow(i);//读取第i行
//}
//catch (Exception)
//{
// row = (HSSFRow) sheet.GetRow(i);
//} //之前采用try。catch 来进行版本的判断,后期发现这种判断虽然能够解决问题,但比较麻烦
//后期在工作中发现了新的方法,这里跟大家说一下。
//由于前边已经对sheet进行版本判断,因此它的类型已经确定,所以在这里我们使用C#关键字Dynamic来处理
//代码会简单很多,而且也不会跑异常
row = (Dynamic) sheet.GetRow(i);
ArrayList arr = new ArrayList();
for (int j = ; j<CellsCount; j++)
{
//try/catch 来处理07版office之后与之前的版本问题
//try
//{
// cell = (XSSFCell) row.GetCell(j);//读取第i行的第j列
//}
//catch (Exception)
//{
// cell = (HSSFCell) row.GetCell(j);
//} cell = (Dynamic) row.GetCell(j);
if (cell == null)//这句话的意思就是,遇到当前列为空的时候,继续遍历。因为我们的Excel表格有单元格是没有数据或者不存在的,这也解决了单元格的列数不固定问题。
{
continue;
}
string data = "";
try
{
data = row.GetCell(j).ToString().Trim();//把当前单元格的内容赋给string字符串。
}
catch { }
//CellType是一个枚举类型(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4, Error = 5,)
//对时间格式(2015.12.5、2015/12/5、2015-12-5等)的处理,我这里只对时间格式做了处理,其他都当做string来处理
if (cell.CellType == CellType.Numeric)
{
try
{
short format = cell.CellStyle.DataFormat;
if (format == || format == || format == || format == )
{
DateTime date = cell.DateCellValue;
data = date.ToString("yyy-MM-dd");
}
}
catch { }
}
string data2 = "";
try
{
data2 = AL[j].ToString().Trim();//读取第j列的标题
}
catch { }
// Global.Global.ShowMessage(""+ row.GetCell(j));
switch (data2)//用switch、case来解决标题咧顺序不固定问题。
{
case:"程序中的字段"
....
}
...
//最后,记得关闭文件流
这里我们就完成了对Excel表格内容的读取,并且把相应的内容赋给了我们的字段。最后在实际操作的时候,我们还需要注意一点,就是Excel内容本身也有格式,什么文本啊、货币啊这些格式,那么在我们这个处理过程中,除了你日期列你需要把它设置成日期格式外,其它的都用常规。
也算是写完了,希望对大家有点帮助,我没有贴全部的代码啊,只是一些关键代码。
C# 读取Excel表格内容,以及NPOI的使用的更多相关文章
- 使用NPOI读取Excel表格内容并进行修改
前言 网上使用NPOI读取Excel文件的例子现在也不少,本文就是参考网上大神们的例子进行修改以适应自己需求的. 参考博文 http://www.cnblogs.com/restran/p/38894 ...
- java 读取 excel 表格内容
一.添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ar ...
- 使用POI读取excel文件内容
1.前言 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两个工具.这里我们介绍使用POI实现读取excel文档. 2.代码实例: ...
- php 读取excel表格中的内容
<?php /** * excel表格内容在网页中显示 * * 首先需要下载PHPExcel 工具包 * 网址: http://phpexcel.codeplex.com/releases/vi ...
- php网址显示excel表格内容
/** * excel表格内容在网页中显示 * * 首先需要下载PHPExcel 工具包 * 网址: http://phpexcel.codeplex.com/releases/view/119187 ...
- JXL解析Excel表格内容到数据库
java中常用的解析Excel表格的工具一种是POI一种是JXL,POI功能强大,相比JXL稍嫌复杂,对表格样式的处理非常好:而JXL解析简单方便,对中文支持比较好. 工作中解析Excel内容上传到数 ...
- Java读取excel表格
Java读取excel表格 一般都是用poi技术去读取excel表格的,但是这个技术又是什么呢 什么是Apache POI? Apache POI是一种流行的API,它允许程序员使用Java程序创建, ...
- 读取Excel表格日期类型数据的时候
用POI读取Excel数据:(版本号:POI3.7) 1.读取Excel 2.Excel数据处理: Excel存储日期.时间均以数值类型进行存储,读取时POI先判断是是否是数值类型,再进行判断转化 1 ...
- Selenium应用代码(读取excel的内容进行注册的案例)
1. 封装读取excel数据的方法:import java.io.*;import java.util.ArrayList;import java.util.List; import jxl.*;im ...
随机推荐
- U盘做启动盘后,恢复原始容量
借助u盘进行系统安装时,可能会对u盘进行分区.u盘分区后,再连接至电脑,就有很大程度的可能是一部分区域不能显示.u盘原本的大小被占据,显示的大小是比之前少了的,并且这些少掉了的内存也无法再使用.只有对 ...
- 探讨 .NET 4 新增的 SortedSet 类
http://www.cnblogs.com/WizardWu/archive/2010/06/17/1759297.html
- 【校招面试 之 C/C++】第31题 C++ 11新特性(二)之nullptr关键字
1. 引入nullptr的原因 引入nullptr的原因,这个要从NULL说起.对于C和C++程序员来说,一定不会对NULL感到陌生.但是C和C++中的NULL却不等价.NULL表示指针不指向任何对象 ...
- .NET资源文件实现多语言切换
1.创建对应的资源文件 lang.en.resx 英文 lang.resx 中文,默认 lang.zh-tw.resx 繁体 首先说明,这三个文件前面部分名称需要一样,只是 点 后面的语言代号 ...
- yii2中的rules 自定义验证规则详解
yii2的一个强大之处之一就是他的Form组件,既方便又安全.有些小伙伴感觉用yii一段时间了,好嘛,除了比tp"难懂"好像啥都没有. 领导安排搞一个注册的功能,这家伙刷刷刷的又是 ...
- Cairo编程
一.简介 cairo 是一个免费的矢量绘图软件库,它可以绘制多种输出格式.cairo 支持许多平台,包括 Linux.BSD.Microsoft® Windows® 和 OSX(BeOS 和 OS2 ...
- jstl标签详解 (转载)
JSLT标签库,是日常开发经常使用的,也是众多标签中性能最好的.把常用的内容,放在这里备份一份,随用随查.尽量做到不用查,就可以随手就可以写出来.这算是Java程序员的基本功吧,一定要扎实. JSTL ...
- Jmeter Ant Task如何让beanshell断言失败的详细信息展示在report里面
首先必须给beanshell断言添加FailureMessage if(${TotalClient_SS}+2!=${TotalClient_SS2}){Failure=true; Fai ...
- centos7 nginx 加入开机启动
设置nginx开机启动 vi /etc/rc.d/init.d/nginx #编辑启动文件添加下面内容 ############################################### ...
- 系统调用方式文件编程-open
通过Linux系统调用函数编写应用程序,该应用程序实现文件的复制功能 文件描述符--在Linux系统中,所有打开的文件也对应一个数字,这个数字由系统来分配. 1.打开文件--open 头文件:#inc ...