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 ...
随机推荐
- 91. Decode Ways (Array; DP)
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- 【英宝通Unity4.0公开课学习 】(五)47讲到75讲
不知不觉今天都已经看了快30讲了,虽然很想快马加鞭地将后面的内容看完,但为了学习的质量,还是挺下来写一篇blog :) 这两天有些昏昏沉沉的,但感觉生活还安排得不错,原因找去找来觉得是没怎么开窗透气. ...
- DOS中命令的格式
---------------siwuxie095 一.DOS中,命令使用格式的一般形式 用中文表达的形式为: [路径] 关键字 [盘符] [路径] 文件名 [扩展名] (参数) [参数 ...
- IIS 设置404页面 显示系统找不到指定的文件
1.原因就是IIS的普通用户没有访问404页面的权限,造成了自定义404页面无法显示.只需要将user用户组具有读的权限即可.
- Spring框架的事务管理的分类
1. Spring的事务管理的分类 1. Spring的编程式事务管理(不推荐使用) * 通过手动编写代码的方式完成事务的管理(不推荐) 2. Spring的声明式事务管理(底层采用AOP的技术) * ...
- MySQL主从复制备份
前言 数据库实时备份的需求很常见,MySQL本身提供了 Replication 机制,摘译官方介绍如下: MySQL Replication 可以将一个主数据库中的数据同步到一个或多个从数据库中.并且 ...
- Redis的复制特性
对于有扩展平台以适应更高负载经验的工程师和管理员来说,复制(replication)是不可或缺的.复制可以让其他服务器拥有一个不断更新的数据副本,从而使得拥有数据副本的服务器可以用于处理客户端发送的读 ...
- ssh的无密码登录
实现步骤如下: 1 生成一对公钥和私钥 $ ssh-keygen #以上命令等价于 ssh-keygen -t rsa #-t:指定密钥的类型,默认为SSH-2 的rsa类型; 运行上面的命令后,系统 ...
- 局域网代理通过wget下载
下载方法: wget -r -p -np -k http://ftp.loongnix.org/os/Fedora13-o32/RPMS/mipsel/ -r, --recursive(递归) ...
- Windows10 Virtualization Technology虚拟化技术功能
为什么要开启VT功能,做机器学习环境搭建.运用Docker容器等等,所以首先要确认一下机器是否已经开启了VT技术功能,以此记录一下经历而已. VT是什么?为什么要开启VT?VT是一种虚拟化技术,可以扩 ...