好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#通过NPOI操作Excel的实例代码

C#操作Excel的方法有很多种,常见的有微软官方的OLE Automation,Apache的POI等。这里介绍的是POI翻译成C#的NPOI。

POI是Apache的通过Java操作Office的一个API,可以对Excel,Word,PPT等进行操作,十分的强大。然后就被翻译成C#版本的NPOI了,和log4j与log4net很相似。

好像在NPOI的.net4.0版本之前是不支持office2007及以上的XML格式的,但是最新的版本已经支持了。只需要下载并引用下面五个程序集就能使用了。

这里提供一个操作Excel的类,类中提供了4个方法,两个导出,两个导入。可以通过DataSet导出拥有多个Sheet的Excel文件,也可以通过DataTable导出拥有一个Sheet的Excel。导入也是一样,通过指定Sheet索引,导出DataTable,或者直接导出所有Sheet返回一个DataSet。

?

public class ExcelHelper

   {

     /// <summary>

     /// 根据Excel和Sheet返回DataTable

     /// </summary>

     /// <param name="filePath">Excel文件地址</param>

     /// <param name="sheetIndex">Sheet索引</param>

     /// <returns>DataTable</returns>

     public static DataTable GetDataTable( string filePath, int sheetIndex)

     {

       return GetDataSet(filePath, sheetIndex).Tables[0];

     }

 

     /// <summary>

     /// 根据Excel返回DataSet

     /// </summary>

     /// <param name="filePath">Excel文件地址</param>

     /// <param name="sheetIndex">Sheet索引,可选,默认返回所有Sheet</param>

     /// <returns>DataSet</returns>

     public static DataSet GetDataSet( string filePath, int ? sheetIndex = null )

     {

       DataSet ds = new DataSet();

       IWorkbook fileWorkbook;

       using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))

       {

         if (filePath.Last() == 's' )

         {

           try

           {

             fileWorkbook = new HSSFWorkbook(fs);

           }

           catch (Exception ex)

           {

             throw ex;

           }

         }

         else

         {

           try

           {

             fileWorkbook = new XSSFWorkbook(fs);

           }

           catch

           {

             fileWorkbook = new HSSFWorkbook(fs);

           }

         }

       }

 

       for ( int i = 0; i < fileWorkbook.NumberOfSheets; i++)

       {

         if (sheetIndex != null && sheetIndex != i)

           continue ;

         DataTable dt = new DataTable();

         ISheet sheet = fileWorkbook.GetSheetAt(i);

 

         //表头

         IRow header = sheet.GetRow(sheet.FirstRowNum);

         List< int > columns = new List< int >();

         for ( int j = 0; j < header.LastCellNum; j++)

         {

           object obj = GetValueTypeForXLS(header.GetCell(j) as HSSFCell);

           if (obj == null || obj.ToString() == string .Empty)

           {

             dt.Columns.Add( new DataColumn( "Columns" + j.ToString()));

           }

           else

             dt.Columns.Add( new DataColumn(obj.ToString()));

           columns.Add(j);

         }

         //数据

         IEnumerator rows = sheet.GetEnumerator();

         while (rows.MoveNext())

         {

           int j = sheet.FirstRowNum + 1;

           DataRow dr = dt.NewRow();

           bool hasValue = false ;

           foreach ( int K in columns)

           {

             dr[K] = GetValueTypeForXLS(sheet.GetRow(K).GetCell(K) as HSSFCell);

             if (dr[K] != null && dr[K].ToString() != string .Empty)

             {

               hasValue = true ;

             }

           }

           if (hasValue)

           {

             dt.Rows.Add(dr);

           }

           j++;

         }

         ds.Tables.Add(dt);

       }

 

       return ds;

     }

 

     /// <summary>

     /// 根据DataTable导出Excel

     /// </summary>

     /// <param name="dt">DataTable</param>

     /// <param name="file">保存地址</param>

     public static void GetExcelByDataTable(DataTable dt, string file)

     {

       DataSet ds = new DataSet();

       ds.Tables.Add(dt);

       GetExcelByDataSet(ds, file);

     }

 

     /// <summary>

     /// 根据DataSet导出Excel

     /// </summary>

     /// <param name="ds">DataSet</param>

     /// <param name="file">保存地址</param>

     public static void GetExcelByDataSet(DataSet ds, string file)

     {

       IWorkbook fileWorkbook = new HSSFWorkbook();

       int index = 0;

       foreach (DataTable dt in ds.Tables)

       {

         index++;

         ISheet sheet = fileWorkbook.CreateSheet( "Sheet" + index);

 

         //表头

         IRow row = sheet.CreateRow(0);

         for ( int i = 0; i < dt.Columns.Count; i++)

         {

           ICell cell = row.CreateCell(i);

           cell.SetCellValue(dt.Columns[i].ColumnName);

         }

 

         //数据

         for ( int i = 0; i < dt.Rows.Count; i++)

         {

           IRow row1 = sheet.CreateRow(i + 1);

           for ( int j = 0; j < dt.Columns.Count; j++)

           {

             ICell cell = row1.CreateCell(j);

             cell.SetCellValue(dt.Rows[i][j].ToString());

           }

         }

       }

 

       //转为字节数组

       MemoryStream stream = new MemoryStream();

       fileWorkbook.Write(stream);

       var buf = stream.ToArray();

 

       //保存为Excel文件

       using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write))

       {

         fs.Write(buf, 0, buf.Length);

         fs.Flush();

       }

     }

 

     /// <summary>

     /// 根据单元格将内容返回为对应类型的数据

     /// </summary>

     /// <param name="cell">单元格</param>

     /// <returns>数据</returns>

     private static object GetValueTypeForXLS(HSSFCell cell)

     {

       if (cell == null )

         return null ;

       switch (cell.CellType)

       {

         case CellType.Blank: //BLANK:

           return null ;

         case CellType.Boolean: //BOOLEAN:

           return cell.BooleanCellValue;

         case CellType.Numeric: //NUMERIC:

           return cell.NumericCellValue;

         case CellType.String: //STRING:

           return cell.StringCellValue;

         case CellType.Error: //ERROR:

           return cell.ErrorCellValue;

         case CellType.Formula: //FORMULA:

         default :

           return "=" + cell.CellFormula;

       }

     }

   }

这里面可以有一些有意思的操作,比如版本兼容问题。这里通过多态很好的实现了兼容,但是如果是2007版本的xlsm被修改为xsl的后缀怎么办呢,或者2003版本的被修改为xlsm后缀怎么办呢。2003版本改为xlsm还是可以将其视为xls来处理的,但是2007改为xls就不行了。这时候可以强行修改文件的后缀名再打开。

但是上面的代码没有实现这个功能,两个原因:一、这样做不是很安全。二、这时候需要修改系统中其它地方此文件的文件名,放在类中实现不是很方便。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://HdhCmsTestcnblogs测试数据/xueyeduling/p/6254799.html

dy("nrwz");

查看更多关于C#通过NPOI操作Excel的实例代码的详细内容...

  阅读:70次