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 ...
随机推荐
- acceleration
acceleration - Bing dictionary US[ək.selə'reɪʃ(ə)n]UK[ək.selə'reɪʃ(ə)n] n.加速度:加快:(车辆)加速能力 网络促进:加速力:加 ...
- day10:vcp考试
Q181. An administrator is deploying ESXi 6.x hosts using Auto Deploy and wants the image profile to ...
- python内置函数之attr【反射】
#Auther Bob#--*--conding:utf-8 --*-- #我们来循序渐进的学习反射 import s1 #阶段1# def run():# url = input("请输入 ...
- iOS 管理库 Carthage 安装以及使用
https://blog.csdn.net/Mazy_ma/article/details/70185547
- Swift 基本语法03-"if let"和"guard let"
1. /// 如果JY_WINDOW有rootViewController, 并且rootViewController类型是AdvertisementViewController,就执行stopPla ...
- swift 官方文档
swift 官方文档 https://swift.org/blog/
- js this pointer 指针
this JavaScript的函数内部如果调用了this,那么这个this到底指向谁? 答案是,视情况而定! 如果以对象的方法形式调用,比如xiaoming.age(),该函数的this指向被调用的 ...
- linux文件管理2
1.显示文件内容 cat : 显示文件内容 tac : 倒序显示内容 2.更改文件权限 chmod :更改文件权限 -R 递归改变 chown :更改文件拥有者 -R 递归改变 chgrp :更改文件 ...
- redmine2.6.5 邮件配置
打开configuration.xml (路径:apps/redmine/htdocs/config/) production: email_delivery: delivery_method: :s ...
- part1:9-windows与Linux文件共享
1.winSCP 它是一个windows环境下使用SSH的开源图形化SFTP客户端.同时支持SCP协议.它主要功能就是在本地与远程计算机间安全的复制文件. 前提:Linux与windows能相互pin ...