NPOI2.1.1操作Excel
2015-09-07 15:04
176 查看
1。参数说明:
(1)工作簿:(IWorkbook)IWorkbook workbook=new HSSFWorkbook();(这里是2003版本的Excel的工作簿对象)
IWorkbook workbook=new XSSFWorkbook();(这里是2007版本的Excel的工作簿对象)
判断创建Excel工作簿对象是03还是07版本的,可以根据文档路径后缀名称来判断:
string fileEx = Path.GetExtension(absolutePath); switch (fileEx) { case ".xls": workbook = new HSSFWorkbook(); break; default: workbook = new XSSFWorkbook(); break; }
(2)单元格(ISheet):
//命名单元格名称 string sheetName = string.IsNullOrEmpty(dt.TableName) ? "Sheet " + (++i).ToString() : dt.TableName; ISheet sheet = workbook.CreateSheet(sheetName);//创建单元格
//设置所有单元格默认宽度 sheet.DefaultColumnWidth = 3 * 5;
(3)单元格行(IRow):
//创建行 IRow headerRow = sheet.CreateRow(0);//这里0代表单元格第一行,1代表第二行,如此类推
单元格行高度可以这样子设置:
headerRow.Height = 30 * 17;
//创建第一行单元格设置列名称
headerRow.CreateCell(0).SetCellValue(columnName);
(4)单元格样式(ICellStyle):
//创建单元格样式对象 ICellStyle style = workbook.CreateCellStyle(); //自动转行 style.WrapText = true; //垂直对齐居中 style.VerticalAlignment = VerticalAlignment.Center; //水平对齐居中 style.Alignment = HorizontalAlignment.Center; //设置字体前背景颜色 style.FillForegroundColor = HSSFColor.LightBlue.Index; style.FillPattern = FillPattern.SolidForeground; //设置单元格边框大小和边框前背景颜色 style.BorderBottom = BorderStyle.Thin; style.BorderLeft = BorderStyle.Thin; style.BorderRight = BorderStyle.Thin; style.BorderTop = BorderStyle.Thin; style.BottomBorderColor = HSSFColor.Black.Index; style.LeftBorderColor = HSSFColor.Black.Index; style.RightBorderColor = HSSFColor.Black.Index; style.TopBorderColor = HSSFColor.Black.Index; //创建一个字体样式对象 IFont font = workbook.CreateFont(); //设置字体 font.FontName = "宋体"; //设置字体尺寸(字号) font.FontHeightInPoints = 10; //设置字体加粗样式 font.Boldweight = (short)FontBoldWeight.Bold; //设置字体颜色 font.Color = HSSFColor.White.Index; //设置字体样式 style.SetFont(font);
这里定义好单元格样式之后,把样式赋值给单元格:
headerRow.GetCell(0).CellStyle = style;//这里意思是获取行第一个单元格赋样式
2。完整代码:
public static class NPOIHelper { /// <summary> /// 导出Excel /// </summary> /// <param name="dataSet">数据集</param> /// <param name="absolutePath">导出Excel绝对路径,例如(C:\Users\wuzk\Desktop\Temporary\1.xlsx)</param> /// <param name="isAddStyle">是否添加固定单元格样式</param> /// <param name="errMsg">异常消息</param> /// <param name="styleDic">单元格样式字典: /// Alignment(水平对齐); /// Background(单元格背景颜色); /// Border:单元格边框粗细; /// FontName:字体名称; /// FontSize:字体大小; /// FontWeight:字体是否加粗; /// FontColor:字体颜色; /// </param> /// <returns>成功或失败</returns> public static bool ExportDataToExcel(DataSet dataSet, string absolutePath, bool isAddStyle, out string errMsg) { errMsg = string.Empty; List<DataTable> dts = new List<DataTable>(); foreach (DataTable dt in dataSet.Tables) { dts.Add(dt); }; return ExportDataToExcel(dts, absolutePath, isAddStyle, out errMsg); } /// <summary> /// 导出Excel /// </summary> /// <param name="dataTable">数据表格</param> /// <param name="absolutePath">导出Excel绝对路径,例如(C:\Users\wuzk\Desktop\Temporary\1.xlsx)</param> /// <param name="isAddStyle">是否添加固定单元格样式</param> /// <param name="errMsg">异常消息</param> /// <returns>成功或失败</returns> public static bool ExportDataToExcel(DataTable dataTable, string absolutePath, bool isAddStyle, out string errMsg) { errMsg = string.Empty; List<DataTable> dts = new List<DataTable>(); dts.Add(dataTable); return ExportDataToExcel(dts, absolutePath, isAddStyle, out errMsg); } /// <summary> /// 导出Excel /// </summary> /// <param name="dataTables">数据表格</param> /// <param name="absolutePath">导出Excel绝对路径,例如(C:\Users\wuzk\Desktop\Temporary\1.xlsx)</param> /// <param name="isAddStyle">是否添加固定单元格样式</param> /// <param name="errMsg">异常消息</param> /// <returns>成功或失败</returns> public static bool ExportDataToExcel(IEnumerable<DataTable> dataTables, string absolutePath, bool isAddStyle, out string errMsg) { bool result = true; errMsg = "导出Excel成功"; try { IWorkbook workbook = null; string fileEx = Path.GetExtension(absolutePath); switch (fileEx) { case ".xls": workbook = new HSSFWorkbook(); break; default: workbook = new XSSFWorkbook(); break; } int i = 0; foreach (DataTable dt in dataTables) { //创建工作簿名称 string sheetName = string.IsNullOrEmpty(dt.TableName) ? "Sheet " + (++i).ToString() : dt.TableName; ISheet sheet = workbook.CreateSheet(sheetName); //所有单元格列宽度 sheet.DefaultColumnWidth = 3 * 5; //创建列 IRow headerRow = sheet.CreateRow(0); //第一列的高度 headerRow.Height = 30 * 17; //赋值头部单元格样式 ICellStyle headerCellStyle = isAddStyle == true ? SetHeaderCellStyle(workbook) : workbook.CreateCellStyle(); //自动转行 headerCellStyle.WrapText = true; for (int j = 0; j < dt.Columns.Count; j++) { string columnName = string.IsNullOrEmpty(dt.Columns[j].ColumnName) ? "Column " + j.ToString() : dt.Columns[j].ColumnName; //设置列名称 headerRow.CreateCell(j).SetCellValue(columnName); //将定义样式赋给单元格 headerRow.GetCell(j).CellStyle = headerCellStyle; } //赋值头部单元格样式 ICellStyle otherCellStyle = isAddStyle == true ? SetOtherCellStyle(workbook) : workbook.CreateCellStyle(); //自动转行 otherCellStyle.WrapText = true; //创建行单元格并赋值 for (int k = 0; k < dt.Rows.Count; k++) { //第N行 DataRow dr = dt.Rows[k]; IRow row = sheet.CreateRow(k + 1); //第N行第N单元格 for (int r = 0; r < dt.Columns.Count; r++) { row.CreateCell(r).SetCellValue(dr[r] != DBNull.Value ? dr[r].ToString() : string.Empty); row.GetCell(r).CellStyle = otherCellStyle; } } } using (FileStream fs = File.Create(absolutePath)) { workbook.Write(fs); } } catch (Exception ex) { result = false; errMsg = ex.Message; } return result; } /// <summary> /// 导出Excel /// </summary> /// <param name="htColumns">要导出的列数据</param> /// <param name="dataSet">导出Excel数据</param> /// <param name="absolutePath">导出Excel绝对路径,例如(C:\Users\wuzk\Desktop\Temporary\1.xlsx)</param> /// <param name="msg">输出消息</param> /// <returns>成功或失败</returns> public static bool ExportDataToExcel(Dictionary<string, string> dicColumns, DataSet dataSet, string absolutePath, out string msg) { return ExportDataToExcel(dicColumns, dataSet.Tables[0], absolutePath, out msg); } /// <summary> /// 导出Excel /// </summary> /// <param name="htColumns">要导出的列数据</param> /// <param name="dataTable">导出Excel数据</param> /// <param name="absolutePath">导出Excel绝对路径,例如(C:\Users\wuzk\Desktop\Temporary\1.xlsx)</param> /// <param name="msg">输出消息</param> /// <returns>成功或失败</returns> public static bool ExportDataToExcel(Dictionary<string, string> dicColumns, DataTable dataTable, string absolutePath, out string msg) { bool result = true; msg = "导出Excel成功"; try { #region 实例化Nopi工作簿对象 IWorkbook workbook = null; string fileEx = Path.GetExtension(absolutePath); switch (fileEx) { case ".xls": workbook = new HSSFWorkbook(); break; default: workbook = new XSSFWorkbook(); break; } #endregion #region 构建列 //创建工作簿名称 string sheetName = dataTable.TableName; ISheet sheet = workbook.CreateSheet(sheetName); //所有单元格列宽度 sheet.DefaultColumnWidth = 3 * 5; //创建列 IRow headerRow = sheet.CreateRow(0); //第一列的高度 headerRow.Height = 30 * 17; //赋值头部单元格样式 ICellStyle headerCellStyle = SetHeaderCellStyle(workbook); //自动转行 headerCellStyle.WrapText = true; int i = 0; foreach (var columns in dicColumns) { headerRow.CreateCell(i).SetCellValue(columns.Value.ToString()); //将定义样式赋给单元格 headerRow.GetCell(i).CellStyle = headerCellStyle; i++; } #endregion #region 构建行 //赋值头部单元格样式 ICellStyle otherCellStyle = SetOtherCellStyle(workbook); //自动转行 otherCellStyle.WrapText = true; int j = 0; //创建行单元格并赋值 foreach (DataRow dataRow in dataTable.Rows) { //第N行 DataRow dr = dataTable.Rows[j]; IRow row = sheet.CreateRow(j + 1); int k = 0; foreach (var columns in dicColumns) { row.CreateCell(k).SetCellValue(dr[columns.Key.ToString()] != DBNull.Value ? dr[columns.Key.ToString()].ToString() : string.Empty); row.GetCell(k).CellStyle = otherCellStyle; k++; } j++; } #endregion #region 其他 using (FileStream fs = File.Create(absolutePath)) { workbook.Write(fs); } #endregion } catch (Exception ex) { result = false; msg = ex.Message; } return result; } /// <summary> /// 获取Excel数据 /// </summary> /// <param name="absolutePath">Excel绝对路径(C:\Users\wuzk\Desktop\Temporary\1.xlsx)</param> /// <param name="errMsg">异常消息</param> /// <returns>数据表格</returns> public static DataSet GetDataSetByExcel(string absolutePath, out string errMsg) { errMsg = "获取Excel数据成功"; DataSet ds = new DataSet(); List<DataTable> dtList = new List<DataTable>(); try { if (!File.Exists(absolutePath)) throw new FileNotFoundException("文件不存在"); Stream stream = new MemoryStream(File.ReadAllBytes(absolutePath)); IWorkbook workbook = null; string fileEx = Path.GetExtension(absolutePath); switch (fileEx) { case ".xls": workbook = new HSSFWorkbook(stream); break; default: workbook = new XSSFWorkbook(stream); break; } for (int i = 0; i < workbook.NumberOfSheets; i++) { DataTable dt = new DataTable(); dt.TableName = string.Format("Sheet{0}", i + 1); ISheet sheet = workbook.GetSheetAt(i); IRow headerRow = sheet.GetRow(0); int cellCount = headerRow.LastCellNum; for (int j = headerRow.FirstCellNum; j < cellCount; j++) { DataColumn column = new DataColumn(headerRow.GetCell(j).StringCellValue); dt.Columns.Add(column); } int rowCount = sheet.LastRowNum; for (int a = (sheet.FirstRowNum + 1); a < rowCount; a++) { IRow row = sheet.GetRow(a); if (row == null) continue; DataRow dr = dt.NewRow(); for (int b = row.FirstCellNum; b < cellCount; b++) { if (row.GetCell(b) == null) continue; dr[b] = row.GetCell(b).ToString(); } dt.Rows.Add(dr); } dtList.Add(dt); } stream.Close(); foreach (DataTable dt in dtList) { ds.Tables.Add(dt); } } catch (Exception ex) { errMsg = ex.Message; } return ds; } /// <summary> /// 设置头部样式 /// </summary> /// <param name="workbook">工作簿对象</param> /// <returns></returns> private static ICellStyle SetHeaderCellStyle(IWorkbook workbook) { //创建单元格样式对象 ICellStyle style = workbook.CreateCellStyle(); //垂直对齐居中 style.VerticalAlignment = VerticalAlignment.Center; //水平对齐居中 style.Alignment = HorizontalAlignment.Center; //设置字体前背景颜色 style.FillForegroundColor = HSSFColor.LightBlue.Index; style.FillPattern = FillPattern.SolidForeground; //设置单元格边框大小和边框前背景颜色 style.BorderBottom = BorderStyle.Thin; style.BorderLeft = BorderStyle.Thin; style.BorderRight = BorderStyle.Thin; style.BorderTop = BorderStyle.Thin; style.BottomBorderColor = HSSFColor.Black.Index; style.LeftBorderColor = HSSFColor.Black.Index; style.RightBorderColor = HSSFColor.Black.Index; style.TopBorderColor = HSSFColor.Black.Index; //创建一个字体样式对象 IFont font = workbook.CreateFont(); //设置字体 font.FontName = "宋体"; //设置字体尺寸(字号) font.FontHeightInPoints = 10; //设置字体加粗样式 font.Boldweight = (short)FontBoldWeight.Bold; //设置字体颜色 font.Color = HSSFColor.White.Index; //设置字体样式 style.SetFont(font); return style; } /// <summary> /// 设置其他单元格(除头部以下)样式 /// </summary> /// <param name="workbook">工作簿对象</param> /// <returns></returns> private static ICellStyle SetOtherCellStyle(IWorkbook workbook) { //创建其他单元格样式对象 ICellStyle otherCellStyle = workbook.CreateCellStyle(); //设置单元格边框大小和边框前背景颜色 otherCellStyle.BorderBottom = BorderStyle.Thin; otherCellStyle.BorderLeft = BorderStyle.Thin; otherCellStyle.BorderRight = BorderStyle.Thin; otherCellStyle.BorderTop = BorderStyle.Thin; otherCellStyle.BottomBorderColor = HSSFColor.Black.Index; otherCellStyle.LeftBorderColor = HSSFColor.Black.Index; otherCellStyle.RightBorderColor = HSSFColor.Black.Index; otherCellStyle.TopBorderColor = HSSFColor.Black.Index; //创建一个字体样式对象 IFont otherCellFont = workbook.CreateFont(); //设置字体 otherCellFont.FontName = "宋体"; //设置字体尺寸(字号) otherCellFont.FontHeightInPoints = 9; //设置字体样式 otherCellStyle.SetFont(otherCellFont); return otherCellStyle; } /// <summary> /// 组合Excel数据与数据库数据 /// </summary> /// <param name="outputDS">要合并的与合并后输出的数据集</param> /// <param name="byDS">要合并的数据集</param> /// <returns>数据集</returns> public static DataSet CombinedDataByDataSet(DataSet outputDS, DataSet byDS) { if (null != byDS && byDS.Tables.Count > 0) { DataRowCollection byDr = byDS.Tables[0].Rows; int cLen = byDS.Tables[0].Columns.Count; foreach (DataRow dr in byDr) { DataRow outputDr = outputDS.Tables[0].NewRow(); for (int i = 0; i < cLen; i++) { outputDr[i] = dr[i]; } outputDS.Tables[0].Rows.Add(outputDr); } } return outputDS; } /// <summary> /// list转变为DataSet /// </summary> /// <typeparam name="T">T型结构</typeparam> /// <param name="data">List数据</param> /// <returns>DataSet</returns> public static DataSet ToDataSet<T>(IList<T> data) { DataSet result = new DataSet(); DataTable dataTable = new DataTable(); if (data.Count > 0) { PropertyInfo[] propertys = data[0].GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { dataTable.Columns.Add(pi.Name, pi.PropertyType); } for (int i = 0; i < data.Count; i++) { ArrayList tempList = new ArrayList(); foreach (PropertyInfo pi in propertys) { object obj = pi.GetValue(data[i], null); tempList.Add(obj); } object[] array = tempList.ToArray(); dataTable.LoadDataRow(array, true); } } result.Tables.Add(dataTable); return result; } /// <summary> /// list转变为DataTable /// </summary> /// <typeparam name="T">T型结构</typeparam> /// <param name="data">List数据</param> /// <returns>DataTable</returns> public static DataTable ToDataTable<T>(this IList<T> data) { PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T)); DataTable dt = new DataTable(); for (int i = 0; i < properties.Count; i++) { PropertyDescriptor property = properties[i]; dt.Columns.Add(property.Name, property.PropertyType); } object[] values = new object[properties.Count]; foreach (T item in data) { for (int i = 0; i < values.Length; i++) { values[i] = properties[i].GetValue(item); } dt.Rows.Add(values); } return dt; } }
里面方法有根据Excel导出数据和根据数据导出Excel.由于自己也是因为近段时间功能开发需要而去学习的,方法并不是十分完整,希望诸位多多指导。
相关文章推荐
- 使用mybatis-generator自动生成代码
- 二叉树、B树、B+树、B*树、LSM树
- The way to select how large is diesel-engined keep an eye on
- Java内存区域与内存溢出
- jquery的幻灯片图片切换效果代码分享
- facebook share 功能demo
- js 格式化时间日期函数小结
- android捕获异常并保存到sd卡文件目录里
- winform创建不规则窗体的方法
- PHP学习---THINKCMF目录结构学习
- OpenGL坐标转换
- 死锁语法
- web.xml文件报错:cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'.
- 线程的优先级
- mac系统如何显示和隐藏文件.DS_Store
- ListView中的点击事件
- 有多少人输在了这个字上……
- Java中易错的一些小知识点
- Axure样式编辑器与变量管理
- json和jsonp的传输方式