转载的文章,方便自己查看。
一、下载NPOI:http://down.gougou.com/down?cid=DAEA322D9D7F934B898077FB01C3A8CB02A746E6
二、项目添加引用;
三、首先把如下代码封装成一个ExcelHelper类;
四、调用方法。
1、导出:分为DataSet多表导出,DataTable单表导出
首先解析一下由DataSet导出Excel
代码
using System; using System.Data; using System.IO; using System.Web; using NPOI; using NPOI.HPSF; using NPOI.HSSF; using NPOI.HSSF.UserModel; using NPOI.POIFS; using NPOI.Util; using System.Text; public class ExcelHelper { ////// 由DataSet导出Excel /// /// 要导出数据的DataTable /// 工作表名称 ///Excel工作表 private static Stream ExportDataSetToExcel(DataSet sourceDs, string sheetName) { HSSFWorkbook workbook = new HSSFWorkbook(); MemoryStream ms = new MemoryStream(); string [] sheetNames = sheetName.Split(','); for(int i = 0;i< sheetNames.Length; i++) { HSSFSheet sheet = workbook.CreateSheet(sheetNames[i]); HSSFRow headerRow = sheet.CreateRow(0); // handling header. foreach (DataColumn column in sourceDs.Tables[i].Columns) headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); // handling value. int rowIndex = 1; foreach (DataRow row in sourceDs.Tables[i].Rows) { HSSFRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn column in sourceDs.Tables[i].Columns) { dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString()); } rowIndex++; } } workbook.Write(ms); ms.Flush(); ms.Position = 0; workbook = null; return ms; } ////// 由DataSet导出Excel /// /// 要导出数据的DataTable /// 指定Excel工作表名称 ///Excel工作表 public static void ExportDataSetToExcel(DataSet sourceDs, string fileName, string sheetName) { MemoryStream ms = ExportDataSetToExcel(sourceDs, sheetName) as MemoryStream; HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName); HttpContext.Current.Response.BinaryWrite(ms.ToArray()); HttpContext.Current.Response.End(); ms.Close(); ms = null; }
由DataTable导出Excel
代码
////// 由DataTable导出Excel /// /// 要导出数据的DataTable ///Excel工作表 private static Stream ExportDataTableToExcel(DataTable sourceTable, string sheetName) { HSSFWorkbook workbook = new HSSFWorkbook(); MemoryStream ms = new MemoryStream(); HSSFSheet sheet = workbook.CreateSheet(sheetName); HSSFRow headerRow = sheet.CreateRow(0); // handling header. foreach (DataColumn column in sourceTable.Columns) headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); // handling value. int rowIndex = 1; foreach (DataRow row in sourceTable.Rows) { HSSFRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn column in sourceTable.Columns) { dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString()); } rowIndex++; } workbook.Write(ms); ms.Flush(); ms.Position = 0; sheet = null; headerRow = null; workbook = null; return ms; } ////// 由DataTable导出Excel /// /// 要导出数据的DataTable /// 指定Excel工作表名称 ///Excel工作表 public static void ExportDataTableToExcel(DataTable sourceTable, string fileName, string sheetName) { MemoryStream ms = ExportDataTableToExcel(sourceTable, sheetName) as MemoryStream; HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName); HttpContext.Current.Response.BinaryWrite(ms.ToArray()); HttpContext.Current.Response.End(); ms.Close(); ms = null; }
2、导入
由Excel导入DataTable
代码
////// 由Excel导入DataTable /// /// Excel文件流 /// Excel工作表名称 /// Excel表头行索引 ///DataTable public static DataTable ImportDataTableFromExcel(Stream excelFileStream, string sheetName, int headerRowIndex) { HSSFWorkbook workbook = new HSSFWorkbook(excelFileStream); HSSFSheet sheet = workbook.GetSheet(sheetName); DataTable table = new DataTable(); HSSFRow headerRow = sheet.GetRow(headerRowIndex); int cellCount = headerRow.LastCellNum; for (int i = headerRow.FirstCellNum; i < cellCount; i++) { DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) { HSSFRow row = sheet.GetRow(i); DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) dataRow[j] = row.GetCell(j).ToString(); } excelFileStream.Close(); workbook = null; sheet = null; return table; } ////// 由Excel导入DataTable /// /// Excel文件路径,为物理路径。 /// Excel工作表名称 /// Excel表头行索引 ///DataTable public static DataTable ImportDataTableFromExcel(string excelFilePath, string sheetName, int headerRowIndex) { using (FileStream stream = System.IO.File.OpenRead(excelFilePath)) { return ImportDataTableFromExcel(stream, sheetName, headerRowIndex); } } ////// 由Excel导入DataTable /// /// Excel文件流 /// Excel工作表索引 /// Excel表头行索引 ///DataTable public static DataTable ImportDataTableFromExcel(Stream excelFileStream, int sheetIndex, int headerRowIndex) { HSSFWorkbook workbook = new HSSFWorkbook(excelFileStream); HSSFSheet sheet = workbook.GetSheetAt(sheetIndex); DataTable table = new DataTable(); HSSFRow headerRow = sheet.GetRow(headerRowIndex); int cellCount = headerRow.LastCellNum; for (int i = headerRow.FirstCellNum; i < cellCount; i++) { if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "") { // 如果遇到第一个空列,则不再继续向后读取 cellCount = i + 1; break; } DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) { HSSFRow row = sheet.GetRow(i); if (row == null || row.GetCell(0) == null || row.GetCell(0).ToString().Trim() == "") { // 如果遇到第一个空行,则不再继续向后读取 break; } DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { dataRow[j] = row.GetCell(j); } table.Rows.Add(dataRow); } excelFileStream.Close(); workbook = null; sheet = null; return table; } ////// 由Excel导入DataTable /// /// Excel文件路径,为物理路径。 /// Excel工作表索引 /// Excel表头行索引 ///DataTable public static DataTable ImportDataTableFromExcel(string excelFilePath, int sheetIndex, int headerRowIndex) { using (FileStream stream = System.IO.File.OpenRead(excelFilePath)) { return ImportDataTableFromExcel(stream, sheetIndex, headerRowIndex); } }
有Excel导入DataSet
代码
////// 由Excel导入DataSet,如果有多个工作表,则导入多个DataTable /// /// Excel文件流 /// Excel表头行索引 ///DataSet public static DataSet ImportDataSetFromExcel(Stream excelFileStream, int headerRowIndex) { DataSet ds = new DataSet(); HSSFWorkbook workbook = new HSSFWorkbook(excelFileStream); for (int a = 0, b = workbook.NumberOfSheets; a < b; a++) { HSSFSheet sheet = workbook.GetSheetAt(a); DataTable table = new DataTable(); HSSFRow headerRow = sheet.GetRow(headerRowIndex); int cellCount = headerRow.LastCellNum; for (int i = headerRow.FirstCellNum; i < cellCount; i++) { if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "") { // 如果遇到第一个空列,则不再继续向后读取 cellCount = i + 1; break; } DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum ; i++) { HSSFRow row = sheet.GetRow(i); if (row == null || row.GetCell(0) == null || row.GetCell(0).ToString().Trim() == "") { // 如果遇到第一个空行,则不再继续向后读取 break; } DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) != null) { dataRow[j] = row.GetCell(j).ToString(); } } table.Rows.Add(dataRow); } ds.Tables.Add(table); } excelFileStream.Close(); workbook = null; return ds; } ////// 由Excel导入DataSet,如果有多个工作表,则导入多个DataTable /// /// Excel文件路径,为物理路径。 /// Excel表头行索引 ///DataSet public static DataSet ImportDataSetFromExcel(string excelFilePath, int headerRowIndex) { using (FileStream stream = System.IO.File.OpenRead(excelFilePath)) { return ImportDataSetFromExcel(stream, headerRowIndex); } }
另外为导入补充一点知识:
1、将Excel的列索引转换为列名,列索引从0开始,列名从A开始。如第0列为A,第1列为B...
代码
////// 将Excel的列索引转换为列名,列索引从0开始,列名从A开始。如第0列为A,第1列为B... /// /// 列索引 ///列名,如第0列为A,第1列为B... public static string ConvertColumnIndexToColumnName(int index) { index = index + 1; int system = 26; char[] digArray = new char[100]; int i = 0; while (index > 0) { int mod = index % system; if (mod == 0) mod = system; digArray[i++] = (char)(mod - 1 + 'A'); index = (index - 1) / 26; } StringBuilder sb = new StringBuilder(i); for (int j = i - 1; j >= 0; j--) { sb.Append(digArray[j]); } return sb.ToString(); }
2、当从Excel获取年月日时,会从在一定的问题,应该在一下代码中,可以想到存在的问题,所以我们可以写个方法封装一下:
代码
////// 转化日期 /// /// 日期 ///public static DateTime ConvertDate(string date) { DateTime dt = new DateTime(); string[] time = date.Split('-'); int year = Convert.ToInt32(time[2]); int month = Convert.ToInt32(time[0]); int day = Convert.ToInt32(time[1]); string years = Convert.ToString(year); string months = Convert.ToString(month); string days = Convert.ToString(day); if(months.Length == 4) { dt = Convert.ToDateTime(date); } else { string rq = ""; if(years.Length == 1) { years = "0" + years; } if(months.Length == 1) { months = "0" + months; } if(days.Length == 1) { days = "0" + days; } rq = "20" + years + "-" + months + "-" + days; dt = Convert.ToDateTime(rq); } return dt; } }