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(0);
}
catch
{
stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
workbook = new HSSFWorkbook(stream);
sheet = (HSSFSheet)workbook.GetSheetAt(0);
}
  到这⾥,我们完成了⽂件的读取和空⼯作表的创建。那么下⾯的问题就是,在读取Excel表格的时候,我们会关注标题⾏的顺序问题以及标题⾏字段多少的问题。很多⼈都会制作⼀个导⼊的模板,这个模板制作的⽐较严格,就是标题⾏的顺序要固定,标题⾏有多少列也要固定,这在实际应⽤中⽐较⿇烦,因为我们实际应⽤中可能有些需要导⼊的数据时从别的系统导出来的,这样就可能导致标题⾏的顺序和列数都不固定,遇到这样的问题,我们需要能够灵活处理。我给出我的代码:
ArrayList AL = new ArrayList();//创建⼀个集合,⽤来存放Excel的标题
int CellsCount = sheet.GetRow(0).Cells.Count;//获得这个表的第⼀⾏的列数,也就是标题⾏的列数
for (int i = 0; i<CellsCount; i++)//将标题⾏的每⼀列存储到集合中
{
AL.Add(sheet.GetRow(0).GetCell(i).StringCellValue);
}
IRow row = null;
ICell cell = null;
for (int i = 1; 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 = 0; 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 == 14 || format == 31 || format == 57 || format == 58)
{
DateTime date = cell.DateCellValue;
data = date.ToString("yyy-MM-dd");
}
}
catch { }
access是什么意思啊了
}
string data2 = "";
try
{
data2 = AL[j].ToString().Trim();//读取第j列的标题
}
catch { }
// Global.Global.ShowMessage(""+ row.GetCell(j));
switch (data2)//⽤switch、case来解决标题咧顺序不固定问题。
{
               case:"程序中的字段"
                ....
            }
            ...
            //最后,记得关闭⽂件流
  这⾥我们就完成了对Excel表格内容的读取,并且把相应的内容赋给了我们的字段。最后在实际操作的时候,我们还需要注意⼀点,就是Excel内容本⾝也有格式,什么⽂本啊、货币啊这些格式,那么在我们这个处理过程中,除了你⽇期列你需要把它设置成⽇期格式外,其它的都⽤常规。
  也算是写完了,希望对⼤家有点帮助,我没有贴全部的代码啊,只是⼀些关键代码。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。