若有疑问可联系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;
        }

 

版权声明:本文为sunzewei原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/sunzewei/p/9811974.html