C# EPPlus帮助类(EPPlusExcelHelper)
public class EPPlusExcelHelper : IDisposable
{
    public ExcelPackage ExcelPackage { get; private set; }
    private Stream fs;
    public EPPlusExcelHelper(string filePath)
    {
        if (File.Exists(filePath))
        {
            var file = new FileInfo(filePath);
            ExcelPackage = new ExcelPackage(file);
        }
        else
        {
            fs = File.Create(filePath);
            ExcelPackage = new ExcelPackage(fs);
        }
    }
    /// <summary>
    /// 获取sheet,没有则创建
    /// </summary>
    /// <param name="sheetName"></param>
    /// <returns></returns>
    public ExcelWorksheet GetOrAddSheet(string sheetName)
    {
        ExcelWorksheet ws = ExcelPackage.Workbook.Worksheets.FirstOrDefault(i => i.Name == sheetName);
        if (ws == null)
        {
            ws = ExcelPackage.Workbook.Worksheets.Add(sheetName);
        }
        return ws;
    }
    /// <summary>
    /// DataTable数据导出到Excel(xlsx)
    /// </summary>
    /// <param name="ExcelPackage">ExcelPackage</param>
    /// <param name="sourceTable">数据源</param>
    public void AppendSheetToWorkBook(DataTable sourceTable)
    {
        AppendSheetToWorkBook(sourceTable, true);
    }
    /// <summary>
    /// DataTable数据导出到Excel(xlsx)
    /// </summary>
    /// <param name="ExcelPackage">ExcelPackage</param>
    /// <param name="sourceTable">数据源</param>
    /// <param name="isDeleteSameNameSheet">是否删除同名的sheet</param>
    public void AppendSheetToWorkBook(DataTable sourceTable, bool isDeleteSameNameSheet)
    {
        //创建worksheet
        ExcelWorksheet ws = AddSheet(sourceTable.TableName, isDeleteSameNameSheet);
        //从单元格A1开始,将数据表加载到工作表中。第1行输出列名
        ws.Cells["A1"].LoadFromDataTable(sourceTable, true);
        //格式化Row
        FromatRow(sourceTable.Rows.Count, sourceTable.Columns.Count, ws);
    }
    /// <summary>
    /// 删除指定的sheet
    /// </summary>
    /// <param name="ExcelPackage"></param>
    /// <param name="sheetName"></param>
    public void DeleteSheet(string sheetName)
    {
        var sheet = ExcelPackage.Workbook.Worksheets.FirstOrDefault(i => i.Name == sheetName);
        if (sheet != null)
        {
            ExcelPackage.Workbook.Worksheets.Delete(sheet);
        }
    }
    /// <summary>
    /// 导出列表到excel,已存在同名sheet将删除已存在的
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="ExcelPackage"></param>
    /// <param name="list">数据源</param>
    /// <param name="sheetName">sheet名称</param>
    public void AppendSheetToWorkBook<T>(IEnumerable<T> list, string sheetName)
    {
        AppendSheetToWorkBook(list, sheetName, true);
    }
    /// <summary>
    /// 导出列表到excel,已存在同名sheet将删除已存在的
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="ExcelPackage"></param>
    /// <param name="list">数据源</param>
    /// <param name="sheetName">sheet名称</param>
    /// <param name="isDeleteSameNameSheet">是否删除已存在的同名sheet,false时将重命名导出的sheet</param>
    public void AppendSheetToWorkBook<T>(IEnumerable<T> list, string sheetName, bool isDeleteSameNameSheet)
    {
        ExcelWorksheet ws = AddSheet(sheetName, isDeleteSameNameSheet);
        ws.Cells["A1"].LoadFromCollection(list, true);
    }
    /// <summary>
    /// 添加文字图片
    /// </summary>
    /// <param name="sheet"></param>
    /// <param name="msg">要转换成图片的文字</param>
    public void AddPicture(string sheetName, string msg)
    {
        Bitmap img = GetPictureString(msg);
        var sheet = GetOrAddSheet(sheetName);
        var picName = "92FF5CFE-2C1D-4A6B-92C6-661BDB9ED016";
        var pic = sheet.Drawings.FirstOrDefault(i => i.Name == picName);
        if (pic != null)
        {
            sheet.Drawings.Remove(pic);
        }
        pic = sheet.Drawings.AddPicture(picName, img);
        pic.SetPosition(3, 0, 6, 0);
    }
    /// <summary>
    /// 文字绘制图片
    /// </summary>
    /// <param name="msg"></param>
    /// <returns></returns>
    private static Bitmap GetPictureString(string msg)
    {
        var msgs = msg.Split(new string[] { System.Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        var maxLenght = msgs.Max(i => i.Length);
        var rowCount = msgs.Count();
        var rowHeight = 23;
        var fontWidth = 17;
        var img = new Bitmap(maxLenght * fontWidth, rowCount * rowHeight);
        using (Graphics g = Graphics.FromImage(img))
        {
            g.Clear(Color.White);
            Font font = new Font("Arial", 12, (FontStyle.Bold));
            LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Blue, Color.DarkRed, 1.2f, true);
            for (int i = 0; i < msgs.Count(); i++)
            {
                g.DrawString(msgs[i], font, brush, 3, 2 + rowHeight * i);
            }
        }
        return img;
    }
    /// <summary>
    /// List转DataTable
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="data"></param>
    /// <returns></returns>
    public DataTable ListToDataTable<T>(IEnumerable<T> data)
    {
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
        DataTable dataTable = new DataTable();
        for (int i = 0; i < properties.Count; i++)
        {
            PropertyDescriptor property = properties[i];
            dataTable.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
        }
        object[] values = new object[properties.Count];
        foreach (T item in data)
        {
            for (int i = 0; i < values.Length; i++)
            {
                values[i] = properties[i].GetValue(item);
            }
            dataTable.Rows.Add(values);
        }
        return dataTable;
    }
    /// <summary>
    /// 插入行
    /// </summary>
    /// <param name="sheet"></param>
    /// <param name="values">行类容,一个单元格一个对象</param>
    /// <param name="rowIndex">插入位置,起始位置为1</param>
    public void InsertValues(string sheetName, List<object> values, int rowIndex)
    {
        var sheet = GetOrAddSheet(sheetName);
        sheet.InsertRow(rowIndex, 1);
        int i = 1;
        foreach (var item in values)
        {
            sheet.SetValue(rowIndex, i, item);
            i++;
        }
    }
    /// <summary>
    /// 保存修改
    /// </summary>
    public void Save()
    {
        ExcelPackage.Save();
    }
    /// <summary>
    /// 添加Sheet到ExcelPackage
    /// </summary>
    /// <param name="ExcelPackage">ExcelPackage</param>
    /// <param name="sheetName">sheet名称</param>
    /// <param name="isDeleteSameNameSheet">如果存在同名的sheet是否删除</param>
    /// <returns></returns>
    private ExcelWorksheet AddSheet(string sheetName, bool isDeleteSameNameSheet)
    {
        if (isDeleteSameNameSheet)
        {
            DeleteSheet(sheetName);
        }
        else
        {
            while (ExcelPackage.Workbook.Worksheets.Any(i => i.Name == sheetName))
            {
                sheetName = sheetName + "(1)";
            }
        }
        ExcelWorksheet ws = ExcelPackage.Workbook.Worksheets.Add(sheetName);
        return ws;
    }
    private void FromatRow(int rowCount, int colCount, ExcelWorksheet ws)
    {
        ExcelBorderStyle borderStyle = ExcelBorderStyle.Thin;
        Color borderColor = Color.FromArgb(155, 155, 155);
        using (ExcelRange rng = ws.Cells[1, 1, rowCount + 1, colCount])
        {
            rng.Style.Font.Name = "宋体";
            rng.Style.Font.Size = 10;
            rng.Style.Fill.PatternType = ExcelFillStyle.Solid;  //设置图案的背景为Solid
            rng.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(255, 255, 255));
            rng.Style.Border.Top.Style = borderStyle;
            rng.Style.Border.Top.Color.SetColor(borderColor);
            rng.Style.Border.Bottom.Style = borderStyle;
            rng.Style.Border.Bottom.Color.SetColor(borderColor);
            rng.Style.Border.Right.Style = borderStyle;
            rng.Style.Border.Right.Color.SetColor(borderColor);
        }
        // 格式化标题行
        using (ExcelRange rng = ws.Cells[1, 1, 1, colCount])
        {
            rng.Style.Font.Bold = true;
            rng.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            rng.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(234, 241, 246));
            rng.Style.Font.Color.SetColor(Color.FromArgb(51, 51, 51));
        }
    }
    public void Dispose()
    {
        ExcelPackage.Dispose();
        if (fs != null)
        {
            fs.Dispose();
            fs.Close();
        }
    }
}
												
											C# EPPlus帮助类(EPPlusExcelHelper)的更多相关文章
