C# EF ExcelHelper 导入导出

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: C# EF ExcelHelper 导入导出
    //EF导出示例
    var query = from u in orderQuery
    join pro in dbContext.Project on
    u.projectNo equals pro.projectNo
    join org in dbContext.Org on
    u.orgNo equals org.orgNo into JoinedEmpDept
    from dept in JoinedEmpDept.DefaultIfEmpty()
    select new
    {
        学校名称= pro.projectName,
        所属班级=dept.orgName,
        费用类型=u.orderName,
        学生姓名=u.userName,
        身份证号=u.userNo,
        手机号=u.userPhone,
        订单编号=u.orderNo,
        费用金额=u.orderAmount/100.0,
        支付状态=u.payState==1?"已支付":"未支付",
        支付时间=u.payTime,
        银行流水号=u.ccbOrderId,
        添加时间=u.createTime,
        备注=u.remark        
    };
    string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
    string file = localPath + fileName;
    using (ExcelHelper excelHelper = new ExcelHelper(file))
    {
        var list = query.OrderByDescending(u => u.添加时间).ToList();
        excelHelper.ListToExcel(list,"费用");
        return ReturnNode.ReturnSuccess(fileName);
    }
//EF导出示例2,SQL直接导出
try
{
    var sql = "SELECT * from user ";
   //输出排名
   //sql = string.Format("SELECT @rank :=@rank + 1 AS 排名,A.* FROM ( {0}) A, (SELECT @rank := 0) B;", sql);
    string fileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".xlsx";
    string file = localPath + fileName;
    using (ExcelHelper excelHelper = new ExcelHelper(file))
    {
        System.Data.Common.DbCommand cmd = dbContext.Database.Connection.CreateCommand();
        cmd.CommandText = sql;
        cmd.CommandType = CommandType.Text;
        //转成sqlcommand正常查询语句。
        MySql.Data.MySqlClient.MySqlDataAdapter da = new MySql.Data.MySqlClient.MySqlDataAdapter();
        da.SelectCommand = cmd as MySql.Data.MySqlClient.MySqlCommand;
        DataTable dt = new DataTable();
        da.Fill(dt);
        excelHelper.DataTableToExcel(dt, "用户表",true);
        return ReturnNode.ReturnSuccess(serverPath + fileName);
    }
}
catch (Exception ex)
{
    return ReturnNode.ReturnError(ex.Message);
}
//导入示例
string file = "C:\\Data\\模板.xlsx";
using (ExcelHelper excelHelper = new ExcelHelper(file))
{
    DataTable dt = excelHelper.ExcelToDataTable("Sheet1", true);
    int num = 0;
    for (int i = 0; i < dt.Rows.Count; ++i)
    {
        DataRow row = dt.Rows[i];
        string index = row[0].ToString();
        string orgName = row[1].ToString();
        string orgNo = row[2].ToString();
        string orderName = row[3].ToString();
        string orderAmount = row[4].ToString();
        string userName = row[5].ToString();
        string userNo = row[6].ToString();
        string userPhone = row[7].ToString();
        string remark = row[8].ToString();
        num++;
    }
}
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace YFAPICommon.Lib
{
    class ExcelHelper : IDisposable
    {
        private string fileName = null; //文件名
        private NPOI.SS.UserModel.IWorkbook workbook = null;
        private FileStream fs = null;
        private bool disposed;
        public ExcelHelper(string fileName)
        {
            this.fileName = fileName;
            disposed = false;
        }
        /// <summary>
        /// 将DataTable数据导入到excel中
        /// </summary>
        /// <param name="data">要导入的数据</param>
        /// <param name="isColumnWritten">DataTable的列名是否要导入</param>
        /// <param name="sheetName">要导入的excel的sheet的名称</param>
        /// <returns>导入数据行数(包含列名那一行)</returns>
        public int DataTableToExcel(DataTable data, string sheetName, bool isColumnWritten)
        {
            int i = 0;
            int j = 0;
            int count = 0;
            ISheet sheet = null;
            fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
            if (fileName.IndexOf(".xlsx") > 0) // 2007版本
                workbook = new XSSFWorkbook();
            else if (fileName.IndexOf(".xls") > 0) // 2003版本
                workbook = new HSSFWorkbook();
            try
            {
                if (workbook != null)
                {
                    sheet = workbook.CreateSheet(sheetName);
                }
                else
                {
                    return -1;
                }
                if (isColumnWritten == true) //写入DataTable的列名
                {
                    IRow row = sheet.CreateRow(0);
                    for (j = 0; j < data.Columns.Count; ++j)
                    {
                        row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
                    }
                    count = 1;
                }
                else
                {
                    count = 0;
                }
                for (i = 0; i < data.Rows.Count; ++i)
                {
                    IRow row = sheet.CreateRow(count);
                    for (j = 0; j < data.Columns.Count; ++j)
                    {
                        row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
                    }
                    ++count;
                }
                workbook.Write(fs); //写入到excel
                return count;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.Message);
                return -1;
            }
        }
        /// <summary>
        /// 将List数据导入到excel中
        /// </summary>
        /// <param name="data">要导入的数据</param>
        /// <param name="sheetName">要导入的excel的sheet的名称</param>
        /// <returns>导入数据行数(包含列名那一行)</returns>
        public int ListToExcel<T>(List<T> data, string sheetName)
        {
            ISheet sheet = null;
            fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite);
            if (fileName.IndexOf(".xlsx") > 0) // 2007版本
                workbook = new XSSFWorkbook();
            else if (fileName.IndexOf(".xls") > 0) // 2003版本
                workbook = new HSSFWorkbook();
            try
            {
                if (workbook != null)
                {
                    sheet = workbook.CreateSheet(sheetName);
                }
                else
                {
                    return -1;
                }
                PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
                IRow row0 = sheet.CreateRow(0);
                for (int i = 0; i < properties.Count; i++)
                {
                    PropertyDescriptor property = properties[i];
                    Debug.WriteLine(property.Name);
                    row0.CreateCell(i).SetCellValue(property.Name);
                }
                int count = 1;
                object[] values = new object[properties.Count];
                foreach (T item in data)
                {
                    IRow row = sheet.CreateRow(count);
                    for (int j = 0; j < values.Length; j++)
                    {
                        object obj = properties[j].GetValue(item);
                        Debug.WriteLine(properties[j].GetValue(item));
                        row.CreateCell(j).SetCellValue(obj==null?"":obj.ToString());
                    }
                    ++count;
                }
                workbook.Write(fs); //写入到excel
                return count;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: " + ex.Message);
                return -1;
            }
        }
        /// <summary>
        /// 将excel中的数据导入到DataTable中
        /// </summary>
        /// <param name="sheetName">excel工作薄sheet的名称</param>
        /// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>
        /// <returns>返回的DataTable</returns>
        public DataTable ExcelToDataTable(string sheetName, bool isFirstRowColumn)
        {
            ISheet sheet = null;
            DataTable data = new DataTable();
            int startRow = 0;
            try
            {
                fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
                if (fileName.IndexOf(".xlsx") > 0) // 2007版本
                    workbook = new XSSFWorkbook(fs);
                else if (fileName.IndexOf(".xls") > 0) // 2003版本
                    workbook = new HSSFWorkbook(fs);
                if (sheetName != null)
                {
                    sheet = workbook.GetSheet(sheetName);
                    if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet
                    {
                        sheet = workbook.GetSheetAt(0);
                    }
                }
                else
                {
                    sheet = workbook.GetSheetAt(0);
                }
                if (sheet != null)
                {
                    IRow firstRow = sheet.GetRow(0);
                    int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数
                    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)
                            break;
                            //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)
            {
                Console.WriteLine("Exception: " + ex.Message);
                //System.Windows.Forms.MessageBox.Show(ex.Message);
                return null;
            }
        }
        internal void ListToExcel(List<object> list, string v)
        {
            throw new NotImplementedException();
        }
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    if (fs != null)
                        fs.Close();
                }
                fs = null;
                disposed = true;
            }
        }
    }
}
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
开发框架 算法 .NET
C#使用MiniExcel导入导出数据到Excel/CSV文件
C#使用MiniExcel导入导出数据到Excel/CSV文件
100 0
|
7月前
|
开发框架 安全 .NET
C# .NET面试系列三:集合、异常、泛型、LINQ、委托、EF!
<h2>集合、异常、泛型、LINQ、委托、EF! #### 1. IList 接口与 List 的区别是什么? IList 接口和 List 类是C#中集合的两个相关但不同的概念。下面是它们的主要区别: <b>IList 接口</b> IList 接口是C#中定义的一个泛型接口,位于 System.Collections 命名空间。它派生自 ICollection 接口,定义了一个可以通过索引访问的有序集合。 ```c# IList 接口包含一系列索引化的属性和方法,允许按索引访问、插入、移除元素等。 由于是接口,它只定义了成员的契约,而不提供具体的实现。类似于 IEnumera
363 2
c# EF导出到word
c# EF导出到word
55 0
|
缓存 关系型数据库 MySQL
C#-EF Core使用MySQL数据库
Entity Framework Core (EF Core)是微软推荐的基于.NET Core 的应用程序数据访问技术。开源,轻量级,可扩展并且支持跨平台开发。EF Core是一种对象关系映射器(ORM),通过应用程序实体对象和关系数据库中的数据的映射,使得开发人员能够以面向对象的方式处理数据。
630 0
|
SQL 关系型数据库 C#
.NET(C#)有哪些主流的ORM框架,SqlSugar,Dapper,EF还是...
前言 在以前的一篇文章中,为大家分享了《什么是ORM?为什么用ORM?浅析ORM的使用及利弊》。那么,在目前的.NET(C#)的世界里,有哪些主流的ORM,SqlSugar,Dapper,Entity Framework(EF)还是ServiceStack.OrmLite?或者是你还有更好的ORM推荐呢? 如果有的话,不防也一起分享给大家。
15820 0
|
SQL 数据库连接 数据库
『SQLite』C#/.NET EF+SQLite.CodeFirst——真正实现CodeFirst
📣读完这篇文章里你能收获到 - 本文详细介绍了SQLite实现CodeFirst的方式 - 通过代码配合图文的形式进行讲解
593 0
『SQLite』C#/.NET EF+SQLite.CodeFirst——真正实现CodeFirst
|
JavaScript C# Windows
C# 通过StreamWriter输出的TXT流文件,前缀带EF BB BF
C# 通过StreamWriter输出的TXT流文件,前缀带EF BB BF
340 0
C# 通过StreamWriter输出的TXT流文件,前缀带EF BB BF
|
存储 C# 数据库
C# 数据库并发的解决方案(通用版、EF版)
还是那句老话:十年河东,十年河西,莫欺骚年穷!~_~ 打错个字,应该是莫欺少年穷! 学历代表你的过去,能力代表你的现在,学习代表你的将来。 学无止境,精益求精。 自ASP.NET诞生以来,微软提供了不少控制并发的方法,在了解这些控制并发的方法前,我们先来简单介绍下并发! 并发:同一时间或者同一时刻多个访问者同时访问某一更新操作时,会产生并发! 针对并发的处理,又分为悲观并发处理和乐观并发处理 所谓悲观/乐观并发处理,可以这样理解: 悲观者认为:在程序的运行过程中,并发很容易发生滴,因此,悲观者提出了他们的处理模式:在我执行一个方法时,不允许其他访问者介入这个方法。
3210 0