首页 > 代码库 > 在C#中使用NPOI2.0操作Excel2003和Excel2007

在C#中使用NPOI2.0操作Excel2003和Excel2007

http://blog.csdn.net/halym/article/details/9235823

在C#中使用NPOI2.0操作Excel2003和Excel2007

Excel2003:

[csharp] view plaincopy

  1. #region Excel2003  

  2. /// <summary>  

  3. /// 将Excel文件中的数据读出到DataTable中(xls)  

  4. /// </summary>  

  5. /// <param name="file"></param>  

  6. /// <returns></returns>  

  7. public static DataTable ExcelToTableForXLS(string file)  

  8. {  

  9.     DataTable dt = new DataTable();  

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

  11.     {  

  12.         XLS.HSSFWorkbook hssfworkbook = new XLS.HSSFWorkbook(fs);  

  13.         ISheet sheet = hssfworkbook.GetSheetAt(0);  

  14.   

  15.         //表头  

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

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

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

  19.         {  

  20.             object obj = GetValueTypeForXLS(header.GetCell(i) as XLS.HSSFCell);  

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

  22.             {  

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

  24.                 //continue;  

  25.             }  

  26.             else  

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

  28.             columns.Add(i);  

  29.         }  

  30.         //数据  

  31.         for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)  

  32.         {  

  33.             DataRow dr = dt.NewRow();  

  34.             bool hasValue = false;  

  35.             foreach (int j in columns)  

  36.             {  

  37.                 dr[j] = GetValueTypeForXLS(sheet.GetRow(i).GetCell(j) as XLS.HSSFCell);  

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

  39.                 {  

  40.                     hasValue = true;  

  41.                 }  

  42.             }  

  43.             if (hasValue)  

  44.             {  

  45.                 dt.Rows.Add(dr);  

  46.             }  

  47.         }  

  48.     }  

  49.     return dt;  

  50. }  

  51.   

  52. /// <summary>  

  53. /// 将DataTable数据导出到Excel文件中(xls)  

  54. /// </summary>  

  55. /// <param name="dt"></param>  

  56. /// <param name="file"></param>  

  57. public static void TableToExcelForXLS(DataTable dt, string file)  

  58. {  

  59.     XLS.HSSFWorkbook hssfworkbook = new XLS.HSSFWorkbook();  

  60.     ISheet sheet = hssfworkbook.CreateSheet("Test");  

  61.   

  62.     //表头  

  63.     IRow row = sheet.CreateRow(0);  

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

  65.     {  

  66.         ICell cell = row.CreateCell(i);  

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

  68.     }  

  69.   

  70.     //数据  

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

  72.     {  

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

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

  75.         {  

  76.             ICell cell = row1.CreateCell(j);  

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

  78.         }  

  79.     }  

  80.   

  81.     //转为字节数组  

  82.     MemoryStream stream = new MemoryStream();  

  83.     hssfworkbook.Write(stream);  

  84.     var buf = stream.ToArray();  

  85.   

  86.     //保存为Excel文件  

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

  88.     {  

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

  90.         fs.Flush();  

  91.     }  

  92. }  

  93.   

  94. /// <summary>  

  95. /// 获取单元格类型(xls)  

  96. /// </summary>  

  97. /// <param name="cell"></param>  

  98. /// <returns></returns>  

  99. private static object GetValueTypeForXLS(XLS.HSSFCell cell)  

  100. {  

  101.     if (cell == null)  

  102.         return null;  

  103.     switch (cell.CellType)  

  104.     {  

  105.         case CellType.BLANK: //BLANK:  

  106.             return null;  

  107.         case CellType.BOOLEAN: //BOOLEAN:  

  108.             return cell.BooleanCellValue;  

  109.         case CellType.NUMERIC: //NUMERIC:  

  110.             return cell.NumericCellValue;  

  111.         case CellType.STRING: //STRING:  

  112.             return cell.StringCellValue;  

  113.         case CellType.ERROR: //ERROR:  

  114.             return cell.ErrorCellValue;  

  115.         case CellType.FORMULA: //FORMULA:  

  116.         default:  

  117.             return "=" + cell.CellFormula;  

  118.     }  

  119. }  

  120. #endregion  