- Java类的继承与多态特性-入门笔记
		
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
 - F#周报2019年第22期
		
新闻 2019年实用F#挑战结果 FSharp.Formatting正在确定维护者 实用F#挑战的赢家们 使用F#在分布式系统中进行故障检测与共识 F#里的Cloudflare Worker Juni ...
 - EpPlus读取生成Excel帮助类+读取csv帮助类+Aspose.Cells生成Excel帮助类
		
大部分功能逻辑都在,少量自定义异常类和扩展方法 ,可用类似代码自己替换 //EpPlus读取生成Excel帮助类+读取csv帮助类,epplus只支持开放的Excel文件格式:xlsx,不支持 xls ...
 - Epplus下的一个将Excel转换成List的范型帮助类
		
因为前一段时间公司做项目的时候,用到了Excel导入和导出,然后自己找了个插件Epplus进行操作,自己将当时的一些代码抽离出来写了一个帮助类. 因为帮助类是在Epplus基础之上写的,项目需要引用E ...
 - 1.ASP.NET MVC使用EPPlus,导出数据到Excel中
		
好久没写博客了,今天特地来更新一下,今天我们要学习的是如何导出数据到Excel文件中,这里我使用的是免费开源的Epplus组件. 源代码下载:https://github.com/caofangshe ...
 - 使用 EPPlus,NPOI,操作EXCEL
		
