C# Excel导入导出(一)

本文介绍如何使用 NPOI 和 EPPLUS 在 C# 中实现 Excel 的导出功能,包括创建工作簿、工作表、设置单元格内容等具体步骤,并提供完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该篇文章大部分内容来自于http://www.cnblogs.com/polk6/p/4425620.html


Excel导入导出第三方类库有 NPOI  EPPLUS 以及DocX ,以下仅对NPOI   EPPLUS 做介绍,两者原理大致是相同的。以下内容介绍以NPOI为准,会附上EPPLUS的源码。
实际项目中使用的是EPPLUS,多用导出,因数据量在千条之内,对于该组件性能方面的未做深入了解。有兴趣的可以自己研究一下。
本篇介绍Excel的导出功能,导入功能将在C# Excel导入导出(二)中做介绍。

一、Excel理解

WorkBook:即一个Excel文件
WorkSheet:每个WorkBook里面都会包含多个WorkSheet
Row:每个WorkSheet里面有多行

二、Excel导入

  2.1 操作流程

  2.2 NOPI 以及C# 操作代码
   
  public WebApiResult ExpExcelStockMonthyReportListNPOI(StockMonthyQueryModel queryModel)
        {
            var result = new WebApiResult();
            try
            {
                // 1.获取数据集合              
                var list = _reportServive.GetStockMonthyList(queryModel).Data.ToList();

                // 2.设置单元格抬头
                // key:实体对象属性名称,可通过反射获取值
                // value:Excel列的名称
                Dictionary cellheader = new Dictionary {
                    { "wname", "一级仓库" },
                    { "secondwname", "二级仓库" },
                    { "mname", "物料名称" },
                    { "mtype", "物料类型" },
                    { "thissum", "库存余额" },
                    { "checkdate", "结余时间" }
               };

                // 3.进行Excel转换操作,并返回转换的文件下载链接
                string urlPath = EntityListToExcel(cellheader, list, "库存余额");
                result.Data = urlPath;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return result;
        }
        /// 
        /// 实体类集合导出到Excle
        /// 
        /// 单元头的Key和Value:{ { "UserName", "姓名" }, { "Age", "年龄" } };
        /// 数据源
        /// 工作表名称
        /// 文件的下载地址
        public static string EntityListToExcel(Dictionary cellHeard, IList enList, string sheetName)
        {
            try
            {
                string fileName = sheetName + "-" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xls"; // 文件名称
                string urlPath = "upload/" + fileName;  // 文件下载的URL地址,供给前台下载
                string filePath = HttpContext.Current.Server.MapPath("\\" + urlPath); // 文件路径

                // 1.检测是否存在文件夹,若不存在就建立个文件夹
                string directoryName = Path.GetDirectoryName(filePath);
                if (!Directory.Exists(directoryName))
                {
                    Directory.CreateDirectory(directoryName);
                }

                // 2.解析单元格头部,设置单元头的中文名称
                HSSFWorkbook workbook = new HSSFWorkbook(); // 工作簿
                ISheet sheet = workbook.CreateSheet(sheetName); // 工作表
                IRow row = sheet.CreateRow(0);
                List keys = cellHeard.Keys.ToList();
                for (int i = 0; i < keys.Count; i++)
                {
                    row.CreateCell(i).SetCellValue(cellHeard[keys[i]]); // 列名为Key的值
                }

                // 3.List对象的值赋值到Excel的单元格里
                int rowIndex = 1; // 从第二行开始赋值(第一行已设置为单元头)
                foreach (var en in enList)
                {
                    IRow rowTmp = sheet.CreateRow(rowIndex);
                    for (int i = 0; i < keys.Count; i++) // 根据指定的属性名称,获取对象指定属性的值
                    {
                        string cellValue = ""; // 单元格的值
                        object properotyValue = null; // 属性的值
                        System.Reflection.PropertyInfo properotyInfo = null; // 属性的信息

                        // 3.1 若属性头的名称包含'.',就表示是子类里的属性,那么就要遍历子类,eg:UserEn.UserName
                        if (keys[i].IndexOf(".") >= 0)
                        {
                            // 3.1.1 解析子类属性(这里只解析1层子类,多层子类未处理)
                            string[] properotyArray = keys[i].Split(new string[] { "." }, StringSplitOptions.RemoveEmptyEntries);
                            string subClassName = properotyArray[0]; // '.'前面的为子类的名称
                            string subClassProperotyName = properotyArray[1]; // '.'后面的为子类的属性名称
                            System.Reflection.PropertyInfo subClassInfo = en.GetType().GetProperty(subClassName); // 获取子类的类型
                            if (subClassInfo != null)
                            {
                                // 3.1.2 获取子类的实例
                                var subClassEn = en.GetType().GetProperty(subClassName).GetValue(en, null);
                                // 3.1.3 根据属性名称获取子类里的属性类型
                                properotyInfo = subClassInfo.PropertyType.GetProperty(subClassProperotyName);
                                if (properotyInfo != null)
                                {
                                    properotyValue = properotyInfo.GetValue(subClassEn, null); // 获取子类属性的值
                                }
                            }
                        }
                        else
                        {
                            // 3.2 若不是子类的属性,直接根据属性名称获取对象对应的属性
                            properotyInfo = en.GetType().GetProperty(keys[i]);
                            if (properotyInfo != null)
                            {
                                properotyValue = properotyInfo.GetValue(en, null);
                            }
                        }

                        // 3.3 属性值经过转换赋值给单元格值
                        if (properotyValue != null)
                        {
                            cellValue = properotyValue.ToString();
                            // 3.3.1 对时间初始值赋值为空
                            if (cellValue.Trim() == "0001/1/1 0:00:00" || cellValue.Trim() == "0001/1/1 23:59:59")
                            {
                                cellValue = "";
                            }
                        }

                        // 3.4 填充到Excel的单元格里
                        rowTmp.CreateCell(i).SetCellValue(cellValue);
                    }
                    rowIndex++;
                }

                // 4.生成文件
                FileStream file = new FileStream(filePath, FileMode.Create);
                workbook.Write(file);
                file.Close();

                // 5.返回下载路径
                return urlPath;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

  2.3 EPPLUS 以及C# 操作代码  
   
public virtual WebApiResult ExpExcelStockMonthyReportList(StockMonthyQueryModel queryModel)
        {
            var result = new WebApiResult();
            //数据集
            DataSet ds = new DataSet();
            //数据表
            DataTable dt = new DataTable();
            //数据列
            DataColumn dtColumn;
            //数据行
            DataRow dtRow;

            #region 表结构构建

            dtColumn = new DataColumn();
            dtColumn.DataType = Type.GetType("System.String");
            dtColumn.ColumnName = "一级仓库";
            dt.Columns.Add(dtColumn);

            dtColumn = new DataColumn();
            dtColumn.DataType = Type.GetType("System.String");
            dtColumn.ColumnName = "二级仓库";
            dt.Columns.Add(dtColumn);

            dtColumn = new DataColumn();
            dtColumn.DataType = Type.GetType("System.String");
            dtColumn.ColumnName = "物料名称";
            dt.Columns.Add(dtColumn);

            dtColumn = new DataColumn();
            dtColumn.DataType = Type.GetType("System.String");
            dtColumn.ColumnName = "物料类型";
            dt.Columns.Add(dtColumn);

            dtColumn = new DataColumn();
            dtColumn.DataType = Type.GetType("System.String");
            dtColumn.ColumnName = "库存余额";
            dt.Columns.Add(dtColumn);

            dtColumn = new DataColumn();
            dtColumn.DataType = Type.GetType("System.String");
            dtColumn.ColumnName = "结余时间";
            dt.Columns.Add(dtColumn);


            #endregion

            try
            {
                #region 信息的获取

                queryModel.Paging.PageIndex = 1;
                queryModel.Paging.PageSize = -1;

                var list = _reportServive.GetStockMonthyList(queryModel);

                foreach (var item in list.Data)
                {
                    dtRow = dt.NewRow();
                    dtRow["一级仓库"] = item.wname;
                    dtRow["二级仓库"] = item.secondwname;
                    dtRow["物料名称"] = item.mname;
                    dtRow["物料类型"] = item.mtype;
                    dtRow["库存余额"] = item.thissum;
                    dtRow["结余时间"] = item.checkdate;
                    dt.Rows.Add(dtRow);
                }
                ds.Merge(dt);
                #endregion

                #region Excel 导出
                string filename = "库存月结报表" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
                string filepath = HttpRuntime.AppDomainAppPath + "upload\\" + @filename;
                if (ExcelExport(ds, filepath))
                {
                    result.Data = filename;
                }
                #endregion
            }
            catch (Exception e)
            {
                result.AddError(e.Message);
            }
            return result;
        }

public static bool ExcelExport(DataSet ds, string filename)
        {
            try
            {
                //建立文件
                FileInfo newFile = new FileInfo(@filename);
                using (ExcelPackage package = new ExcelPackage(newFile))
                {
                    //标签页
                    int sheet = 1;
                    foreach (DataTable dt in ds.Tables)
                    {
                        //标签页
                        ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("sheet" + sheet);

                        //设置标题
                        int k = 1;
                        foreach (DataColumn dc in dt.Columns)
                        {
                            //worksheet.Row(1).Height = 30;    //行高度
                            worksheet.Cells[1, k].Value = dc.ColumnName;
                            //worksheet.Cells[1, k].Style.Font.Color.SetColor(Color.FromArgb(0, 0, 128));  //列
                            k++;
                        }
                        //数据插入
                        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];
                            }
                        }

                        ++sheet;
                    }
                    package.Save();
                }

                //释放资源
                //try
                //{
                //    KillExcel(ds);
                //}
                //catch
                //{

                //}

                return true;
            }
            catch (Exception ex)
            {
                return false;
            }

        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值