Excel2007:

[csharp] view plaincopy

  1. #region Excel2007  

  2. /// <summary>  

  3. /// 将Excel文件中的数据读出到DataTable中(xlsx)  

  4. /// </summary>  

  5. /// <param name="file"></param>  

  6. /// <returns></returns>  

  7. public static DataTable ExcelToTableForXLSX(string file)  

  8. {  

  9.     DataTable dt = new DataTable();  

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

  11.     {  

  12.         XSSFWorkbook xssfworkbook = new XSSFWorkbook(fs);  

  13.         ISheet sheet = xssfworkbook.GetSheetAt(0);  

  14.   

  15.         //表头  

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

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

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

  19.         {  

  20.             object obj = GetValueTypeForXLSX(header.GetCell(i) as XSSFCell);  

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

  22.             {  

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

  24.                 //continue;  

  25.             }  

  26.             else  

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

  28.             columns.Add(i);  

  29.         }  

  30.         //数据  

  31.         for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)  

  32.         {  

  33.             DataRow dr = dt.NewRow();  

  34.             bool hasValue = false;  

  35.             foreach (int j in columns)  

  36.             {  

  37.                 dr[j] = GetValueTypeForXLSX(sheet.GetRow(i).GetCell(j) as XSSFCell);  

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

  39.                 {  

  40.                     hasValue = true;  

  41.                 }  

  42.             }  

  43.             if (hasValue)  

  44.             {  

  45.                 dt.Rows.Add(dr);  

  46.             }  

  47.         }  

  48.     }  

  49.     return dt;  

  50. }  

  51.   

  52. /// <summary>  

  53. /// 将DataTable数据导出到Excel文件中(xlsx)  

  54. /// </summary>  

  55. /// <param name="dt"></param>  

  56. /// <param name="file"></param>  

  57. public static void TableToExcelForXLSX(DataTable dt, string file)  

  58. {  

  59.     XSSFWorkbook xssfworkbook = new XSSFWorkbook();  

  60.     ISheet sheet = xssfworkbook.CreateSheet("Test");  

  61.   

  62.     //表头  

  63.     IRow row = sheet.CreateRow(0);  

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

  65.     {  

  66.         ICell cell = row.CreateCell(i);  

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

  68.     }  

  69.   

  70.     //数据  

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

  72.     {  

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

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

  75.         {  

  76.             ICell cell = row1.CreateCell(j);  

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

  78.         }  

  79.     }  

  80.   

  81.     //转为字节数组  

  82.     MemoryStream stream = new MemoryStream();  

  83.     xssfworkbook.Write(stream);  

  84.     var buf = stream.ToArray();  

  85.   

  86.     //保存为Excel文件  

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

  88.     {  

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

  90.         fs.Flush();  

  91.     }  

  92. }  

  93.   

  94. /// <summary>  

  95. /// 获取单元格类型(xlsx)  

  96. /// </summary>  

  97. /// <param name="cell"></param>  

  98. /// <returns></returns>  

  99. private static object GetValueTypeForXLSX(XSSFCell cell)  

  100. {  

  101.     if (cell == null)  

  102.         return null;  

  103.     switch (cell.CellType)  

  104.     {  

  105.         case CellType.BLANK: //BLANK:  

  106.             return null;  

  107.         case CellType.BOOLEAN: //BOOLEAN:  

  108.             return cell.BooleanCellValue;  

  109.         case CellType.NUMERIC: //NUMERIC:  

  110.             return cell.NumericCellValue;  

  111.         case CellType.STRING: //STRING:  

  112.             return cell.StringCellValue;  

  113.         case CellType.ERROR: //ERROR:  

  114.             return cell.ErrorCellValue;  

  115.         case CellType.FORMULA: //FORMULA:  

  116.         default:  

  117.             return "=" + cell.CellFormula;  

  118.     }  

  119. }  


注意:操作Excel2003与操作Excel2007使用的是不同的命名空间下的内容

使用NPOI.HSSF.UserModel空间下的HSSFWorkbook操作Excel2003

使用NPOI.XSSF.UserModel空间下的XSSFWorkbook操作Excel2007