.Net NPOI 根据excel模板导出excel、直接生成excel
一、根据Excel模板导出excel
1、导入NPOI.dll
2、DAL中添加类ExportExcel.cs
using NPOI.SS.UserModel; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; namespace DAL.Assessment {public class ExportExcel{NPOIExcel excel;//构造 采用模板方式public ExportExcel(string tempPath){excel = new NPOIExcel(tempPath);}/// <summary>/// 流的形式/// </summary>/// <returns></returns>private MemoryStream WriteToStream(){return excel.Save();}/// <summary>/// PPK 导出/// </summary>/// <param name="list"></param>/// <param name="fileName"></param>public void PPKToExcel(string ProductInfo,string avgWeightStr, string DivWeightStr, int[][] dataArray, string fileName){HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}", HttpUtility.UrlEncode(fileName)));HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("utf-8");HttpContext.Current.Response.Clear();ISheet sheet;sheet = excel.ActiveSheet;sheet.ForceFormulaRecalculation = true; //允许excel里的公式生效ICellStyle style = excel.CreateCellStyle();style.BorderBottom = BorderStyle.THIN;style.BorderLeft = BorderStyle.THIN;style.BorderRight = BorderStyle.THIN;style.BorderTop = BorderStyle.THIN;style.WrapText = true;style.VerticalAlignment = VerticalAlignment.CENTER;/// ICellStyle styleGray = excel.CreateCellStyle();styleGray.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.GREY_40_PERCENT.index;styleGray.FillPattern = FillPatternType.SOLID_FOREGROUND;//设置背景是否填充styleGray.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.GREY_40_PERCENT.index;styleGray.VerticalAlignment = VerticalAlignment.CENTER;excel.SetValue(3, 16, ProductInfo);excel.SetValue(3, 25, Convert.ToDouble(avgWeightStr));excel.SetValue(3, 28, Convert.ToDouble(DivWeightStr));excel.SetValue(4, 26, DateTime.Now);int rowIndex = 13;for (int i = 0; i < 6; i++){int colIndex = 2;for (int j = 0; j < dataArray[i].Length; j++){excel.SetValue(rowIndex, colIndex, Convert.ToDouble(dataArray[i][j]) / 100); //给excel里格子赋值//excel.SetStyle(rowIndex, colIndex, styleGray); 设置格式colIndex++;}rowIndex++;}byte[] fs;fs = WriteToStream().ToArray();HttpContext.Current.Response.BinaryWrite(WriteToStream().GetBuffer());HttpContext.Current.Response.End();}} } 添加 类NPOIExcel.cs
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.OleDb; using System.IO; using System.Drawing; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using NPOI.HSSF.Util; using NPOI.SS.Util;public class NPOIExcel {internal IWorkbook Book { get; set; }private int sheetID = 0;/// <summary>/// 当前活动的SheetID,所有的操作将指向这个Sheet/// </summary>public int ActiveSheetID{get{return sheetID;}set{sheetID = value;}}/// <summary>/// 当前活动的SheetName,所有的操作将指向这个Sheet/// </summary>public string ActiveSheetName{get{return Book.GetSheetAt(sheetID).SheetName;}set{sheetID = Book.GetSheetIndex(value);}}/// <summary>/// 当前活动的Sheet,所有的操作将指向这个Sheet/// </summary>public ISheet ActiveSheet{get{return Book.GetSheetAt(sheetID);}}/// <summary>/// 第一行非空行的行号/// </summary>public int FirstRowNum{get{return Book.GetSheetAt(sheetID).FirstRowNum;}}/// <summary>/// 最后一行非空行的行号/// </summary>public int LastRostNum{get{return Book.GetSheetAt(sheetID).LastRowNum;}}/// <summary>/// 无模板的Excel生成或操作/// </summary>public NPOIExcel(){Book = new HSSFWorkbook();Book.CreateSheet();}public NPOIExcel(Stream fileStream, string fileName){if (fileName.Substring(fileName.LastIndexOf(".")) == ".xls"){Book = new HSSFWorkbook(fileStream);}else{Book = new XSSFWorkbook(fileStream);}}/// <summary>/// 带模板或数据的Excel生成或操作/// </summary>/// <param name="fileName"></param>public NPOIExcel(string fileName){Book = CreateBook(fileName);}/// <summary>/// 创建Excel Book/// </summary>/// <param name="fileName">模板文件名</param>/// <returns></returns>private IWorkbook CreateBook(string fileName){FileInfo file = new FileInfo(fileName);if (!file.Exists){File.Create(fileName).Close();}FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);IWorkbook book;if (file.Extension == ".xls"){book = new HSSFWorkbook(fs);}else{book = new XSSFWorkbook(fs);}fs.Close();if (book.NumberOfSheets == 0){book.CreateSheet();}return book;}/// <summary>/// 新建Sheet/// </summary>/// <returns>新建Sheet</returns>public ISheet CreateSheet(){return Book.CreateSheet();}/// <summary>/// 新建Sheet/// </summary>/// <param name="sheetName">新建Sheet的名称</param>/// <returns>新建Sheet</returns>public ISheet CreateSheet(string sheetName){return Book.CreateSheet(sheetName);}/// <summary>/// 设置行高/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>/// <param name="height">高度</param>public void SetRowHeight(int rowIndex, float height){IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);if (row == null){row = Book.GetSheetAt(sheetID).CreateRow(rowIndex);}row.Height = (short)(height * 20);}/// <summary>/// 设置列宽/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="columnIndex">列号</param>/// <param name="width">宽度</param>public void SetColumnWidth(int columnIndex, short width){Book.GetSheetAt(sheetID).SetColumnWidth(columnIndex, width * 256);}/// <summary>/// 获取或设置默认行高/// 注:只对当前ActiveSheet有效/// </summary>public short DefaultRowHeight{get{return (short)(Book.GetSheetAt(sheetID).DefaultRowHeight / 20);}set{Book.GetSheetAt(sheetID).DefaultRowHeight = value * 20;}}/// <summary>/// 获取或设置默认列宽/// 注:只对当前ActiveSheet有效/// </summary>public int DefaultColWidth{get{return Book.GetSheetAt(sheetID).DefaultColumnWidth;}set{Book.GetSheetAt(sheetID).DefaultColumnWidth = value;}}/// <summary>/// 某一列的列宽自动调整大小/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="colIndex">列号</param>public void AutoColWidth(int colIndex){Book.GetSheetAt(sheetID).AutoSizeColumn(colIndex, true);}/// <summary>/// 隐藏一行/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>public void HiddenRow(int rowIndex){IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);if (row == null){row = Book.GetSheetAt(sheetID).CreateRow(rowIndex);}row.ZeroHeight = true;}/// <summary>/// 删除一行/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>public void RemoveRow(int rowIndex){IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);if (row != null){ActiveSheet.RemoveRow(row);}}/// <summary>/// 读取单元格的值/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>/// <param name="columnIndex">列号</param>/// <returns>单元格的值</returns>public object ReadValue(int rowIndex, int columnIndex, bool? isDateTime = null){try{ICell cell = Book.GetSheetAt(sheetID).GetRow(rowIndex).GetCell(columnIndex);short df = cell.CellStyle.DataFormat;//return cell.ToString();switch (cell.CellType){case CellType.BLANK:return null;case CellType.BOOLEAN:return cell.BooleanCellValue;case CellType.ERROR:throw new Exception("Cell Value Error");case CellType.FORMULA:{switch (cell.CachedFormulaResultType){case CellType.BLANK:return "";case CellType.BOOLEAN:return cell.BooleanCellValue;case CellType.ERROR:throw new Exception("Cell Value Error");case CellType.FORMULA:throw new Exception("The formula of this cell is too complex!");case CellType.NUMERIC:if (isDateTime == null){if (DateUtil.IsCellDateFormatted(cell)){return cell.DateCellValue;}else{return cell.NumericCellValue;}}else if (isDateTime == true){return cell.DateCellValue;}else{return cell.NumericCellValue;}case CellType.STRING:return cell.StringCellValue;case CellType.Unknown:return cell.ToString();default:return cell.ToString();}}case CellType.NUMERIC:{if (isDateTime == null){if (DateUtil.IsCellDateFormatted(cell)){return cell.DateCellValue;}else{return cell.NumericCellValue;}}else if (isDateTime == true){return cell.DateCellValue;}else{return cell.NumericCellValue;}}case CellType.STRING:return cell.StringCellValue;case CellType.Unknown:return cell.ToString();default:return cell.ToString();}}catch (System.NullReferenceException){return null;}catch (Exception ex){throw ex;}}/// <summary>/// 设置单元格的值/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>/// <param name="columnIndex">列号</param>/// <param name="value">单元格的值</param>public void SetValue(int rowIndex, int columnIndex, object value){SetValue(rowIndex, columnIndex, value, false);}/// <summary>/// 设置单元格的值/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>/// <param name="columnIndex">列号</param>/// <param name="value">单元格的值</param>/// <param name="isFormula">是否是公式</param>public void SetValue(int rowIndex, int columnIndex, object value, bool isFormula){IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);if (row == null){row = Book.GetSheetAt(sheetID).CreateRow(rowIndex);}ICell cell = row.GetCell(columnIndex);if (cell == null){cell = row.CreateCell(columnIndex);}if (value == null){cell.SetCellValue("");}if (isFormula){cell.SetCellFormula(value.ToString());}else{if (value is short){cell.SetCellValue((short)value);}else if (value is int){cell.SetCellValue((int)value);}else if (value is long){cell.SetCellValue((long)value);}else if (value is float){cell.SetCellValue((float)value);}else if (value is double){cell.SetCellValue((double)value);}else if (value is bool){cell.SetCellValue((bool)value);}else if (value is DateTime){cell.SetCellValue((DateTime)value);}else if (value == null){}else{cell.SetCellValue(value.ToString());}}}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="type">验证类型</param>/// <param name="operatorType">验证方式</param>/// <param name="minValue">最小值</param>/// <param name="maxValue">最大值</param>public void SetValueRange(int startRowIndex, int EndRowIndex, int startColInex, int endColIndex, NPOIDataType type, OperatorTypes operatorType, string minValue, string maxValue){SetValueRange(startRowIndex, EndRowIndex, startColInex, endColIndex, type, operatorType, minValue, maxValue, "", "");}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="type">验证类型</param>/// <param name="operatorType">验证方式</param>/// <param name="minValue">最小值</param>/// <param name="maxValue">最大值</param>/// <param name="formate">数据格式</param>public void SetValueRange(int startRowIndex, int EndRowIndex, int startColInex, int endColIndex, NPOIDataType type, OperatorTypes operatorType, string minValue, string maxValue, string formate){SetValueRange(startRowIndex, EndRowIndex, startColInex, endColIndex, type, operatorType, minValue, maxValue, formate, "");}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="type">验证类型</param>/// <param name="operatorType">验证方式</param>/// <param name="minValue">最小值</param>/// <param name="maxValue">最大值</param>/// <param name="formate">数据格式</param>/// <param name="AlertMassage">报错信息</param>public void SetValueRange(int startRowIndex, int EndRowIndex, int startColInex, int endColIndex, NPOIDataType type, OperatorTypes operatorType, string minValue, string maxValue, string formate, string AlertMassage){CellRangeAddressList regions = new CellRangeAddressList(startRowIndex, EndRowIndex, startColInex, endColIndex);DVConstraint constraint = DVConstraint.CreateNumericConstraint(ValidationType.ANY, 0, null, null);switch (type){case NPOIDataType.Integer:constraint = DVConstraint.CreateNumericConstraint(ValidationType.INTEGER, (int)operatorType, minValue, maxValue);break;case NPOIDataType.Float:constraint = DVConstraint.CreateNumericConstraint(ValidationType.DECIMAL, (int)operatorType, minValue, maxValue);break;case NPOIDataType.Date:if (formate == ""){formate = "yyyy/MM/dd";}constraint = DVConstraint.CreateDateConstraint((int)operatorType, minValue, maxValue, formate);break;case NPOIDataType.Time:constraint = DVConstraint.CreateTimeConstraint((int)operatorType, minValue, maxValue);break;case NPOIDataType.TextLength:constraint = DVConstraint.CreateNumericConstraint(ValidationType.TEXT_LENGTH, (int)operatorType, minValue, maxValue);break;default:break;}HSSFDataValidation dataValidate1 = new HSSFDataValidation(regions, constraint);if (!string.IsNullOrEmpty(AlertMassage)){dataValidate1.CreateErrorBox("Error", AlertMassage);}ActiveSheet.AddValidationData(dataValidate1);}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="dataRange">值系列</param>public void SetValueRange(int startRowIndex, int EndRowIndex, int startColInex, int endColIndex, string[] dataRange){SetValueRange(startRowIndex, EndRowIndex, startColInex, endColIndex, dataRange, "");}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="dataRange">值系列</param>/// <param name="alertMassage">报错信息</param>public void SetValueRange(int startRowIndex, int endRowIndex, int startColInex, int endColIndex, string[] dataRange, string alertMassage){ISheetConditionalFormatting hscf = ActiveSheet.SheetConditionalFormatting;CellRangeAddress[] regions = {new CellRangeAddress(startRowIndex, endRowIndex,startColInex,endColIndex)};CellRangeAddressList rangeList = new CellRangeAddressList();rangeList.AddCellRangeAddress(new CellRangeAddress(startRowIndex, endRowIndex, startColInex, endColIndex));DVConstraint dvconstraint = DVConstraint.CreateExplicitListConstraint(dataRange);HSSFDataValidation dataValidation = new HSSFDataValidation(rangeList, dvconstraint);if (!string.IsNullOrEmpty(alertMassage)){dataValidation.CreateErrorBox("Error", alertMassage);}ActiveSheet.AddValidationData(dataValidation);}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="formula">计算公式</param>/// <param name="alertMassage">报错信息</param>public void SetValueRange(int startRowIndex, int endRowIndex, int startColInex, int endColIndex, string formula, string alertMassage){ISheetConditionalFormatting hscf = ActiveSheet.SheetConditionalFormatting;CellRangeAddress[] regions = {new CellRangeAddress(startRowIndex, endRowIndex,startColInex,endColIndex)};CellRangeAddressList rangeList = new CellRangeAddressList();rangeList.AddCellRangeAddress(new CellRangeAddress(startRowIndex, endRowIndex, startColInex, endColIndex));DVConstraint dvconstraint = DVConstraint.CreateFormulaListConstraint(formula);HSSFDataValidation dataValidation = new HSSFDataValidation(rangeList, dvconstraint);if (!string.IsNullOrEmpty(alertMassage)){dataValidation.CreateErrorBox("Error", alertMassage);}ActiveSheet.AddValidationData(dataValidation);}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="formula">计算公式</param>public void SetValueRange(int startRowIndex, int endRowIndex, int startColInex, int endColIndex, string formula){SetValueRange(startRowIndex, endColIndex, startRowIndex, endColIndex, formula, "");}/// <summary>/// 生成单元格样式/// </summary>/// <returns>与当前Excel相关的单元格样式</returns>public ICellStyle CreateCellStyle(){return Book.CreateCellStyle();}/// <summary>/// 生成字体/// </summary>/// <returns>与当前Excel相关的字体</returns>public IFont CreateFont(){return Book.CreateFont();}/// <summary>/// 设置单元格样式/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>/// <param name="columnIndex">列号</param>/// <param name="style">样式</param>public void SetStyle(int rowIndex, int columnIndex, ICellStyle style){IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);if (row == null){row = Book.GetSheetAt(sheetID).CreateRow(rowIndex);}ICell cell = row.GetCell(columnIndex);if (cell == null){cell = row.CreateCell(columnIndex);}cell.CellStyle = style;}/// <summary>/// 合并单元格/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行号</param>/// <param name="startColumnIndex">开始列号</param>/// <param name="endRowIndex">结束行号</param>/// <param name="endColumnIndex">结束列号</param>public void MergeCells(int startRowIndex, int startColumnIndex, int endRowIndex, int endColumnIndex){int index = Book.GetSheetAt(sheetID).AddMergedRegion(new CellRangeAddress(startRowIndex, endRowIndex, startColumnIndex, endColumnIndex));}/// <summary>/// 拆分单元格/// 注1:只对当前ActiveSheet有效/// 注2:只有合并的单元格才能拆分/// </summary>/// <param name="startRowIndex">开始行号</param>/// <param name="startColumnIndex">开始列号</param>public void UnMergeCells(int startRowIndex, int startColumnIndex){int merges = Book.GetSheetAt(sheetID).NumMergedRegions;CellRangeAddress merge;for (int i = 0; i < merges; i++){merge = Book.GetSheetAt(sheetID).GetMergedRegion(i);if (merge.FirstRow == startRowIndex && merge.FirstColumn == startColumnIndex){Book.GetSheetAt(sheetID).RemoveMergedRegion(i);break;}}}/// <summary>/// 保存到文件/// 注:有模板的,文件扩展名与模板一样;没有模板的,文件扩展名为“.xls”;/// </summary>/// <param name="fileName">保存文件名</param>public void Save(string fileName){FileStream file = new FileStream(fileName, FileMode.Create);Book.Write(file);file.Close();}/// <summary>/// 保存到流/// 注:保存或下载时,有模板的,文件扩展名与模板一样;没有模板的,文件扩展名为“.xls”;/// </summary>/// <returns>内存流</returns>public MemoryStream Save(){MemoryStream ms = new MemoryStream();Book.Write(ms);return ms;}/// <summary>/// 把Excel读成DataSet/// 注:必须是正规表格式/// </summary>/// <returns>读出的Excel</returns>public DataSet ReadAsDataSet(){DataSet rtn = new DataSet();for (int i = 0; i < SheetCount; i++){ISheet sheet = Book.GetSheetAt(i);rtn.Tables.Add(GetDataTableBySheet(sheet));}return rtn;}private DataTable GetDataTableBySheet(ISheet sheet){DataTable dt = new DataTable(sheet.SheetName);int maxCols = 0;object value;while ((value = ReadValue(sheet, 0, maxCols)) != null){dt.Columns.Add(value.ToString());maxCols++;}int row = 1;bool emptyRow = false;int emptyRowCount = 0;while (emptyRowCount < 10){emptyRow = true;DataRow dr = dt.NewRow();for (int i = 0; i < maxCols; i++){value = ReadValue(sheet, row, i);if (value != null){dr[i] = value;emptyRow = false;}}if (!emptyRow){dt.Rows.Add(dr);emptyRowCount = 0;}else{emptyRowCount++;}row++;}return dt;}/// <summary>/// 根据SheetName导出数据为DataTable/// </summary>/// <param name="sheetName">Sheet名称</param>/// <returns></returns>public DataTable GetDataTableBySheet(string sheetName){ISheet sheet = Book.GetSheet(sheetName);if (sheet != null){return GetDataTableBySheet(sheet);}return null;}/// <summary>/// 根据SheetName导出数据为DataTable/// </summary>/// <param name="sheetIndex">Sheet编号</param>/// <returns></returns>public DataTable GetDataTableBySheet(int sheetIndex){ISheet sheet = Book.GetSheetAt(sheetIndex);if (sheet != null){return GetDataTableBySheet(sheet);}return null;}/// <summary>/// 写入表格/// </summary>/// <param name="Data">表格数据</param>/// <param name="col">写入的起始列</param>/// <param name="row">写入的起始行</param>/// <param name="titleColor">标题颜色</param>/// <param name="fullBorder">是否需要四周边框</param>public void WriteDataTable(DataTable Data, int col = 1, int row = 1, short? titleColor = null, bool fullBorder = true){if (Data == null){return;}var titleStyle = CreateCellStyle();var rowStyle = CreateCellStyle();if (titleColor != null)titleStyle.FillForegroundColor = titleColor.Value;titleStyle.FillPattern = FillPatternType.SOLID_FOREGROUND;if (fullBorder){titleStyle.BorderBottom = BorderStyle.THIN;titleStyle.BorderLeft = BorderStyle.THIN;titleStyle.BorderRight = BorderStyle.THIN;titleStyle.BorderTop = BorderStyle.THIN;titleStyle.BottomBorderColor = NPOIColor.BLACK;titleStyle.LeftBorderColor = NPOIColor.BLACK;titleStyle.RightBorderColor = NPOIColor.BLACK;titleStyle.TopBorderColor = NPOIColor.BLACK;rowStyle.BorderBottom = BorderStyle.THIN;rowStyle.BorderLeft = BorderStyle.THIN;rowStyle.BorderRight = BorderStyle.THIN;rowStyle.BorderTop = BorderStyle.THIN;rowStyle.BottomBorderColor = NPOIColor.BLACK;rowStyle.LeftBorderColor = NPOIColor.BLACK;rowStyle.RightBorderColor = NPOIColor.BLACK;rowStyle.TopBorderColor = NPOIColor.BLACK;}int iCol = 0, iRow = 1;foreach (DataColumn dc in Data.Columns){SetValue(row, col + iCol, dc.ColumnName);SetStyle(row, col + iCol, titleStyle);iCol++;}rowStyle.FillForegroundColor = NPOIColor.WHITE;foreach (DataRow dr in Data.Rows){iCol = 0;foreach (DataColumn dc in Data.Columns){SetValue(row + iRow, col + iCol, dr[dc]);SetStyle(row + iRow, col + iCol, rowStyle);iCol++;}iRow++;}for (int i = 0; i < iCol; i++){this.AutoColWidth(i);}}/// <summary>/// 读取单元格的值/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>/// <param name="columnIndex">列号</param>/// <returns>单元格的值</returns>public object ReadValue(ISheet sheet, int rowIndex, int columnIndex, bool? isDateTime = null){try{ICell cell = sheet.GetRow(rowIndex).GetCell(columnIndex);short df = cell.CellStyle.DataFormat;//return cell.ToString();switch (cell.CellType){case CellType.BLANK:return null;case CellType.BOOLEAN:return cell.BooleanCellValue;case CellType.ERROR:throw new Exception("Cell Value Error");case CellType.FORMULA:{switch (cell.CachedFormulaResultType){case CellType.BLANK:return "";case CellType.BOOLEAN:return cell.BooleanCellValue;case CellType.ERROR:throw new Exception("Cell Value Error");case CellType.FORMULA:throw new Exception("The formula of this cell is too complex!");case CellType.NUMERIC:if (isDateTime == null){if (DateUtil.IsCellDateFormatted(cell)){return cell.DateCellValue;}else{return cell.NumericCellValue;}}else if (isDateTime == true){return cell.DateCellValue;}else{return cell.NumericCellValue;}case CellType.STRING:return cell.StringCellValue;case CellType.Unknown:return cell.ToString();default:return cell.ToString();}}case CellType.NUMERIC:{if (isDateTime == null){if (DateUtil.IsCellDateFormatted(cell)){return cell.DateCellValue;}else{return cell.NumericCellValue;}}else if (isDateTime == true){return cell.DateCellValue;}else{return cell.NumericCellValue;}}case CellType.STRING:return cell.StringCellValue;case CellType.Unknown:return cell.ToString();default:return cell.ToString();}}catch (System.NullReferenceException){return null;}catch (Exception ex){throw ex;}}public int SheetCount{get{return Book.NumberOfSheets;}}public string GetSheetName(int index){return Book.GetSheetName(index);}public void AddPicture(byte[] data, int row, int col){int picIndex = Book.AddPicture(data, PictureType.PNG);IDrawing draw = ActiveSheet.CreateDrawingPatriarch();IClientAnchor anchor = draw.CreateAnchor(0, 0, 255, 255, col, row, col + 5, col + 5);IPicture pic = draw.CreatePicture(anchor, picIndex);pic.Resize();} }public enum OperatorTypes {/// <summary>/// 介于最大值与小值之间/// </summary>BETWEEN = OperatorType.BETWEEN,/// <summary>/// 等于最小值/// </summary>EQUAL = OperatorType.EQUAL,/// <summary>/// 大于或等于最小值/// </summary>GREATER_OR_EQUAL = OperatorType.GREATER_OR_EQUAL,/// <summary>/// 大于最小值/// </summary>GREATER_THAN = OperatorType.GREATER_THAN,/// <summary>/// 忽略/// </summary>NO_COMPARISON = OperatorType.IGNORED,/// <summary>/// 小于或等于最小值/// </summary>LESS_OR_EQUAL = OperatorType.LESS_OR_EQUAL,/// <summary>/// 小于最小值/// </summary>LESS_THAN = OperatorType.LESS_THAN,/// <summary>/// 不在最小值与最大值之间/// </summary>NOT_BETWEEN = OperatorType.NOT_BETWEEN,/// <summary>/// 不等于最小值/// </summary>NOT_EQUAL = OperatorType.NOT_EQUAL }public enum NPOIDataType {/// <summary>/// 验证整数/// </summary> Integer,/// <summary>/// 验证符点数/// </summary> Float,/// <summary>/// 验证日期/// </summary> Date,/// <summary>/// 验证时间/// </summary> Time,/// <summary>/// 验证字符长度/// </summary> TextLength }public static class NPOIColor {/// <summary>/// 红色/// </summary>public static short RED { get { return NPOI.HSSF.Util.HSSFColor.RED.index; } }/// <summary>/// 蓝色/// </summary>public static short BLUE { get { return NPOI.HSSF.Util.HSSFColor.BLUE.index; } }/// <summary>/// 浅绿色/// </summary>public static short AQUA { get { return NPOI.HSSF.Util.HSSFColor.AQUA.index; } }/// <summary>/// 自动/// </summary>public static short AUTOMATIC { get { return NPOI.HSSF.Util.HSSFColor.AUTOMATIC.index; } }/// <summary>/// 黑色/// </summary>public static short BLACK { get { return NPOI.HSSF.Util.HSSFColor.BLACK.index; } }/// <summary>/// 蓝灰色/// </summary>public static short BLUE_GREY { get { return NPOI.HSSF.Util.HSSFColor.BLUE_GREY.index; } }/// <summary>/// 明绿色/// </summary>public static short BRIGHT_GREEN { get { return NPOI.HSSF.Util.HSSFColor.BRIGHT_GREEN.index; } }/// <summary>/// 棕色/// </summary>public static short BROWN { get { return NPOI.HSSF.Util.HSSFColor.BROWN.index; } }/// <summary>/// 正常/// </summary>public static short COLOR_NORMAL { get { return NPOI.HSSF.Util.HSSFColor.COLOR_NORMAL; } }/// <summary>/// 珊瑚色/// </summary>public static short CORAL { get { return NPOI.HSSF.Util.HSSFColor.CORAL.index; } }/// <summary>/// 亮蓝色/// </summary>public static short CORNFLOWER_BLUE { get { return NPOI.HSSF.Util.HSSFColor.CORNFLOWER_BLUE.index; } }/// <summary>/// 深蓝色/// </summary>public static short DARK_BLUE { get { return NPOI.HSSF.Util.HSSFColor.DARK_BLUE.index; } }/// <summary>/// 深绿色/// </summary>public static short DARK_GREEN { get { return NPOI.HSSF.Util.HSSFColor.DARK_GREEN.index; } }/// <summary>/// 深红色/// </summary>public static short DARK_RED { get { return NPOI.HSSF.Util.HSSFColor.DARK_RED.index; } }/// <summary>/// 深茶色/// </summary>public static short DARK_TEAL { get { return NPOI.HSSF.Util.HSSFColor.DARK_TEAL.index; } }/// <summary>/// 深黄/// </summary>public static short DARK_YELLOW { get { return NPOI.HSSF.Util.HSSFColor.DARK_YELLOW.index; } }/// <summary>/// 金色/// </summary>public static short GOLD { get { return NPOI.HSSF.Util.HSSFColor.GOLD.index; } }/// <summary>/// 绿色/// </summary>public static short GREEN { get { return NPOI.HSSF.Util.HSSFColor.GREEN.index; } }/// <summary>/// 25%灰色/// </summary>public static short GREY_25_PERCENT { get { return NPOI.HSSF.Util.HSSFColor.GREY_25_PERCENT.index; } }/// <summary>/// 40%灰色/// </summary>public static short GREY_40_PERCENT { get { return NPOI.HSSF.Util.HSSFColor.GREY_40_PERCENT.index; } }/// <summary>/// 50%灰色/// </summary>public static short GREY_50_PERCENT { get { return NPOI.HSSF.Util.HSSFColor.GREY_50_PERCENT.index; } }/// <summary>/// 80%灰色/// </summary>public static short GREY_80_PERCENT { get { return NPOI.HSSF.Util.HSSFColor.GREY_80_PERCENT.index; } }/// <summary>/// 靛蓝色/// </summary>public static short INDIGO { get { return NPOI.HSSF.Util.HSSFColor.INDIGO.index; } }/// <summary>/// 淡紫色/// </summary>public static short LAVENDER { get { return NPOI.HSSF.Util.HSSFColor.LAVENDER.index; } }/// <summary>/// 粉黄色/// </summary>public static short LEMON_CHIFFON { get { return NPOI.HSSF.Util.HSSFColor.LEMON_CHIFFON.index; } }/// <summary>/// 淡蓝色/// </summary>public static short LIGHT_BLUE { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_BLUE.index; } }/// <summary>/// 淡亮蓝色/// </summary>public static short LIGHT_CORNFLOWER_BLUE { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_CORNFLOWER_BLUE.index; } }/// <summary>/// 淡绿色/// </summary>public static short LIGHT_GREEN { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_GREEN.index; } }/// <summary>/// 淡桔黄色/// </summary>public static short LIGHT_ORANGE { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_ORANGE.index; } }/// <summary>/// 淡蓝绿色/// </summary>public static short LIGHT_TURQUOISE { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_TURQUOISE.index; } }/// <summary>/// 淡黄色/// </summary>public static short LIGHT_YELLOW { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_YELLOW.index; } }/// <summary>/// 绿黄色/// </summary>public static short LIME { get { return NPOI.HSSF.Util.HSSFColor.LIME.index; } }/// <summary>/// 栗色/// </summary>public static short MAROON { get { return NPOI.HSSF.Util.HSSFColor.MAROON.index; } }/// <summary>/// 橄榄绿色/// </summary>public static short OLIVE_GREEN { get { return NPOI.HSSF.Util.HSSFColor.OLIVE_GREEN.index; } }/// <summary>/// 桔色/// </summary>public static short ORANGE { get { return NPOI.HSSF.Util.HSSFColor.ORANGE.index; } }/// <summary>/// 白灰蓝色/// </summary>public static short PALE_BLUE { get { return NPOI.HSSF.Util.HSSFColor.PALE_BLUE.index; } }/// <summary>/// 粉红色/// </summary>public static short PINK { get { return NPOI.HSSF.Util.HSSFColor.PINK.index; } }/// <summary>/// 紫红色/// </summary>public static short PLUM { get { return NPOI.HSSF.Util.HSSFColor.PLUM.index; } }/// <summary>/// 玫瑰红色/// </summary>public static short ROSE { get { return NPOI.HSSF.Util.HSSFColor.ROSE.index; } }/// <summary>/// 高贵蓝/// </summary>public static short ROYAL_BLUE { get { return NPOI.HSSF.Util.HSSFColor.ROYAL_BLUE.index; } }/// <summary>/// 海绿色/// </summary>public static short SEA_GREEN { get { return NPOI.HSSF.Util.HSSFColor.SEA_GREEN.index; } }/// <summary>/// 天空蓝/// </summary>public static short SKY_BLUE { get { return NPOI.HSSF.Util.HSSFColor.SKY_BLUE.index; } }/// <summary>/// 棕褐色/// </summary>public static short TAN { get { return NPOI.HSSF.Util.HSSFColor.TAN.index; } }/// <summary>/// 茶色/// </summary>public static short TEAL { get { return NPOI.HSSF.Util.HSSFColor.TEAL.index; } }/// <summary>/// 蓝绿色/// </summary>public static short TURQUOISE { get { return NPOI.HSSF.Util.HSSFColor.TURQUOISE.index; } }/// <summary>/// 紫色/// </summary>public static short VIOLET { get { return NPOI.HSSF.Util.HSSFColor.VIOLET.index; } }/// <summary>/// 白色/// </summary>public static short WHITE { get { return NPOI.HSSF.Util.HSSFColor.WHITE.index; } }/// <summary>/// 黄色/// </summary>public static short YELLOW { get { return NPOI.HSSF.Util.HSSFColor.YELLOW.index; } }}/// <summary> /// 针对excel的Oledb /// </summary> public class OleDbExcel {/// <summary>/// OLEDB连接/// </summary>public OleDbConnection Connection{get;set;}/// <summary>/// 用Oledb对Excel进行操作/// 注:必须是标准表形式Excel内容/// </summary>/// <param name="excelFile">Excel文件</param>public OleDbExcel(string excelFile){string conStr = string.Empty;FileInfo file = new FileInfo(excelFile);if (!file.Exists) { throw new Exception("文件不存在"); }string extension = file.Extension;switch (extension){case ".xls":conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFile + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";break;case ".xlsx":conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFile + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";break;default:conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFile + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";break;}//链接ExcelConnection = new OleDbConnection(conStr);}private List<string> tableNames;/// <summary>/// 获取Excel内的Sheet名称/// </summary>public List<string> Sheets{get{if (tableNames == null){try{tableNames = new List<string>();//读取Excel里面的sheet名 Connection.Open();DataTable schemaTable = Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });for (int i = 0; i < schemaTable.Rows.Count; i++){DataRow dr = schemaTable.Rows[i];string tbName = dr["table_name"].ToString();if (tbName[tbName.Length - 1] == '$'){tableNames.Add(tbName);}}Connection.Close();}catch (Exception ex){if (Connection.State != ConnectionState.Closed){Connection.Close();}throw new Exception(ex.Message, ex);}}return tableNames;}}/// <summary>/// 查询出所有数据/// </summary>/// <param name="tableName">Sheet名称</param>/// <returns>sheet内的所有数据</returns>public DataSet QueryAll(string tableName){try{DataSet excelData = new DataSet();OleDbDataAdapter adapter = new OleDbDataAdapter();adapter.SelectCommand = new OleDbCommand();adapter.SelectCommand.Connection = Connection;adapter.SelectCommand.CommandText = string.Format("SELECT * FROM {0}", "[" + tableName + "]");adapter.Fill(excelData);return excelData;}catch (Exception ex){if (Connection.State != ConnectionState.Closed){Connection.Close();}throw new Exception(ex.Message, ex);}}/// <summary>/// 查询出所有数据/// </summary>/// <param name="tableIndex">Sheet序号(从0开始)</param>/// <returns>sheet内的所有数据</returns>public DataSet QueryAll(int tableIndex){return QueryAll(Sheets[tableIndex]);}/// <summary>/// 利用Sql进行查询/// </summary>/// <param name="sql">Sql语句</param>/// <returns>查询出的数据</returns>public DataSet Query(string sql){try{DataSet excelData = new DataSet();OleDbDataAdapter adapter = new OleDbDataAdapter(sql, Connection);adapter.Fill(excelData);return excelData;}catch (Exception ex){if (Connection.State != ConnectionState.Closed){Connection.Close();}throw new Exception(ex.Message, ex);}}/// <summary>/// 利用Sql进行查询/// </summary>/// <param name="sql">Sql语句</param>/// <param name="param">查询参数</param>/// <returns>查询出的数据</returns>public DataSet Query(string sql, params OleDbParameter[] param){try{DataSet excelData = new DataSet();OleDbDataAdapter adapter = new OleDbDataAdapter(sql, Connection);adapter.SelectCommand.Parameters.AddRange(param);adapter.Fill(excelData);return excelData;}catch (Exception ex){if (Connection.State != ConnectionState.Closed){Connection.Close();}throw new Exception(ex.Message, ex);}}/// <summary>/// 利用Sql进行数据操作/// </summary>/// <param name="sql">sql语句</param>/// <returns>影响的行数</returns>public int ExecuteSql(string sql){try{Connection.Open();OleDbCommand cmd = Connection.CreateCommand();cmd.CommandText = sql;int rtn = cmd.ExecuteNonQuery();Connection.Close();return rtn;}catch (Exception ex){if (Connection.State != ConnectionState.Closed){Connection.Close();}throw new Exception(ex.Message, ex);}}/// <summary>/// 利用Sql进行数据操作/// </summary>/// <param name="sql">sql语句</param>/// <param name="param">执行参数</param>/// <returns>影响的行数</returns>public int ExecuteSql(string sql, params OleDbParameter[] param){try{Connection.Open();OleDbCommand cmd = Connection.CreateCommand();cmd.CommandText = sql;cmd.Parameters.AddRange(param);int rtn = cmd.ExecuteNonQuery();Connection.Close();return rtn;}catch (Exception ex){if (Connection.State != ConnectionState.Closed){Connection.Close();}throw new Exception(ex.Message, ex);}} }
View Code
3、使用前台调用 传入参数,获取数据
[HttpPost] public string PPKExport(string id) {var ProductInfo = "";
var avgWeightStr = "";
var DivWeightStr = "";int[][] dataArray = new int[8][];
string templateFile = "~/ExcelTemp/PPKTemplate.xls"; //模板位置ex = new ExportExcel(Server.MapPath(templateFile));string fileName = "Xbar-R控制图.xls"; //导出的excel命名ex.PPKToExcel(ProductInfo,avgWeightStr, DivWeightStr, dataArray, fileName); //传入参数return fileName; }
4、效果
界面导出按钮
点击导出按钮,选择位置保存即可。
二、将界面table里的内容直接生成excel
1、操作excel的NPOI工具类
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.OleDb; using System.IO; using System.Drawing; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using NPOI.HSSF.Util; using NPOI.SS.Util;public class NPOIExcel {internal IWorkbook Book { get; set; }private int sheetID = 0;/// <summary>/// 当前活动的SheetID,所有的操作将指向这个Sheet/// </summary>public int ActiveSheetID{get{return sheetID;}set{sheetID = value;}}/// <summary>/// 当前活动的SheetName,所有的操作将指向这个Sheet/// </summary>public string ActiveSheetName{get{return Book.GetSheetAt(sheetID).SheetName;}set{sheetID = Book.GetSheetIndex(value);}}/// <summary>/// 当前活动的Sheet,所有的操作将指向这个Sheet/// </summary>public ISheet ActiveSheet{get{return Book.GetSheetAt(sheetID);}}/// <summary>/// 第一行非空行的行号/// </summary>public int FirstRowNum{get{return Book.GetSheetAt(sheetID).FirstRowNum;}}/// <summary>/// 最后一行非空行的行号/// </summary>public int LastRostNum{get{return Book.GetSheetAt(sheetID).LastRowNum;}}/// <summary>/// 无模板的Excel生成或操作/// </summary>public NPOIExcel(){Book = new HSSFWorkbook();Book.CreateSheet();}public NPOIExcel(Stream fileStream, string fileName){if (fileName.Substring(fileName.LastIndexOf(".")) == ".xls"){Book = new HSSFWorkbook(fileStream);}else{Book = new XSSFWorkbook(fileStream);}}/// <summary>/// 带模板或数据的Excel生成或操作/// </summary>/// <param name="fileName"></param>public NPOIExcel(string fileName){Book = CreateBook(fileName);}/// <summary>/// 创建Excel Book/// </summary>/// <param name="fileName">模板文件名</param>/// <returns></returns>private IWorkbook CreateBook(string fileName){FileInfo file = new FileInfo(fileName);if (!file.Exists){File.Create(fileName).Close();}FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);IWorkbook book;if (file.Extension == ".xls"){book = new HSSFWorkbook(fs);}else{book = new XSSFWorkbook(fs);}fs.Close();if (book.NumberOfSheets == 0){book.CreateSheet();}return book;}/// <summary>/// 新建Sheet/// </summary>/// <returns>新建Sheet</returns>public ISheet CreateSheet(){return Book.CreateSheet();}/// <summary>/// 新建Sheet/// </summary>/// <param name="sheetName">新建Sheet的名称</param>/// <returns>新建Sheet</returns>public ISheet CreateSheet(string sheetName){return Book.CreateSheet(sheetName);}/// <summary>/// 设置行高/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>/// <param name="height">高度</param>public void SetRowHeight(int rowIndex, float height){IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);if (row == null){row = Book.GetSheetAt(sheetID).CreateRow(rowIndex);}row.Height = (short)(height * 20);}/// <summary>/// 设置列宽/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="columnIndex">列号</param>/// <param name="width">宽度</param>public void SetColumnWidth(int columnIndex, short width){Book.GetSheetAt(sheetID).SetColumnWidth(columnIndex, width * 256);}/// <summary>/// 获取或设置默认行高/// 注:只对当前ActiveSheet有效/// </summary>public short DefaultRowHeight{get{return (short)(Book.GetSheetAt(sheetID).DefaultRowHeight / 20);}set{Book.GetSheetAt(sheetID).DefaultRowHeight = value * 20;}}/// <summary>/// 获取或设置默认列宽/// 注:只对当前ActiveSheet有效/// </summary>public int DefaultColWidth{get{return Book.GetSheetAt(sheetID).DefaultColumnWidth;}set{Book.GetSheetAt(sheetID).DefaultColumnWidth = value;}}/// <summary>/// 某一列的列宽自动调整大小/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="colIndex">列号</param>public void AutoColWidth(int colIndex){Book.GetSheetAt(sheetID).AutoSizeColumn(colIndex, true);}/// <summary>/// 隐藏一行/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>public void HiddenRow(int rowIndex){IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);if (row == null){row = Book.GetSheetAt(sheetID).CreateRow(rowIndex);}row.ZeroHeight = true;}/// <summary>/// 删除一行/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>public void RemoveRow(int rowIndex){IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);if (row != null){ActiveSheet.RemoveRow(row);}}/// <summary>/// 读取单元格的值/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>/// <param name="columnIndex">列号</param>/// <returns>单元格的值</returns>public object ReadValue(int rowIndex, int columnIndex, bool? isDateTime = null){try{ICell cell = Book.GetSheetAt(sheetID).GetRow(rowIndex).GetCell(columnIndex);short df = cell.CellStyle.DataFormat;//return cell.ToString();switch (cell.CellType){case CellType.BLANK:return null;case CellType.BOOLEAN:return cell.BooleanCellValue;case CellType.ERROR:throw new Exception("Cell Value Error");case CellType.FORMULA:{switch (cell.CachedFormulaResultType){case CellType.BLANK:return "";case CellType.BOOLEAN:return cell.BooleanCellValue;case CellType.ERROR:throw new Exception("Cell Value Error");case CellType.FORMULA:throw new Exception("The formula of this cell is too complex!");case CellType.NUMERIC:if (isDateTime == null){if (DateUtil.IsCellDateFormatted(cell)){return cell.DateCellValue;}else{return cell.NumericCellValue;}}else if (isDateTime == true){return cell.DateCellValue;}else{return cell.NumericCellValue;}case CellType.STRING:return cell.StringCellValue;case CellType.Unknown:return cell.ToString();default:return cell.ToString();}}case CellType.NUMERIC:{if (isDateTime == null){if (DateUtil.IsCellDateFormatted(cell)){return cell.DateCellValue;}else{return cell.NumericCellValue;}}else if (isDateTime == true){return cell.DateCellValue;}else{return cell.NumericCellValue;}}case CellType.STRING:return cell.StringCellValue;case CellType.Unknown:return cell.ToString();default:return cell.ToString();}}catch (System.NullReferenceException){return null;}catch (Exception ex){throw ex;}}/// <summary>/// 设置单元格的值/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>/// <param name="columnIndex">列号</param>/// <param name="value">单元格的值</param>public void SetValue(int rowIndex, int columnIndex, object value){SetValue(rowIndex, columnIndex, value, false);}/// <summary>/// 设置单元格的值/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>/// <param name="columnIndex">列号</param>/// <param name="value">单元格的值</param>/// <param name="isFormula">是否是公式</param>public void SetValue(int rowIndex, int columnIndex, object value, bool isFormula){IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);if (row == null){row = Book.GetSheetAt(sheetID).CreateRow(rowIndex);}ICell cell = row.GetCell(columnIndex);if (cell == null){cell = row.CreateCell(columnIndex);}if (value == null){cell.SetCellValue("");}if (isFormula){cell.SetCellFormula(value.ToString());}else{if (value is short){cell.SetCellValue((short)value);}else if (value is int){cell.SetCellValue((int)value);}else if (value is long){cell.SetCellValue((long)value);}else if (value is float){cell.SetCellValue((float)value);}else if (value is double){cell.SetCellValue((double)value);}else if (value is bool){cell.SetCellValue((bool)value);}else if (value is DateTime){cell.SetCellValue((DateTime)value);}else if (value == null){}else{cell.SetCellValue(value.ToString());}}}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="type">验证类型</param>/// <param name="operatorType">验证方式</param>/// <param name="minValue">最小值</param>/// <param name="maxValue">最大值</param>public void SetValueRange(int startRowIndex, int EndRowIndex, int startColInex, int endColIndex, NPOIDataType type, OperatorTypes operatorType, string minValue, string maxValue){SetValueRange(startRowIndex, EndRowIndex, startColInex, endColIndex, type, operatorType, minValue, maxValue, "", "");}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="type">验证类型</param>/// <param name="operatorType">验证方式</param>/// <param name="minValue">最小值</param>/// <param name="maxValue">最大值</param>/// <param name="formate">数据格式</param>public void SetValueRange(int startRowIndex, int EndRowIndex, int startColInex, int endColIndex, NPOIDataType type, OperatorTypes operatorType, string minValue, string maxValue, string formate){SetValueRange(startRowIndex, EndRowIndex, startColInex, endColIndex, type, operatorType, minValue, maxValue, formate, "");}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="type">验证类型</param>/// <param name="operatorType">验证方式</param>/// <param name="minValue">最小值</param>/// <param name="maxValue">最大值</param>/// <param name="formate">数据格式</param>/// <param name="AlertMassage">报错信息</param>public void SetValueRange(int startRowIndex, int EndRowIndex, int startColInex, int endColIndex, NPOIDataType type, OperatorTypes operatorType, string minValue, string maxValue, string formate, string AlertMassage){CellRangeAddressList regions = new CellRangeAddressList(startRowIndex, EndRowIndex, startColInex, endColIndex);DVConstraint constraint = DVConstraint.CreateNumericConstraint(ValidationType.ANY, 0, null, null);switch (type){case NPOIDataType.Integer:constraint = DVConstraint.CreateNumericConstraint(ValidationType.INTEGER, (int)operatorType, minValue, maxValue);break;case NPOIDataType.Float:constraint = DVConstraint.CreateNumericConstraint(ValidationType.DECIMAL, (int)operatorType, minValue, maxValue);break;case NPOIDataType.Date:if (formate == ""){formate = "yyyy/MM/dd";}constraint = DVConstraint.CreateDateConstraint((int)operatorType, minValue, maxValue, formate);break;case NPOIDataType.Time:constraint = DVConstraint.CreateTimeConstraint((int)operatorType, minValue, maxValue);break;case NPOIDataType.TextLength:constraint = DVConstraint.CreateNumericConstraint(ValidationType.TEXT_LENGTH, (int)operatorType, minValue, maxValue);break;default:break;}HSSFDataValidation dataValidate1 = new HSSFDataValidation(regions, constraint);if (!string.IsNullOrEmpty(AlertMassage)){dataValidate1.CreateErrorBox("Error", AlertMassage);}ActiveSheet.AddValidationData(dataValidate1);}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="dataRange">值系列</param>public void SetValueRange(int startRowIndex, int EndRowIndex, int startColInex, int endColIndex, string[] dataRange){SetValueRange(startRowIndex, EndRowIndex, startColInex, endColIndex, dataRange, "");}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="dataRange">值系列</param>/// <param name="alertMassage">报错信息</param>public void SetValueRange(int startRowIndex, int endRowIndex, int startColInex, int endColIndex, string[] dataRange, string alertMassage){ISheetConditionalFormatting hscf = ActiveSheet.SheetConditionalFormatting;CellRangeAddress[] regions = {new CellRangeAddress(startRowIndex, endRowIndex,startColInex,endColIndex)};CellRangeAddressList rangeList = new CellRangeAddressList();rangeList.AddCellRangeAddress(new CellRangeAddress(startRowIndex, endRowIndex, startColInex, endColIndex));DVConstraint dvconstraint = DVConstraint.CreateExplicitListConstraint(dataRange);HSSFDataValidation dataValidation = new HSSFDataValidation(rangeList, dvconstraint);if (!string.IsNullOrEmpty(alertMassage)){dataValidation.CreateErrorBox("Error", alertMassage);}ActiveSheet.AddValidationData(dataValidation);}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="formula">计算公式</param>/// <param name="alertMassage">报错信息</param>public void SetValueRange(int startRowIndex, int endRowIndex, int startColInex, int endColIndex, string formula, string alertMassage){ISheetConditionalFormatting hscf = ActiveSheet.SheetConditionalFormatting;CellRangeAddress[] regions = {new CellRangeAddress(startRowIndex, endRowIndex,startColInex,endColIndex)};CellRangeAddressList rangeList = new CellRangeAddressList();rangeList.AddCellRangeAddress(new CellRangeAddress(startRowIndex, endRowIndex, startColInex, endColIndex));DVConstraint dvconstraint = DVConstraint.CreateFormulaListConstraint(formula);HSSFDataValidation dataValidation = new HSSFDataValidation(rangeList, dvconstraint);if (!string.IsNullOrEmpty(alertMassage)){dataValidation.CreateErrorBox("Error", alertMassage);}ActiveSheet.AddValidationData(dataValidation);}/// <summary>/// 设置一个区域内的单元格的值范围/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行</param>/// <param name="EndRowIndex">结束行</param>/// <param name="startColInex">开始列</param>/// <param name="endColIndex">结束列</param>/// <param name="formula">计算公式</param>public void SetValueRange(int startRowIndex, int endRowIndex, int startColInex, int endColIndex, string formula){SetValueRange(startRowIndex, endColIndex, startRowIndex, endColIndex, formula, "");}/// <summary>/// 生成单元格样式/// </summary>/// <returns>与当前Excel相关的单元格样式</returns>public ICellStyle CreateCellStyle(){return Book.CreateCellStyle();}/// <summary>/// 生成字体/// </summary>/// <returns>与当前Excel相关的字体</returns>public IFont CreateFont(){return Book.CreateFont();}/// <summary>/// 设置单元格样式/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>/// <param name="columnIndex">列号</param>/// <param name="style">样式</param>public void SetStyle(int rowIndex, int columnIndex, ICellStyle style){IRow row = Book.GetSheetAt(sheetID).GetRow(rowIndex);if (row == null){row = Book.GetSheetAt(sheetID).CreateRow(rowIndex);}ICell cell = row.GetCell(columnIndex);if (cell == null){cell = row.CreateCell(columnIndex);}cell.CellStyle = style;}/// <summary>/// 合并单元格/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="startRowIndex">开始行号</param>/// <param name="startColumnIndex">开始列号</param>/// <param name="endRowIndex">结束行号</param>/// <param name="endColumnIndex">结束列号</param>public void MergeCells(int startRowIndex, int startColumnIndex, int endRowIndex, int endColumnIndex){int index = Book.GetSheetAt(sheetID).AddMergedRegion(new CellRangeAddress(startRowIndex, endRowIndex, startColumnIndex, endColumnIndex));}/// <summary>/// 拆分单元格/// 注1:只对当前ActiveSheet有效/// 注2:只有合并的单元格才能拆分/// </summary>/// <param name="startRowIndex">开始行号</param>/// <param name="startColumnIndex">开始列号</param>public void UnMergeCells(int startRowIndex, int startColumnIndex){int merges = Book.GetSheetAt(sheetID).NumMergedRegions;CellRangeAddress merge;for (int i = 0; i < merges; i++){merge = Book.GetSheetAt(sheetID).GetMergedRegion(i);if (merge.FirstRow == startRowIndex && merge.FirstColumn == startColumnIndex){Book.GetSheetAt(sheetID).RemoveMergedRegion(i);break;}}}/// <summary>/// 保存到文件/// 注:有模板的,文件扩展名与模板一样;没有模板的,文件扩展名为“.xls”;/// </summary>/// <param name="fileName">保存文件名</param>public void Save(string fileName){FileStream file = new FileStream(fileName, FileMode.Create);Book.Write(file);file.Close();}/// <summary>/// 保存到流/// 注:保存或下载时,有模板的,文件扩展名与模板一样;没有模板的,文件扩展名为“.xls”;/// </summary>/// <returns>内存流</returns>public MemoryStream Save(){MemoryStream ms = new MemoryStream();Book.Write(ms);return ms;}/// <summary>/// 把Excel读成DataSet/// 注:必须是正规表格式/// </summary>/// <returns>读出的Excel</returns>public DataSet ReadAsDataSet(){DataSet rtn = new DataSet();for (int i = 0; i < SheetCount; i++){ISheet sheet = Book.GetSheetAt(i);rtn.Tables.Add(GetDataTableBySheet(sheet));}return rtn;}private DataTable GetDataTableBySheet(ISheet sheet){DataTable dt = new DataTable(sheet.SheetName);int maxCols = 0;object value;while ((value = ReadValue(sheet, 0, maxCols)) != null){dt.Columns.Add(value.ToString());maxCols++;}int row = 1;bool emptyRow = false;int emptyRowCount = 0;while (emptyRowCount < 10){emptyRow = true;DataRow dr = dt.NewRow();for (int i = 0; i < maxCols; i++){value = ReadValue(sheet, row, i);if (value != null){dr[i] = value;emptyRow = false;}}if (!emptyRow){dt.Rows.Add(dr);emptyRowCount = 0;}else{emptyRowCount++;}row++;}return dt;}/// <summary>/// 根据SheetName导出数据为DataTable/// </summary>/// <param name="sheetName">Sheet名称</param>/// <returns></returns>public DataTable GetDataTableBySheet(string sheetName){ISheet sheet = Book.GetSheet(sheetName);if (sheet != null){return GetDataTableBySheet(sheet);}return null;}/// <summary>/// 根据SheetName导出数据为DataTable/// </summary>/// <param name="sheetIndex">Sheet编号</param>/// <returns></returns>public DataTable GetDataTableBySheet(int sheetIndex){ISheet sheet = Book.GetSheetAt(sheetIndex);if (sheet != null){return GetDataTableBySheet(sheet);}return null;}/// <summary>/// 写入表格/// </summary>/// <param name="Data">表格数据</param>/// <param name="col">写入的起始列</param>/// <param name="row">写入的起始行</param>/// <param name="titleColor">标题颜色</param>/// <param name="fullBorder">是否需要四周边框</param>public void WriteDataTable(DataTable Data, int col = 1, int row = 1, short? titleColor = null, bool fullBorder = true){if (Data == null){return;}var titleStyle = CreateCellStyle();var rowStyle = CreateCellStyle();if (titleColor != null)titleStyle.FillForegroundColor = titleColor.Value;titleStyle.FillPattern = FillPatternType.SOLID_FOREGROUND;if (fullBorder){titleStyle.BorderBottom = BorderStyle.THIN;titleStyle.BorderLeft = BorderStyle.THIN;titleStyle.BorderRight = BorderStyle.THIN;titleStyle.BorderTop = BorderStyle.THIN;titleStyle.BottomBorderColor = NPOIColor.BLACK;titleStyle.LeftBorderColor = NPOIColor.BLACK;titleStyle.RightBorderColor = NPOIColor.BLACK;titleStyle.TopBorderColor = NPOIColor.BLACK;rowStyle.BorderBottom = BorderStyle.THIN;rowStyle.BorderLeft = BorderStyle.THIN;rowStyle.BorderRight = BorderStyle.THIN;rowStyle.BorderTop = BorderStyle.THIN;rowStyle.BottomBorderColor = NPOIColor.BLACK;rowStyle.LeftBorderColor = NPOIColor.BLACK;rowStyle.RightBorderColor = NPOIColor.BLACK;rowStyle.TopBorderColor = NPOIColor.BLACK;}int iCol = 0, iRow = 1;foreach (DataColumn dc in Data.Columns){SetValue(row, col + iCol, dc.ColumnName);SetStyle(row, col + iCol, titleStyle);iCol++;}rowStyle.FillForegroundColor = NPOIColor.WHITE;foreach (DataRow dr in Data.Rows){iCol = 0;foreach (DataColumn dc in Data.Columns){SetValue(row + iRow, col + iCol, dr[dc]);SetStyle(row + iRow, col + iCol, rowStyle);iCol++;}iRow++;}for (int i = 0; i < iCol; i++){this.AutoColWidth(i);}}/// <summary>/// 读取单元格的值/// 注:只对当前ActiveSheet有效/// </summary>/// <param name="rowIndex">行号</param>/// <param name="columnIndex">列号</param>/// <returns>单元格的值</returns>public object ReadValue(ISheet sheet, int rowIndex, int columnIndex, bool? isDateTime = null){try{ICell cell = sheet.GetRow(rowIndex).GetCell(columnIndex);short df = cell.CellStyle.DataFormat;//return cell.ToString();switch (cell.CellType){case CellType.BLANK:return null;case CellType.BOOLEAN:return cell.BooleanCellValue;case CellType.ERROR:throw new Exception("Cell Value Error");case CellType.FORMULA:{switch (cell.CachedFormulaResultType){case CellType.BLANK:return "";case CellType.BOOLEAN:return cell.BooleanCellValue;case CellType.ERROR:throw new Exception("Cell Value Error");case CellType.FORMULA:throw new Exception("The formula of this cell is too complex!");case CellType.NUMERIC:if (isDateTime == null){if (DateUtil.IsCellDateFormatted(cell)){return cell.DateCellValue;}else{return cell.NumericCellValue;}}else if (isDateTime == true){return cell.DateCellValue;}else{return cell.NumericCellValue;}case CellType.STRING:return cell.StringCellValue;case CellType.Unknown:return cell.ToString();default:return cell.ToString();}}case CellType.NUMERIC:{if (isDateTime == null){if (DateUtil.IsCellDateFormatted(cell)){return cell.DateCellValue;}else{return cell.NumericCellValue;}}else if (isDateTime == true){return cell.DateCellValue;}else{return cell.NumericCellValue;}}case CellType.STRING:return cell.StringCellValue;case CellType.Unknown:return cell.ToString();default:return cell.ToString();}}catch (System.NullReferenceException){return null;}catch (Exception ex){throw ex;}}public int SheetCount{get{return Book.NumberOfSheets;}}public string GetSheetName(int index){return Book.GetSheetName(index);}public void AddPicture(byte[] data, int row, int col){int picIndex = Book.AddPicture(data, PictureType.PNG);IDrawing draw = ActiveSheet.CreateDrawingPatriarch();IClientAnchor anchor = draw.CreateAnchor(0, 0, 255, 255, col, row, col + 5, col + 5);IPicture pic = draw.CreatePicture(anchor, picIndex);pic.Resize();} }public enum OperatorTypes {/// <summary>/// 介于最大值与小值之间/// </summary>BETWEEN = OperatorType.BETWEEN,/// <summary>/// 等于最小值/// </summary>EQUAL = OperatorType.EQUAL,/// <summary>/// 大于或等于最小值/// </summary>GREATER_OR_EQUAL = OperatorType.GREATER_OR_EQUAL,/// <summary>/// 大于最小值/// </summary>GREATER_THAN = OperatorType.GREATER_THAN,/// <summary>/// 忽略/// </summary>NO_COMPARISON = OperatorType.IGNORED,/// <summary>/// 小于或等于最小值/// </summary>LESS_OR_EQUAL = OperatorType.LESS_OR_EQUAL,/// <summary>/// 小于最小值/// </summary>LESS_THAN = OperatorType.LESS_THAN,/// <summary>/// 不在最小值与最大值之间/// </summary>NOT_BETWEEN = OperatorType.NOT_BETWEEN,/// <summary>/// 不等于最小值/// </summary>NOT_EQUAL = OperatorType.NOT_EQUAL }public enum NPOIDataType {/// <summary>/// 验证整数/// </summary> Integer,/// <summary>/// 验证符点数/// </summary> Float,/// <summary>/// 验证日期/// </summary> Date,/// <summary>/// 验证时间/// </summary> Time,/// <summary>/// 验证字符长度/// </summary> TextLength }public static class NPOIColor {/// <summary>/// 红色/// </summary>public static short RED { get { return NPOI.HSSF.Util.HSSFColor.RED.index; } }/// <summary>/// 蓝色/// </summary>public static short BLUE { get { return NPOI.HSSF.Util.HSSFColor.BLUE.index; } }/// <summary>/// 浅绿色/// </summary>public static short AQUA { get { return NPOI.HSSF.Util.HSSFColor.AQUA.index; } }/// <summary>/// 自动/// </summary>public static short AUTOMATIC { get { return NPOI.HSSF.Util.HSSFColor.AUTOMATIC.index; } }/// <summary>/// 黑色/// </summary>public static short BLACK { get { return NPOI.HSSF.Util.HSSFColor.BLACK.index; } }/// <summary>/// 蓝灰色/// </summary>public static short BLUE_GREY { get { return NPOI.HSSF.Util.HSSFColor.BLUE_GREY.index; } }/// <summary>/// 明绿色/// </summary>public static short BRIGHT_GREEN { get { return NPOI.HSSF.Util.HSSFColor.BRIGHT_GREEN.index; } }/// <summary>/// 棕色/// </summary>public static short BROWN { get { return NPOI.HSSF.Util.HSSFColor.BROWN.index; } }/// <summary>/// 正常/// </summary>public static short COLOR_NORMAL { get { return NPOI.HSSF.Util.HSSFColor.COLOR_NORMAL; } }/// <summary>/// 珊瑚色/// </summary>public static short CORAL { get { return NPOI.HSSF.Util.HSSFColor.CORAL.index; } }/// <summary>/// 亮蓝色/// </summary>public static short CORNFLOWER_BLUE { get { return NPOI.HSSF.Util.HSSFColor.CORNFLOWER_BLUE.index; } }/// <summary>/// 深蓝色/// </summary>public static short DARK_BLUE { get { return NPOI.HSSF.Util.HSSFColor.DARK_BLUE.index; } }/// <summary>/// 深绿色/// </summary>public static short DARK_GREEN { get { return NPOI.HSSF.Util.HSSFColor.DARK_GREEN.index; } }/// <summary>/// 深红色/// </summary>public static short DARK_RED { get { return NPOI.HSSF.Util.HSSFColor.DARK_RED.index; } }/// <summary>/// 深茶色/// </summary>public static short DARK_TEAL { get { return NPOI.HSSF.Util.HSSFColor.DARK_TEAL.index; } }/// <summary>/// 深黄/// </summary>public static short DARK_YELLOW { get { return NPOI.HSSF.Util.HSSFColor.DARK_YELLOW.index; } }/// <summary>/// 金色/// </summary>public static short GOLD { get { return NPOI.HSSF.Util.HSSFColor.GOLD.index; } }/// <summary>/// 绿色/// </summary>public static short GREEN { get { return NPOI.HSSF.Util.HSSFColor.GREEN.index; } }/// <summary>/// 25%灰色/// </summary>public static short GREY_25_PERCENT { get { return NPOI.HSSF.Util.HSSFColor.GREY_25_PERCENT.index; } }/// <summary>/// 40%灰色/// </summary>public static short GREY_40_PERCENT { get { return NPOI.HSSF.Util.HSSFColor.GREY_40_PERCENT.index; } }/// <summary>/// 50%灰色/// </summary>public static short GREY_50_PERCENT { get { return NPOI.HSSF.Util.HSSFColor.GREY_50_PERCENT.index; } }/// <summary>/// 80%灰色/// </summary>public static short GREY_80_PERCENT { get { return NPOI.HSSF.Util.HSSFColor.GREY_80_PERCENT.index; } }/// <summary>/// 靛蓝色/// </summary>public static short INDIGO { get { return NPOI.HSSF.Util.HSSFColor.INDIGO.index; } }/// <summary>/// 淡紫色/// </summary>public static short LAVENDER { get { return NPOI.HSSF.Util.HSSFColor.LAVENDER.index; } }/// <summary>/// 粉黄色/// </summary>public static short LEMON_CHIFFON { get { return NPOI.HSSF.Util.HSSFColor.LEMON_CHIFFON.index; } }/// <summary>/// 淡蓝色/// </summary>public static short LIGHT_BLUE { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_BLUE.index; } }/// <summary>/// 淡亮蓝色/// </summary>public static short LIGHT_CORNFLOWER_BLUE { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_CORNFLOWER_BLUE.index; } }/// <summary>/// 淡绿色/// </summary>public static short LIGHT_GREEN { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_GREEN.index; } }/// <summary>/// 淡桔黄色/// </summary>public static short LIGHT_ORANGE { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_ORANGE.index; } }/// <summary>/// 淡蓝绿色/// </summary>public static short LIGHT_TURQUOISE { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_TURQUOISE.index; } }/// <summary>/// 淡黄色/// </summary>public static short LIGHT_YELLOW { get { return NPOI.HSSF.Util.HSSFColor.LIGHT_YELLOW.index; } }/// <summary>/// 绿黄色/// </summary>public static short LIME { get { return NPOI.HSSF.Util.HSSFColor.LIME.index; } }/// <summary>/// 栗色/// </summary>public static short MAROON { get { return NPOI.HSSF.Util.HSSFColor.MAROON.index; } }/// <summary>/// 橄榄绿色/// </summary>public static short OLIVE_GREEN { get { return NPOI.HSSF.Util.HSSFColor.OLIVE_GREEN.index; } }/// <summary>/// 桔色/// </summary>public static short ORANGE { get { return NPOI.HSSF.Util.HSSFColor.ORANGE.index; } }/// <summary>/// 白灰蓝色/// </summary>public static short PALE_BLUE { get { return NPOI.HSSF.Util.HSSFColor.PALE_BLUE.index; } }/// <summary>/// 粉红色/// </summary>public static short PINK { get { return NPOI.HSSF.Util.HSSFColor.PINK.index; } }/// <summary>/// 紫红色/// </summary>public static short PLUM { get { return NPOI.HSSF.Util.HSSFColor.PLUM.index; } }/// <summary>/// 玫瑰红色/// </summary>public static short ROSE { get { return NPOI.HSSF.Util.HSSFColor.ROSE.index; } }/// <summary>/// 高贵蓝/// </summary>public static short ROYAL_BLUE { get { return NPOI.HSSF.Util.HSSFColor.ROYAL_BLUE.index; } }/// <summary>/// 海绿色/// </summary>public static short SEA_GREEN { get { return NPOI.HSSF.Util.HSSFColor.SEA_GREEN.index; } }/// <summary>/// 天空蓝/// </summary>public static short SKY_BLUE { get { return NPOI.HSSF.Util.HSSFColor.SKY_BLUE.index; } }/// <summary>/// 棕褐色/// </summary>public static short TAN { get { return NPOI.HSSF.Util.HSSFColor.TAN.index; } }/// <summary>/// 茶色/// </summary>public static short TEAL { get { return NPOI.HSSF.Util.HSSFColor.TEAL.index; } }/// <summary>/// 蓝绿色/// </summary>public static short TURQUOISE { get { return NPOI.HSSF.Util.HSSFColor.TURQUOISE.index; } }/// <summary>/// 紫色/// </summary>public static short VIOLET { get { return NPOI.HSSF.Util.HSSFColor.VIOLET.index; } }/// <summary>/// 白色/// </summary>public static short WHITE { get { return NPOI.HSSF.Util.HSSFColor.WHITE.index; } }/// <summary>/// 黄色/// </summary>public static short YELLOW { get { return NPOI.HSSF.Util.HSSFColor.YELLOW.index; } }}/// <summary> /// 针对excel的Oledb /// </summary> public class OleDbExcel {/// <summary>/// OLEDB连接/// </summary>public OleDbConnection Connection{get;set;}/// <summary>/// 用Oledb对Excel进行操作/// 注:必须是标准表形式Excel内容/// </summary>/// <param name="excelFile">Excel文件</param>public OleDbExcel(string excelFile){string conStr = string.Empty;FileInfo file = new FileInfo(excelFile);if (!file.Exists) { throw new Exception("文件不存在"); }string extension = file.Extension;switch (extension){case ".xls":conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFile + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";break;case ".xlsx":conStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + excelFile + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";break;default:conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + excelFile + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";break;}//链接ExcelConnection = new OleDbConnection(conStr);}private List<string> tableNames;/// <summary>/// 获取Excel内的Sheet名称/// </summary>public List<string> Sheets{get{if (tableNames == null){try{tableNames = new List<string>();//读取Excel里面的sheet名 Connection.Open();DataTable schemaTable = Connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });for (int i = 0; i < schemaTable.Rows.Count; i++){DataRow dr = schemaTable.Rows[i];string tbName = dr["table_name"].ToString();if (tbName[tbName.Length - 1] == '$'){tableNames.Add(tbName);}}Connection.Close();}catch (Exception ex){if (Connection.State != ConnectionState.Closed){Connection.Close();}throw new Exception(ex.Message, ex);}}return tableNames;}}/// <summary>/// 查询出所有数据/// </summary>/// <param name="tableName">Sheet名称</param>/// <returns>sheet内的所有数据</returns>public DataSet QueryAll(string tableName){try{DataSet excelData = new DataSet();OleDbDataAdapter adapter = new OleDbDataAdapter();adapter.SelectCommand = new OleDbCommand();adapter.SelectCommand.Connection = Connection;adapter.SelectCommand.CommandText = string.Format("SELECT * FROM {0}", "[" + tableName + "]");adapter.Fill(excelData);return excelData;}catch (Exception ex){if (Connection.State != ConnectionState.Closed){Connection.Close();}throw new Exception(ex.Message, ex);}}/// <summary>/// 查询出所有数据/// </summary>/// <param name="tableIndex">Sheet序号(从0开始)</param>/// <returns>sheet内的所有数据</returns>public DataSet QueryAll(int tableIndex){return QueryAll(Sheets[tableIndex]);}/// <summary>/// 利用Sql进行查询/// </summary>/// <param name="sql">Sql语句</param>/// <returns>查询出的数据</returns>public DataSet Query(string sql){try{DataSet excelData = new DataSet();OleDbDataAdapter adapter = new OleDbDataAdapter(sql, Connection);adapter.Fill(excelData);return excelData;}catch (Exception ex){if (Connection.State != ConnectionState.Closed){Connection.Close();}throw new Exception(ex.Message, ex);}}/// <summary>/// 利用Sql进行查询/// </summary>/// <param name="sql">Sql语句</param>/// <param name="param">查询参数</param>/// <returns>查询出的数据</returns>public DataSet Query(string sql, params OleDbParameter[] param){try{DataSet excelData = new DataSet();OleDbDataAdapter adapter = new OleDbDataAdapter(sql, Connection);adapter.SelectCommand.Parameters.AddRange(param);adapter.Fill(excelData);return excelData;}catch (Exception ex){if (Connection.State != ConnectionState.Closed){Connection.Close();}throw new Exception(ex.Message, ex);}}/// <summary>/// 利用Sql进行数据操作/// </summary>/// <param name="sql">sql语句</param>/// <returns>影响的行数</returns>public int ExecuteSql(string sql){try{Connection.Open();OleDbCommand cmd = Connection.CreateCommand();cmd.CommandText = sql;int rtn = cmd.ExecuteNonQuery();Connection.Close();return rtn;}catch (Exception ex){if (Connection.State != ConnectionState.Closed){Connection.Close();}throw new Exception(ex.Message, ex);}}/// <summary>/// 利用Sql进行数据操作/// </summary>/// <param name="sql">sql语句</param>/// <param name="param">执行参数</param>/// <returns>影响的行数</returns>public int ExecuteSql(string sql, params OleDbParameter[] param){try{Connection.Open();OleDbCommand cmd = Connection.CreateCommand();cmd.CommandText = sql;cmd.Parameters.AddRange(param);int rtn = cmd.ExecuteNonQuery();Connection.Close();return rtn;}catch (Exception ex){if (Connection.State != ConnectionState.Closed){Connection.Close();}throw new Exception(ex.Message, ex);}} }
View Code
2、使用 后台
[HttpPost]public void ExportExcel(string excelName, string tableStr, string imageAction = ""){tableStr = Microsoft.JScript.GlobalObject.unescape(tableStr);//tableStr = "<table><tr><td>test1</td><td>test2</td></tr><tr><td>1</td><td>2</td></tr></table>";DataTable dt = HtmlTableToDataTable(tableStr);NPOIExcel excel = new NPOIExcel();excel.WriteDataTable(dt, 0, 0, NPOIColor.SKY_BLUE);if (!string.IsNullOrWhiteSpace(imageAction)){var method = this.GetType().GetMethod(imageAction);var param = method.GetParameters();object[] objParam = new object[param.Length];int i = 0;foreach (var pa in param){if (pa.Name == "export"){objParam[i] = true;continue;}string value = Request[pa.Name];if (string.IsNullOrEmpty(value)){objParam[i] = pa.RawDefaultValue;}else{objParam[i] = Convert.ChangeType(value, pa.ParameterType);}i++;}byte[] bytes = (byte[])method.Invoke(this, objParam);excel.AddPicture(bytes, dt.Rows.Count + 1, 0);}MemoryStream ms = excel.Save();ms.Position = 0;Response.Clear();Response.ContentType = "application/-excel";Response.HeaderEncoding = System.Text.Encoding.UTF8;Response.AddHeader("Content-Disposition", "attachment;filename=" + Server.UrlEncode(excelName + ".xls"));byte[] buffer = new byte[ms.Length];ms.Read(buffer, 0, buffer.Length);Response.AddHeader("Content-Length", buffer.Length.ToString());Response.BinaryWrite(buffer);Response.Flush();}private DataTable HtmlTableToDataTable(string tableStr){tableStr = tableStr.Replace("\n", "");tableStr = tableStr.Replace("\t", "");Regex re = new Regex("<BR>", RegexOptions.IgnoreCase);tableStr = re.Replace(tableStr, "\r\n");re = new Regex(" ", RegexOptions.IgnoreCase);XmlDocument doc = new XmlDocument();doc.LoadXml(tableStr);var trs = doc.GetElementsByTagName("tr");DataTable rtn = new DataTable();for (int i = 0; i < trs.Count; i++){for (int j = 0; j < trs[i].ChildNodes.Count; j++){var td = trs[i].ChildNodes[j].InnerText.Trim();td = td.Replace(" ", "");re.Replace(td, " ");if (rtn.Columns.Count <= j){rtn.Columns.Add(td);}else{if (rtn.Rows.Count <= i - 1){rtn.Rows.Add(rtn.NewRow());}rtn.Rows[i - 1][j] = td;}}}return rtn;}
View Code
3、前台
按钮
<a href="javascript:void(0)" οnclick="ExportExcel('AssManageQueryClose','exportTable')" style="font-size: 13px;">@Html.Lang("输出报表", "Export Report")</a>
table:
<table class="dataList" id="exportTable"><tr class="title"><td>title</td></tr>@foreach (var item in Model){<tr class="item"><td>Content</td></tr>}</table>
js:
//导出Excel function ExportExcel(excelName, tableID) {if ($("#" + excelName).length <= 0) {var table = "<table>" + $("#" + tableID).html() + "</table>";table = escape(table);var form = "<form id='" + excelName + "' action='@Url.Action("ExportExcel")' method='post'>";form += "<input type='hidden' id='excelName' name='excelName' value='" + excelName + "' />";form += "<input type='hidden' id='tableStr' name='tableStr' value='" + table + "' />";form += "</form>";$(form).appendTo("body");}$("#" + excelName).submit();}
转载于:https://www.cnblogs.com/i-mengli/p/9835608.html
.Net NPOI 根据excel模板导出excel、直接生成excel相关推荐
- java通过Excel 模板导出复杂统计类excel文档,在ruoyi前后端分离框架中的应用
Hello, 大家好! 我是不作死就不会死,智商不在线,但颜值超有品的拆家队大队长 --咖啡汪 一只不是在戏精,就是在戏精路上的极品二哈 前几天刚做了java通过Excel 模板导出复杂统计类exce ...
- 基于Excel模板导出——ExcelTemplate
什么是ExcelTemplate ExcelTemplate项目是一个基于Excel模板,依靠配置文件描述导出过程的Excel导出工具. 它提供了大量适用于各种场景的常用配置(导出规则),同时提供一些 ...
- C#中通过Excel模板导出数据
一.实现效果 1.1.编写特定格式的Excel模板 1.2.调用Excel模板导出数据 二.实现核心 #region 通过模板导出Excel文件/// <summary>/// 通过模板导 ...
- Excel模板导出之动态导出
说明 目前Magicodes.IE已支持Excel模板导出时使用JObject.Dictionary和ExpandoObject来进行动态导出,具体使用请看本篇教程. 本功能的想法.部分实现初步源于a ...
- Excel模板导出之导出教材订购表
说明 本教程主要说明如果使用Magicodes.IE.Excel完成教材订购表的Excel模板导出. 要点 本教程使用Magicodes.IE.Excel来完成Excel模板导出 需要通过创建Dto来 ...
- 6、jeecg 笔记之 自定义excel 模板导出(一)
6.jeecg 笔记之 自定义excel 模板导出(一) 1.前言 jeecg 中已经自带 excel 的导出导出功能,其所使用的是 easypoi,尽管所导出的 excel 能满足大部分需求, 但总 ...
- 使用EasyPoi利用excel模板导出excel表格下载
前言:使用excel模板导出excel的好处在于可以事先在模板上定义颜色.格式等,适用于模板设计得比较灵活复杂的场景 一.添加jar包 <dependency><groupId> ...
- springboot+poi开发excel导出 加载Excel模板导出 Excel批量导出详解
提到Excel导出功能,可能很多人都使用springmvc框架做过,笔者今天要给大家分享的是基于springBoot开发Excel复杂模板导出功能(所谓复杂模板指在模板里的特定表头里有不同的单元格合并 ...
- php excel模板导出、openoffice excel转pdf、多文件压缩下载
最近两周都在弄关于excel模板导出.excel转pdf.多文件压缩下载.弄得头都大了,接下来说说实现的方法吧. 我用的是laravel5.1的框架,读取模板生成excel,并且插入图片,直接上代码 ...
最新文章
- 从共享租车成绿色消费首选,看共享经济未来
- Design Pattern - Visitor(C#)
- tm1650中文资料_TM1616,TM1650,TM1651 SOP16原厂直销,技术支持
- UNIX V6内核源码剖析——unix v6 全貌
- html5 建筑物模型,基于HTML5的建筑物阴影实时模拟
- linux下执行shell脚本文件,Linux下使用shell脚本自动执行脚本文件
- linux将日期和日历信息追加到文件中_Linux常用指令
- 《树莓派开发实战(第2版)》——2.9 利用RDP远程控制树莓派
- 【重点】剑指offer——面试题25:二叉树中和为某一值的路径
- 如何在 Mac 上打开或关闭专注模式?
- c语言标准库详解(一):stdio.h之文件操作
- 如何关闭JxBrowser,正确退出JxBrowser的方法
- JS - 数字金额转换中文汉字金额
- 推荐几张系统维护光盘
- 两张图片怎样合成一张左右拼图?
- 王达人漫展1,cosplay
- 批量进行数字变下标的处理
- 安卓中COLOR的值分析
- rust拆除拆除指令_Rust 输出到命令行
- 五种开源协议的比较(BSD、Apache、GPL、LGPL、MIT)
热门文章
- Rhino脚本引擎技术介绍
- 自动化测试如何解决验证码的问题
- [转载]浅析jQuery框架与构造对象
- Web服务器启动端口冲突问题
- android 悬浮按钮 魅族,魅族,我的悬浮球功能比你的强大:悬浮菜单
- 在redhat9中交叉编译nano-X nxlib和fltk
- delphi 读取ini所有项_财务机器人真的会代替财务人员所有工作吗?
- Rest 微服务工程搭建01——微服务提供者Module模块
- Manage Jenkins管理界面提示“依赖错误: 部分插件由于缺少依赖无法加载...“问题解决办法
- Oracle数据库的显示提交与隐式提交,针对oracle工具的自动提交机制