·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> 网站建设开发 >> ASP.NET网站开发 >> Asp.netMVC+EasyUI+NPOI做通用导出功能
首先需要一个Column的类,代表一列,还需要一个Sheet类,代表一个Sheet页。
public class Column { public string Code { get; set; } public string Name { get; set; } public string DataType { get; set; } public int Width { get; set; } public bool Hidden { get; set; } public Column() { } public Column(string code, string name, string dataType, int width, bool hidden = false) { Code = code; Name = name; DataType = dataType; Width = width; Hidden = hidden; } } public class Sheet { public string Name { get; set; } public List<Column> Columns { get; set; } public DataTable DataSource { get; set; } public Sheet() { } public Sheet(string name, List<Column> columns, DataTable dataSource) { Name = name; Columns = columns; DataSource = dataSource; } }
封装一个Workbook,方便操作。
1 /// <summary> 2 /// 工作薄 3 /// </summary> 4 public class Workbook 5 { 6 public HSSFWorkbook workbook; 7 /// <summary> 8 /// 表头格式 9 /// </summary> 10 PRivate HSSFCellStyle HeadStyle 11 { 12 get 13 { 14 HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle(); 15 headStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; 16 headStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; 17 HSSFFont font = (HSSFFont)workbook.CreateFont(); 18 font.FontHeightInPoints = 10; 19 font.Boldweight = 700; 20 headStyle.SetFont(font); 21 return headStyle; 22 } 23 } 24 /// <summary> 25 /// 时间格式 26 /// </summary> 27 private HSSFCellStyle DateStyle 28 { 29 get 30 { 31 HSSFCellStyle dateStyle = (HSSFCellStyle)workbook.CreateCellStyle(); 32 HSSFDataFormat format = (HSSFDataFormat)workbook.CreateDataFormat(); 33 dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd"); 34 return dateStyle; 35 } 36 } 37 38 /// <summary> 39 /// 实例一个工作薄 40 /// </summary> 41 public Workbook() 42 { 43 workbook = new HSSFWorkbook(); 44 #region 右击文件 属性信息 45 DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation(); 46 dsi.Company = "SiBu"; 47 workbook.DocumentSummaryInformation = dsi; 48 49 SummaryInformation si = PropertySetFactory.CreateSummaryInformation(); 50 si.CreateDateTime = System.DateTime.Now; 51 workbook.SummaryInformation = si; 52 #endregion 53 } 54 55 /// <summary> 56 /// 加载Excel文件 57 /// </summary> 58 /// <param name="filePath">文件路径</param> 59 public Workbook(string filePath) 60 { 61 using (FileStream file = new FileStream(filePath, FileMode.Open, Fileaccess.Read)) 62 { 63 workbook = new HSSFWorkbook(file); 64 } 65 } 66 67 /// <summary> 68 /// 获取Sheet页的数据 69 /// </summary> 70 /// <param name="sheetIndex">Sheet页Index,从0开始</param> 71 /// <returns>DataTable</returns> 72 public DataTable GetDataTable(int sheetIndex = 0) 73 { 74 DataTable dt = new DataTable(); 75 76 HSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(sheetIndex); 77 System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); 78 79 HSSFRow headerRow = (HSSFRow)sheet.GetRow(0); 80 int cellCount = headerRow.LastCellNum; 81 82 for (int j = 0; j < cellCount; j++) 83 { 84 HSSFCell cell = (HSSFCell)headerRow.GetCell(j); 85 dt.Columns.Add(cell.ToString()); 86 } 87 88 for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++) 89 { 90 HSSFRow row = (HSSFRow)sheet.GetRow(i); 91 if (row == null) 92 continue; 93 DataRow dataRow = dt.NewRow(); 94 95 for (int j = row.FirstCellNum; j < cellCount; j++) 96 { 97 ICell cell = row.GetCell(j); 98 if (cell != null) 99 { 100 if (cell.CellType == CellType.Numeric) 101 { 102 //NPOI中数字和日期都是NUMERIC类型的,这里对其进行判断是否是日期类型 103 if (HSSFDateUtil.IsCellDateFormatted(cell))//日期类型 104 { 105 dataRow[j] = cell.DateCellValue; 106 } 107 else//其他数字类型 108 { 109 dataRow[j] = cell.NumericCellValue; 110 } 111 } 112 else if (cell.CellType == CellType.Blank)//空数据类型 113 { 114 dataRow[j] = ""; 115 } 116 else if (cell.CellType == CellType.Formula)//公式类型 117 { 118 HSSFFormulaEvaluator eva = new HSSFFormulaEvaluator(workbook); 119 dataRow[j] = eva.Evaluate(cell).StringValue; 120 } 121 else //其他类型都按字符串类型来处理 122 { 123 dataRow[j] = cell.StringCellValue; 124 } 125 } 126 } 127 128 dt.Rows.Add(dataRow); 129 } 130 return dt; 131 } 132 133 /// <summary> 134 /// 创建一个Sheet页 135 /// </summary> 136 /// <param name="Sheet">Sheet</param> 137 public void CreateSheet(Sheet sheetInfo) 138 { 139 if (string.IsNullOrWhiteSpace(sheetInfo.Name)) sheetInfo.Name = "Sheet" + workbook.NumberOfSheets + 1; 140 HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet(sheetInfo.Name); 141 142 int rowIndex = 0; 143 144 #region 新建表,填充表头,填充列头,样式 145 HSSFRow headerRow = (HSSFRow)sheet.CreateRow(rowIndex); 146 headerRow.HeightInPoints = 20; 147 var columIndex = 0; 148 foreach (var column in sheetInfo.Columns) 149 { 150 headerRow.CreateCell(columIndex).SetCellValue(column.Name); 151 headerRow.GetCell(columIndex).CellStyle = HeadStyle; 152 //设置列宽 153 sheet.SetColumnWidth(columIndex, column.Width * 256); 154 sheet.SetColumnHidden(columIndex, column.Hidden); 155 columIndex++; 156 } 157 158 #endregion 159 #region 填充内容 160 rowIndex = 1; 161 foreach (DataRow row in sheetInfo.DataSource.Rows) 162 { 163 HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex); 164 var columnIndex = 0; 165 foreach (var column in sheetInfo.Columns) 166 { 167 HSSFCell newCell = (HSSFCell)dataRow.CreateCell(columnIndex); 168 if (!sheetInfo.DataSource.Columns.Contains(column.Code)) 169 { 170 newCell.SetCellValue(""); 171 } 172 else 173 { 174 string drValue = row[column.Code].ToString(); 175 176 switch (column.DataType.ToUpper()) 177 { 178 case "S"://字符串类型 179 newCell.SetCellValue(drValue); 180 break; 181 case "D"://日期类型 182 System.DateTime dateV; 183 System.DateTime.TryParse(drValue, out dateV); 184 newCell.SetCellValue(dateV); 185 newCell.CellStyle = DateStyle;//格式化显示 186 break; 187 case "B"://布尔型 188 bool boolV = false; 189 bool.TryParse(drValue, out boolV); 190 newCell.SetCellValue(boolV); 191 break; 192 case "I"://整型 193 int intV = 0; 194 int.TryParse(drValue, out intV); 195 newCell.SetCellValue(intV); 196 break; 197 case "F"://浮点型 198 double doubV = 0; 199 double.TryParse(drValue, out doubV); 200 newCell.SetCellValue(doubV); 201 break; 202 default: 203 newCell.SetCellValue(drValue); 204 break; 205 } 206 } 207 columnIndex++; 208 } 209 rowIndex++; 210 } 211 #endregion 212 } 213 214 /// <summary> 215 /// 保存 216 /// </summary> 217 /// <param name="filePath">文件路径</param> 218 public void SaveAs(string filePath) 219 { 220 using (MemoryStream ms = new MemoryStream()) 221 { 222 workbook.Write(ms); 223 ms.Flush(); 224 ms.Position = 0; 225 226 using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)) 227 { 228 byte[] data = ms.ToArray(); 229 fs.Write(data, 0, data.Length); 230 fs.Flush(); 231 } 232 } 233 } 234 235 /// <summary> 236 /// 获取Workbook的MemoryStream 237 /// </summary> 238 /// <returns></returns> 239 public MemoryStream GetMemoryStream() 240 { 241 MemoryStream ms = new MemoryStream(); 242 workbook.Write(ms); 243 ms.Flush(); 244 ms.Position = 0; 245 return ms; 246 } 247 }View Code
ExcelController接收客户端Post过来的数据,处理后返回文件流。
public class ExcelController : Controller { [HttpPost] public FileResult CommonExport(string Title, string Columns, string Data) { var tb = JsonConvert.DeserializeObject<DataTable>(Data); var Columnslist = JsonConvert.DeserializeObject<List<Column>>(Columns); var workbook = new Workbook(); workbook.CreateSheet(new Sheet(Title, Columnslist, tb)); var fileStream = workbook.GetMemoryStream(); return File(fileStream, "application/ms-excel", string.Format("{0}.xls", Title)); } }
JS处理数据后POST到后台。这里面用到了linq.js,通过构造Form表单提交,直接用Jquery的Post获取到文件流没反应。
这里的用到了EasyUI的datagrid,可以封装成母版页(OSharp里面有介绍 http://www.cnblogs.com/guomingfeng/p/osharp-easyui-Opera.html),导出Excel方法直接写在这里面。
function exportToExcel() { $("#exportToExcelForm").remove(); var form = $("<form>");//定义一个form表单 form.attr("id", "exportToExcelForm"); form.attr("style", "display:none"); form.attr("target", ""); form.attr("method", "post"); form.attr("action", "/Excel/CommonExport"); var input1 = $("<input>"); input1.attr("type", "hidden"); input1.attr("name", "Title"); input1.attr("value", '@ViewBag.Title'); var input2 = $("<input>"); input2.attr("type", "hidden"); input2.attr("name", "Columns"); input2.attr("value", JSON.stringify(getColumns())); var input3 = $("<input>"); input3.attr("type", "hidden"); input3.attr("name", "Data"); input3.attr("value", JSON.stringify(getData(grid.datagrid("getRows")))); $("body").append(form);//将表单放置在web中 form.append(input1); form.append(input2); form.append(input3); form.submit();//表单提交 $("#exportToExcelForm").remove(); } function getData(Data) { return Enumerable.From(Data).Select(function (c) { var obj = {}; for (var i in columns[0]) { obj[columns[0][i].field] = c[columns[0][i].field]; } return obj }).ToArray(); } function getColumns() { return Enumerable.From(columns[0]).Select(function (c) { var obj = {}; obj.Code = c.field; obj.Name = c.title; obj.DataType = c.datatype || "S"; obj.Width = (c.width || 80) / 10; obj.Hidden = c.hidden; return obj }).ToArray(); }