1/excel帮助类(使用NPOI插件)
public class ExcelHelper { public static string Version { get { return "0.1"; } } readonly static int EXCEL03_MaxRow = 65535; public static DataTable ToDataTable<T>(IEnumerable<T> collection, string lang = null) { var props = typeof(T).GetProperties(); var dt = new DataTable(); if (lang != null && lang.ToLower() == "zh-cn") { PropertyInfo[] peroperties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo property in peroperties) { object[] objs = property.GetCustomAttributes(typeof(DescriptionAttribute), true); if (objs.Length > 0) { dt.Columns.Add(((DescriptionAttribute)objs[0]).Description); } else { dt.Columns.Add(new DataColumn(property.Name, property.PropertyType)); } } } else { dt.Columns.AddRange(props.Select(p => new DataColumn(p.Name, p.PropertyType)).ToArray()); } if (collection.Count() > 0) { for (int i = 0; i < collection.Count(); i++) { ArrayList tempList = new ArrayList(); foreach (PropertyInfo pi in props) { object obj = pi.GetValue(collection.ElementAt(i), null); tempList.Add(obj); } object[] array = tempList.ToArray(); dt.LoadDataRow(array, true); } } return dt; } public static FileStream SaveFile<T>(string path,IEnumerable<T> collection,string tableName,string lang) { try { IWorkbook book = new HSSFWorkbook(); var table = ToDataTable<T>(collection, lang); table.TableName = tableName; FillWorkBookData(book, table); FileStream file = new FileStream(path, FileMode.Create); book.Write(file); file.Close(); file.Dispose(); return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); } catch (Exception ex) { return null; } } public static FileStream SaveFile(string path, DataSet set) { try { IWorkbook book = new HSSFWorkbook(); for(int i = 0; i < set.Tables.Count;i++) { FillWorkBookData(book, set.Tables[i]); } FileStream file = new FileStream(path, FileMode.Create); book.Write(file); file.Close(); file.Dispose(); return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read); } catch (Exception ex) { return null; } } public static IWorkbook FillWorkBookDataForPage(IWorkbook book,DataTable dt) { book = book ?? new HSSFWorkbook(); if (dt.Rows.Count < EXCEL03_MaxRow) FillWorkBookData(book,dt, 0, dt.Rows.Count - 1); else { int page = dt.Rows.Count / EXCEL03_MaxRow; for (int i = 0; i < page; i++) { int start = i * EXCEL03_MaxRow; int end = (i * EXCEL03_MaxRow) + EXCEL03_MaxRow - 1; dt.TableName = $"{dt.TableName}-i"; FillWorkBookData(book, dt, start, end); } int lastPageItemCount = dt.Rows.Count % EXCEL03_MaxRow; dt.TableName = $"{dt.TableName}-{page}"; FillWorkBookData(book,dt, dt.Rows.Count - lastPageItemCount, lastPageItemCount); } return book; } public static IWorkbook FillWorkBookData(IWorkbook book, DataTable dt, ICellStyle style, int startRow = 0, int endRow = -1) { book = book ?? new HSSFWorkbook(); ISheet sheet = book.CreateSheet(dt.TableName); ICellStyle cellStyle = book.CreateCellStyle(); IFont font = book.CreateFont(); font.FontHeightInPoints = 12; font.Boldweight = (short)FontBoldWeight.Bold; cellStyle.BorderTop = cellStyle.BorderRight = cellStyle.BorderBottom = cellStyle.BorderLeft = BorderStyle.Thin; cellStyle.SetFont(font); IRow header = sheet.CreateRow(0); for (int i = 0; i < dt.Columns.Count; i++) { ICell cell = header.CreateCell(i); string val = dt.Columns[i].Caption ?? dt.Columns[i].ColumnName; cell.SetCellValue(val); cell.CellStyle = cellStyle; } int rowIndex = 1; if (endRow < 0) endRow = dt.Rows.Count-1; for (int i = startRow; i <= endRow; i++) { DataRow dtRow = dt.Rows[i]; IRow excelRow = sheet.CreateRow(rowIndex++); for (int j = 0; j < dtRow.ItemArray.Length; j++) { var col = excelRow.CreateCell(j); col.SetCellValue(dtRow[j].ToString()); if (style != null) { col.CellStyle = style; } } } return book; } /// <summary> /// 添加数据表格默认样式 /// </summary> /// <param name="book"></param> /// <param name="dt"></param> /// <returns></returns> public static IWorkbook FillWorkBookData(IWorkbook book,DataTable dt, int startRow = 0, int endRow = -1) { book = book ?? new HSSFWorkbook(); ICellStyle cellStyle = book.CreateCellStyle(); cellStyle.BorderTop = cellStyle.BorderRight = cellStyle.BorderBottom = cellStyle.BorderLeft = BorderStyle.Thin; return FillWorkBookData(book, dt, cellStyle, startRow, endRow); } }
2/API
[HttpPost, Route("api/Template/GetColumnFile")] public HttpResponseMessage GetColumnFile([FromBody]GetColumnRequest req) { HttpResponseMessage result; try { var columns = service.GetColumn(req.Object, req.TableName) ?? new List<VColumn>(); var tables = service.GetTable(req.Object) ?? new List<VTable>(); DataSet set = new DataSet(); var coltable = ExcelHelper.ToDataTable(columns, "zh-cn"); coltable.TableName = $"{req.TableName}表信息"; set.Tables.Add(coltable); var tabTable = ExcelHelper.ToDataTable(tables); tabTable.TableName = $"{req.Object.Database}数据库信息"; set.Tables.Add(tabTable); string basePath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/") + "TransitionFile\\"; string fileName = Guid.NewGuid().ToString(); string path = $"{basePath}{fileName}.xls"; DirectoryHelper.CreateIfNotExists(basePath); var stream = ExcelHelper.SaveFile(path, set); result = new HttpResponseMessage(System.Net.HttpStatusCode.OK) { Content = new StreamContent(stream) }; result.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment") { FileName = HttpUtility.UrlEncode("123.xls") }; return result; } catch (Exception ex) { return new HttpResponseMessage(HttpStatusCode.NotFound); } }
3/web端
testClick(){ var request = { tableName: this.columnNodeData.label, object: this.columnNodeData.conn }; this.$http .post("/api/Template/GetColumnFile",pamas,{ 'responseType': 'blob'}) //请求方式 post get put delete等等 .then(res => { var blob = new Blob([res.data], {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'}); //application/vnd.openxmlformats-officedocument.wordprocessingml.document这里表示doc类型 var contentDisposition = res.headers['content-disposition']; //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名; var patt = new RegExp("filename=([^;]+\\.[^\\.;]+);*"); var result = patt.exec(contentDisposition); var filename = result[1]; var downloadElement = document.createElement('a'); var href = window.URL.createObjectURL(blob); //创建下载的链接 downloadElement.style.display = 'none'; downloadElement.href = href; downloadElement.download =filename ; //下载后文件名 document.body.appendChild(downloadElement); downloadElement.click(); //点击下载 document.body.removeChild(downloadElement); //下载完成移除元素 window.URL.revokeObjectURL(href); //释放掉blob对象 }) .catch(err => { this.$message.error(err); }); }
4/excel转换为html
//var workbook = ExcelToHtmlUtils.LoadXls(path); //ExcelToHtmlConverter excelToHtmlConverter = new ExcelToHtmlConverter(); ////set output parameter //excelToHtmlConverter.OutputColumnHeaders = false; //excelToHtmlConverter.OutputHiddenColumns = true; //excelToHtmlConverter.OutputHiddenRows = true; //excelToHtmlConverter.OutputLeadingSpacesAsNonBreaking = false; //excelToHtmlConverter.OutputRowNumbers = true; //excelToHtmlConverter.UseDivsToSpan = true; ////process the excel file //excelToHtmlConverter.ProcessWorkbook(workbook); ////output the html file //excelToHtmlConverter.Document.Save(Path.ChangeExtension(path, "html"));