NPOI, 读取xls文件(Excel2003及之前的版本) (NPOI.dll+Ionic.Zip.dll) http://npoi.codeplex.com/ EPPlus ...
 - 是用Epplus生成Excel 图表
		
1. 前言 这是我最近项目刚要的需求,然后在网上找了半天的教材 但是很不幸,有关于Epplus的介绍真的太少了,然后经过了我的不断研究然后不断的采坑,知道现在看到Excel都想吐的时候,终于成功的 ...
 - Epplus:导出Excel
		
看到其它大神的Epplus导出Excel,结合写出符合自己需求的将导出数据到Excel,给其它人参考一下,也可以学习http://www.cnblogs.com/caofangsheng/p/6149 ...
 - 在ASP.NET Core中使用EPPlus导入出Excel文件
		
这篇文章说明了如何使用EPPlus在ASP.NET Core中导入和导出.xls/.xlsx文件(Excel).在考虑使用.NET处理excel时,我们总是寻找第三方库或组件.使用Open Offic ...
 - 使用Epplus生成Excel 图表
		
1. 前言 这是我最近项目刚要的需求,然后在网上找了半天的教材 但是很不幸,有关于Epplus的介绍真的太少了,然后经过了我的不断研究然后不断的采坑,知道现在看到Excel都想吐的时候,终于成功的 ...
 
随机推荐
- 前端如何对cookie加密
			
在前端对 Cookie 进行加密时,你可以使用加密算法对 Cookie 的值进行加密,然后再将加密后的值存储到 Cookie 中.常用的加密算法包括对称加密算法(如 AES)和非对称加密算法(如 RS ...
 - 本地项目文件上传到git
			
初始化项目: git init 与服务器项目关联:git remote add origin "http://**************************/r/ruoyi.git&q ...
 - 使用计算巢打造纯内网部署的PaaS服务
			
私有化部署PaaS软件的公网访问需求 在阿里云计算巢,我们发现,很多本来应该只在VPC内网使用的三方PaaS软件和中间件,在部署时都开启了公网IP,这并不符合最佳实践. 以数据库为例,数据库保存了对企 ...
 - chrome edge CORS 允许跨域
			
edge: edge://flags/#block-insecure-private-network-requests chrome: 在谷歌浏览器地址栏输入"chrome://flags/ ...
 - Django路由层、视图层及模板层
			
Django路由层 URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表; 你就是以这种方式告诉Django,对于客户端发来的某个UR ...
 - CF1320D Reachable Strings
			
110和011互相转化,相当于就是0在连续两个1的情况下,移动两个位置 能够发现,0的位置的奇偶不会改变,且很多个0之间的相对位置不会改变 猜想考虑这个答案只跟0的奇偶性有关,下面小证一下:(注意下面 ...
 - Redis查询大key
			
原文 安装 wget "https://pypi.python.org/packages/68/44/5efe9e98ad83ef5b742ce62a15bea609ed5a0d1caf35 ...
 - Linux 应用案例开发手册——基于Zynq-7010/20工业开发板
			
目 录 1 开发案例说明 4 2 Linux 常用开发案例 4 2.1 tl_led_flash 案例 4 2.2 tl_key_test 案例 7 2.3 tl_can_echo 案例 11 2.4 ...
 - 详解Web应用安全系列(6)安全配置错误
			
Web攻击中的安全配置错误漏洞是一个重要的安全问题,它涉及到对应用程序.框架.应用程序服务器.Web服务器.数据库服务器等组件的安全配置不当.这类漏洞往往由于配置过程中的疏忽或错误,使得攻击者能够未经 ...
 - C#中?.、??、?:、及?等符号用途
			
1.可空类型修饰符(?) 众所周知,在C#中引用类型可以使用一个null引用来表示一个不存在的值,比如 string str = null 是正确的: 但是值类型却不能为空,比如 int k = ...