【C#】使用NOPI将Excel表格转换为DataTable

POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office
97-2003的文件,支持的文件格式包括xls, doc, ppt等。 NPOI,就是POI的.NET版本。

///
/// 将excel导入到datatable
/// 
/// excel路径
/// 第一行是否是列名
/// 返回datatable
public DataTable ExcelToDataTable(string filePath, bool isColumnName)
{
	DataTable dataTable = null;
	FileStream fs = null;
	DataColumn column = null;
	DataRow dataRow = null;
	IWorkbook workbook = null;
	ISheet sheet = null;
	IRow row = null;
	ICell cell = null;
	int startRow = 0;
	try
	{
		using (fs = File.OpenRead(filePath))
		{
			// 2007版本
			if (filePath.IndexOf(".xlsx") > 0)
				workbook = new XSSFWorkbook(fs);
			// 2003版本
			else if (filePath.IndexOf(".xls") > 0)
				workbook = new HSSFWorkbook(fs);

			if (workbook != null)
			{
				sheet = workbook.GetSheetAt(0);//读取第一个sheet,当然也可以循环读取每个sheet
				dataTable = new DataTable();
				if (sheet != null)
				{
					int rowCount = sheet.LastRowNum;//总行数
					if (rowCount > 0)
					{
						IRow firstRow = sheet.GetRow(0);//第一行
						int cellCount = firstRow.LastCellNum;//列数

						//构建datatable的列
						if (isColumnName)
						{
							startRow = 1;//如果第一行是列名,则从第二行开始读取
							for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
							{
								cell = firstRow.GetCell(i);
								if (cell != null)
								{
									if (cell.StringCellValue != null)
									{
										column = new DataColumn(cell.StringCellValue);
										dataTable.Columns.Add(column);
									}
								}
							}
						}
						else
						{
							for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
							{
								column = new DataColumn("column" + (i + 1));
								dataTable.Columns.Add(column);
							}
						}

						//填充行
						for (int i = startRow; i <= rowCount; ++i)
						{
							row = sheet.GetRow(i);
							if (row == null)
								continue;

							dataRow = dataTable.NewRow();
							for (int j = row.FirstCellNum; j < cellCount; ++j)
							{
								cell = row.GetCell(j);
								if (cell == null)
								{
									dataRow[j] = "";
								}
								else
								{
									//CellType(Unknown = -1,Numeric = 0,String = 1,Formula = 2,Blank = 3,Boolean = 4,Error = 5,)
									switch (cell.CellType)
									{
										case CellType.Blank:
											dataRow[j] = "";
											break;
										case CellType.Numeric:
											short format = cell.CellStyle.DataFormat;
											//对时间格式(2015.12.5、2015/12/5、2015-12-5等)的处理
											if (format == 14 || format == 31 || format == 57 || format == 58)
												dataRow[j] = cell.DateCellValue;
											else
												dataRow[j] = cell.NumericCellValue;
											break;
										case CellType.String:
											dataRow[j] = cell.StringCellValue;
											break;
									}
								}
							}
							dataTable.Rows.Add(dataRow);
						}
					}
				}
			}
		}
		return dataTable;
	}
	catch (Exception)
	{
		if (fs != null)
		{
			fs.Close();
		}
		return null;
	}
}

另附:DataTable 的数据批量导入到数据库

你可能感兴趣的:(C#)