EIP权限工作流平台-基于NPOI,EPPlus文件上传解析和下载
若有疑问可联系QQ 1039318332
体验地址:
http://www.eipflow.com:8080/Account/Login
用户名:admin 密码:123456
http://www.eipflow.com
NPOI
https://www.cnblogs.com/savorboard/p/netcore-npoi.html
https://www.cnblogs.com/savorboard/p/dotnetcore-npoi.html
https://blog.csdn.net/bodilove/article/details/80858142
EPPlus
https://www.cnblogs.com/linezero/p/aspnetcoreexcel.html
EIP类库
EIP.Common.Office
1. EpplusOfficeUtil
public static class EpplusOfficeUtil { /// <summary> /// Excel文件 Content-Type /// </summary> private const string Excel = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; /// <summary> /// Excel导出 /// </summary> /// <param name="keyValuePairs">字典表【名称,数据】</param> /// <param name="sWebRootFolder">网站根文件夹</param> /// <param name="tuple"></param> public static void Export(Dictionary<string, DataTable> keyValuePairs, string sWebRootFolder, out Tuple<string, string> tuple) { if (string.IsNullOrWhiteSpace(sWebRootFolder)) tuple = Tuple.Create("", Excel); string sFileName = $"{Guid.NewGuid()}.xlsx"; var path = Path.Combine(sWebRootFolder, sFileName); if (!Directory.Exists(sWebRootFolder)) { Directory.CreateDirectory(sWebRootFolder); } FileInfo file = new FileInfo(path); using (ExcelPackage package = new ExcelPackage(file)) { foreach (var item in keyValuePairs) { string worksheetTitle = item.Key; //表名称 var dt = item.Value; //数据表 // 添加worksheet ExcelWorksheet worksheet = package.Workbook.Worksheets.Add(worksheetTitle); //添加表头 int column = 1; foreach (DataColumn dc in dt.Columns) { worksheet.Cells[1, column].Value = dc.ColumnName; worksheet.Cells[1, column].Style.Font.Bold = true;//字体为粗体 worksheet.Cells[1, column].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;//水平居中 worksheet.Cells[1, column].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;//设置样式类型 worksheet.Cells[1, column].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.FromArgb(159, 197, 232));//设置单元格背景色 column++; } for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { //添加值 worksheet.Cells[i + 2, j + 1].Value = dt.Rows[i][j].ToString(); } } //自动列宽 worksheet.Cells.AutoFitColumns(); } package.Save(); } tuple = Tuple.Create(sFileName, Excel); } /// <summary> /// Excel导入 /// </summary> /// <param name="excelFile">Excel文件</param> /// <param name="sWebRootFolder">文件存储路径</param> /// <param name="content">显示内容</param> /// <param name="isShow">是否显示内容</param> public static void Import(IFormFile excelFile, string sWebRootFolder, out string content, bool isShow = false) { if (string.IsNullOrWhiteSpace(sWebRootFolder)) content = string.Empty; string sFileName = $"{DateTime.Now.ToString("yyyyMMddHHmmssfff")}-{Guid.NewGuid()}.xlsx"; FileInfo file = new FileInfo(Path.Combine(sWebRootFolder, sFileName)); using (FileStream fs = new FileStream(file.ToString(), FileMode.Create)) { excelFile.CopyToAsync(fs); fs.Flush(); } if (isShow) { //导出单个工作表sheet using (ExcelPackage package = new ExcelPackage(file)) { StringBuilder sb = new StringBuilder(); ExcelWorksheet worksheet = package.Workbook.Worksheets[1]; int rowCount = worksheet.Dimension.Rows; int colCount = worksheet.Dimension.Columns; for (int row = 1; row <= rowCount; row++) { for (int col = 1; col <= colCount; col++) { sb.Append(worksheet.Cells[row, col].Value + "\t"); } sb.Append(Environment.NewLine); } content = sb.ToString(); } } else { content = string.Empty; } } }
控制器使用
public async Task<IActionResult> ExportUser(SystemUserPagingInput paging) { #region 获取权限控制器信息 SystemPermissionSqlInput input = new SystemPermissionSqlInput { PrincipalUser = _currentUser, EnumPermissionRoteConvert = EnumPermissionRoteConvert.人员列表数据权限 }; paging.DataSql = await _permissionLogic.FindDataPermissionSql(input); #endregion paging.Limit = int.MaxValue; var users = (await _userInfoLogic.PagingUserQuery(paging)).Data; DataTable dt = new DataTable("人员"); dt.Columns.Add(new DataColumn("登录名")); dt.Columns.Add(new DataColumn("名称")); dt.Columns.Add(new DataColumn("归属组织")); dt.Columns.Add(new DataColumn("手机号码")); dt.Columns.Add(new DataColumn("邮箱")); dt.Columns.Add(new DataColumn("QQ")); dt.Columns.Add(new DataColumn("微信号")); dt.Columns.Add(new DataColumn("办公电话")); dt.Columns.Add(new DataColumn("其他联系信息")); dt.Columns.Add(new DataColumn("最后登录时间")); dt.Columns.Add(new DataColumn("备注")); foreach (var user in users) { DataRow dr = dt.NewRow(); dr["登录名"] = user.Code; dr["名称"] = user.Name; dr["归属组织"] = user.OrganizationNames; dr["手机号码"] = user.Mobile; dr["邮箱"] = user.Email; dr["QQ"] = user.Qq; dr["微信号"] = user.WeChat; dr["办公电话"] = user.OfficeMobile; dr["其他联系信息"] = user.OtherContactInformation; dr["最后登录时间"] = user.LastVisitTime; dr["备注"] = user.Remark; dt.Rows.Add(dr); } var dic = new Dictionary<string, DataTable> { { "人员信息", dt } }; EpplusOfficeUtil.Export(dic, ConfigurationUtil.GetSection("EIP:UploadPath") + "/export", out var t); OperateStatus<string> operateStatus = new OperateStatus<string> { Code = ResultCode.Ok, Message = Chs.Successful, Data = t.Item1 }; return Json(operateStatus); }
2. NpoiOfficeUtil
public class NpoiOfficeUtil { /// <summary> /// 将excel文件内容读取到DataTable数据表中 /// </summary> /// <param name="fileName">文件完整路径名</param> /// <param name="sheetName">指定读取excel工作薄sheet的名称</param> /// <param name="isFirstRowColumn">第一行是否是DataTable的列名:true=是,false=否</param> /// <returns>DataTable数据表</returns> public static DataTable ReadExcelToDataTable(string fileName, string sheetName = null, bool isFirstRowColumn = true) { //定义要返回的datatable对象 DataTable data = new DataTable(); //excel工作表 ISheet sheet = null; //数据开始行(排除标题行) int startRow = 0; try { if (!File.Exists(fileName)) { return null; } //根据指定路径读取文件 FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read); //根据文件流创建excel数据结构 IWorkbook workbook = WorkbookFactory.Create(fs); //IWorkbook workbook = new HSSFWorkbook(fs); //如果有指定工作表名称 if (!string.IsNullOrEmpty(sheetName)) { sheet = workbook.GetSheet(sheetName); //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet if (sheet == null) { sheet = workbook.GetSheetAt(0); } } else { //如果没有指定的sheetName,则尝试获取第一个sheet sheet = workbook.GetSheetAt(0); } if (sheet != null) { IRow firstRow = sheet.GetRow(0); //一行最后一个cell的编号 即总的列数 int cellCount = firstRow.LastCellNum; //如果第一行是标题列名 if (isFirstRowColumn) { for (int i = firstRow.FirstCellNum; i < cellCount; ++i) { ICell cell = firstRow.GetCell(i); if (cell != null) { string cellValue = cell.StringCellValue; if (cellValue != null) { DataColumn column = new DataColumn(cellValue); data.Columns.Add(column); } } } startRow = sheet.FirstRowNum + 1; } else { startRow = sheet.FirstRowNum; } //最后一列的标号 int rowCount = sheet.LastRowNum; for (int i = startRow; i <= rowCount; ++i) { IRow row = sheet.GetRow(i); if (row == null) continue; //没有数据的行默认是null DataRow dataRow = data.NewRow(); for (int j = row.FirstCellNum; j < cellCount; ++j) { if (row.GetCell(j) != null) //同理,没有数据的单元格都默认是null dataRow[j] = row.GetCell(j).ToString(); } data.Rows.Add(dataRow); } } return data; } catch (Exception ex) { throw ex; } } /// <summary> /// 将文件流读取到DataTable数据表中 /// </summary> /// <param name="fileStream">文件流</param> /// <param name="sheetName">指定读取excel工作薄sheet的名称</param> /// <param name="isFirstRowColumn">第一行是否是DataTable的列名:true=是,false=否</param> /// <returns>DataTable数据表</returns> public static DataTable ReadStreamToDataTable(Stream fileStream, string sheetName = null, bool isFirstRowColumn = true) { //定义要返回的datatable对象 DataTable data = new DataTable(); //excel工作表 ISheet sheet = null; //数据开始行(排除标题行) int startRow = 0; try { //根据文件流创建excel数据结构,NPOI的工厂类WorkbookFactory会自动识别excel版本,创建出不同的excel数据结构 IWorkbook workbook = WorkbookFactory.Create(fileStream); //如果有指定工作表名称 if (!string.IsNullOrEmpty(sheetName)) { sheet = workbook.GetSheet(sheetName); //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet if (sheet == null) { sheet = workbook.GetSheetAt(0); } } else { //如果没有指定的sheetName,则尝试获取第一个sheet sheet = workbook.GetSheetAt(0); } if (sheet != null) { IRow firstRow = sheet.GetRow(0); //一行最后一个cell的编号 即总的列数 int cellCount = firstRow.LastCellNum; //如果第一行是标题列名 if (isFirstRowColumn) { for (int i = firstRow.FirstCellNum; i < cellCount; ++i) { ICell cell = firstRow.GetCell(i); if (cell != null) { string cellValue = cell.StringCellValue; if (cellValue != null) { DataColumn column = new DataColumn(cellValue); data.Columns.Add(column); } } } startRow = sheet.FirstRowNum + 1; } else { startRow = sheet.FirstRowNum; } //最后一列的标号 int rowCount = sheet.LastRowNum; for (int i = startRow; i <= rowCount; ++i) { IRow row = sheet.GetRow(i); if (row == null || row.FirstCellNum < 0) continue; //没有数据的行默认是null DataRow dataRow = data.NewRow(); for (int j = row.FirstCellNum; j < cellCount; ++j) { //同理,没有数据的单元格都默认是null ICell cell = row.GetCell(j); if (cell != null) { if (cell.CellType == CellType.Numeric) { //判断是否日期类型 if (DateUtil.IsCellDateFormatted(cell)) { dataRow[j] = row.GetCell(j).DateCellValue; } else { dataRow[j] = row.GetCell(j).ToString().Trim(); } } else { dataRow[j] = row.GetCell(j).ToString().Trim(); } } } data.Rows.Add(dataRow); } } return data; } catch (Exception ex) { throw ex; } } }
控制器使用
public async Task<JsonResult> UploadUser(IdInput input) { input.Id = _currentUser.UserId; var files = Request.Form.Files; if (files.Any()) { var file = files[0]; //保存文件 var uploadPath = ConfigurationUtil.GetSection("EIP:UploadPath") + "/upload"; if (!Directory.Exists(uploadPath)) { Directory.CreateDirectory(uploadPath); } string path = Guid.NewGuid() + Path.GetExtension(file.FileName); string filename = Path.Combine(uploadPath, path); using (FileStream fs = SystemIo.File.Create(filename)) { file.CopyTo(fs); fs.Flush(); } //读取文件 var result = NpoiOfficeUtil.ReadExcelToDataTable(filename); return Json(result); } return null; }