在实际的开发中,我们可能需要读写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的使用的更多相关文章

  1. 使用NPOI读取Excel表格内容并进行修改

    前言 网上使用NPOI读取Excel文件的例子现在也不少,本文就是参考网上大神们的例子进行修改以适应自己需求的. 参考博文 http://www.cnblogs.com/restran/p/38894 ...

  2. java 读取 excel 表格内容

    一.添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ar ...

  3. 使用POI读取excel文件内容

    1.前言 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两个工具.这里我们介绍使用POI实现读取excel文档. 2.代码实例: ...

  4. php 读取excel表格中的内容

    <?php /** * excel表格内容在网页中显示 * * 首先需要下载PHPExcel 工具包 * 网址: http://phpexcel.codeplex.com/releases/vi ...

  5. php网址显示excel表格内容

    /** * excel表格内容在网页中显示 * * 首先需要下载PHPExcel 工具包 * 网址: http://phpexcel.codeplex.com/releases/view/119187 ...

  6. JXL解析Excel表格内容到数据库

    java中常用的解析Excel表格的工具一种是POI一种是JXL,POI功能强大,相比JXL稍嫌复杂,对表格样式的处理非常好:而JXL解析简单方便,对中文支持比较好. 工作中解析Excel内容上传到数 ...

  7. Java读取excel表格

    Java读取excel表格 一般都是用poi技术去读取excel表格的,但是这个技术又是什么呢 什么是Apache POI? Apache POI是一种流行的API,它允许程序员使用Java程序创建, ...

  8. 读取Excel表格日期类型数据的时候

    用POI读取Excel数据:(版本号:POI3.7) 1.读取Excel 2.Excel数据处理: Excel存储日期.时间均以数值类型进行存储,读取时POI先判断是是否是数值类型,再进行判断转化 1 ...

  9. Selenium应用代码(读取excel的内容进行注册的案例)

    1. 封装读取excel数据的方法:import java.io.*;import java.util.ArrayList;import java.util.List; import jxl.*;im ...

随机推荐

  1. SVN概述

    ----------------------siwuxie095                                 SVN 概述         1.SVN 即 Subversion 的 ...

  2. python之多并发socket

    先看socket多并发的服务端的代码,这里是用多线程实现的多并发socketserver import socketserver # socketserver有四个基本的类,后两个不常用,这4个类处理 ...

  3. .NET格式化字符串详细说明

    DataFormatString属性:{0:Bxx}B为取值类型 C 以货币格式显示数值. D 以十进制格式显示数值. E 以科学记数法(指数)格式显示数值. F 以固定格式显示数值. G 以常规格式 ...

  4. MySQL主从复制解决数据库单点问题

    一.单个数据库服务器的缺点 数据库服务器存在单点问题: 数据库服务器资源无法满足增长的读写请求: 高峰时数据库连接数经常超过上限. 二.如何解决单点问题 增加额外的数据库服务器,组建数据库集群: 同一 ...

  5. php socket 编程(一)

    socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信.在Internet上的主机一般运行了多个服务软件,同时提 ...

  6. Scrum使用心得 【转】

    原文链接: http://blog.sina.com.cn/s/blog_58db96bc0100ymuk.html 1      Scrum管理模式和传统管理模式的区别 这些管理模式本质上目的相同: ...

  7. 【D3D】Direct3D中LPRECT(上左右底)和LPoint(x,y)之前转换

    D3DSprite.cpp void CD3DSprite::DrawText(CD3DFont *pFont, char *szString, RECT &DesRect, D3DCOLOR ...

  8. 老板说你的UI设计的不高级?你肯定没用这7个技巧...

    对于每个网页设计师而言,在设计过程中总会碰到需要作出设计决策的时候.也许你的公司并没有全职设计师,而需求上则要求设计出全新的UI:又或者你正在制作一个你自己的个人项目,而你希望它比 Bootstrap ...

  9. html5 web 摇一摇切换歌曲

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  10. wpf 进度条 下拉

    <Window x:Class="WpfApplication1.MainWindow"        xmlns="http://schemas.microsof ...