zoukankan      html  css  js  c++  java
  • EPPlusHelper

      1  public class EPPlusExcelHelper : IDisposable
      2     {
      3         public ExcelPackage ExcelPackage { get; private set; }
      4         private Stream fs;
      5 
      6         public EPPlusExcelHelper(string filePath)
      7         {
      8             if (File.Exists(filePath))
      9             {
     10                 var file = new FileInfo(filePath);
     11                 ExcelPackage = new ExcelPackage(file);
     12             }
     13             else
     14             {
     15                 fs = File.Create(filePath);
     16                 ExcelPackage = new ExcelPackage(fs);
     17 
     18             }
     19         }
     20         /// <summary>
     21         /// 获取sheet,没有时创建
     22         /// </summary>
     23         /// <param name="sheetName"></param>
     24         /// <returns></returns>
     25         public ExcelWorksheet GetOrAddSheet(string sheetName)
     26         {
     27             ExcelWorksheet ws = ExcelPackage.Workbook.Worksheets.FirstOrDefault(i => i.Name == sheetName);
     28             if (ws == null)
     29             {
     30                 ws = ExcelPackage.Workbook.Worksheets.Add(sheetName);
     31             }
     32             return ws;
     33         }
     34         /// <summary>
     35         /// 使用EPPlus导出Excel(xlsx)
     36         /// </summary>
     37         /// <param name="ExcelPackage">ExcelPackage</param>
     38         /// <param name="sourceTable">数据源</param>
     39         public void AppendSheetToWorkBook(DataTable sourceTable)
     40         {
     41             AppendSheetToWorkBook(sourceTable, true);
     42         }
     43         /// <summary>
     44         /// 使用EPPlus导出Excel(xlsx)
     45         /// </summary>
     46         /// <param name="ExcelPackage">ExcelPackage</param>
     47         /// <param name="sourceTable">数据源</param>
     48         /// <param name="isDeleteSameNameSheet">是否删除同名的sheet</param>
     49         public void AppendSheetToWorkBook(DataTable sourceTable, bool isDeleteSameNameSheet)
     50         {
     51             //Create the worksheet
     52 
     53             ExcelWorksheet ws = AddSheet(sourceTable.TableName, isDeleteSameNameSheet);
     54 
     55             //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
     56             ws.Cells["A1"].LoadFromDataTable(sourceTable, true);
     57 
     58             //Format the row
     59             FromatRow(sourceTable.Rows.Count, sourceTable.Columns.Count, ws);
     60 
     61         }
     62 
     63         /// <summary>
     64         /// 删除指定的sheet
     65         /// </summary>
     66         /// <param name="ExcelPackage"></param>
     67         /// <param name="sheetName"></param>
     68         public void DeleteSheet(string sheetName)
     69         {
     70             var sheet = ExcelPackage.Workbook.Worksheets.FirstOrDefault(i => i.Name == sheetName);
     71             if (sheet != null)
     72             {
     73                 ExcelPackage.Workbook.Worksheets.Delete(sheet);
     74             }
     75         }
     76         /// <summary>
     77         /// 导出列表到excel,已存在同名sheet将删除已存在的
     78         /// </summary>
     79         /// <typeparam name="T"></typeparam>
     80         /// <param name="ExcelPackage"></param>
     81         /// <param name="list">数据源</param>
     82         /// <param name="sheetName">sheet名称</param>
     83         public void AppendSheetToWorkBook<T>(IEnumerable<T> list, string sheetName)
     84         {
     85             AppendSheetToWorkBook(list, sheetName, true);
     86         }
     87         /// <summary>
     88         /// 导出列表到excel,已存在同名sheet将删除已存在的
     89         /// </summary>
     90         /// <typeparam name="T"></typeparam>
     91         /// <param name="ExcelPackage"></param>
     92         /// <param name="list">数据源</param>
     93         /// <param name="sheetName">sheet名称</param>
     94         /// <param name="isDeleteSameNameSheet">是否删除已存在的同名sheet,false时将重命名导出的sheet</param>
     95         public void AppendSheetToWorkBook<T>(IEnumerable<T> list, string sheetName, bool isDeleteSameNameSheet)
     96         {
     97             ExcelWorksheet ws = AddSheet(sheetName, isDeleteSameNameSheet);
     98 
     99             //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
    100             ws.Cells["A1"].LoadFromCollection(list, true);
    101 
    102         }
    103 
    104         /// <summary>
    105         /// 添加文字图片
    106         /// </summary>
    107         /// <param name="sheet"></param>
    108         /// <param name="msg">要转换成图片的文字</param>
    109         public void AddPicture(string sheetName, string msg)
    110         {
    111             Bitmap img = GetPictureString(msg);
    112 
    113             var sheet = GetOrAddSheet(sheetName);
    114             var picName = "92FF5CFE-2C1D-4A6B-92C6-661BDB9ED016";
    115             var pic = sheet.Drawings.FirstOrDefault(i => i.Name == picName);
    116             if (pic != null)
    117             {
    118                 sheet.Drawings.Remove(pic);
    119             }
    120             pic = sheet.Drawings.AddPicture(picName, img);
    121 
    122             pic.SetPosition(3, 0, 6, 0);
    123         }
    124         /// <summary>
    125         /// 文字绘制图片
    126         /// </summary>
    127         /// <param name="msg"></param>
    128         /// <returns></returns>
    129         private static Bitmap GetPictureString(string msg)
    130         {
    131             var msgs = msg.Split(new string[] { System.Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
    132             var maxLenght = msgs.Max(i => i.Length);
    133             var rowCount = msgs.Count();
    134             var rowHeight = 23;
    135             var fontWidth = 17;
    136             var img = new Bitmap(maxLenght * fontWidth, rowCount * rowHeight);
    137             using (Graphics g = Graphics.FromImage(img))
    138             {
    139                 g.Clear(Color.White);
    140                 Font font = new Font("Arial", 12, (FontStyle.Bold));
    141                 LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Blue, Color.DarkRed, 1.2f, true);
    142 
    143                 for (int i = 0; i < msgs.Count(); i++)
    144                 {
    145                     g.DrawString(msgs[i], font, brush, 3, 2 + rowHeight * i);
    146                 }
    147             }
    148 
    149             return img;
    150         }
    151 
    152         /// <summary>
    153         /// List转DataTable
    154         /// </summary>
    155         /// <typeparam name="T"></typeparam>
    156         /// <param name="data"></param>
    157         /// <returns></returns>
    158         public DataTable ListToDataTable<T>(IEnumerable<T> data)
    159         {
    160             PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(typeof(T));
    161             DataTable dataTable = new DataTable();
    162             for (int i = 0; i < properties.Count; i++)
    163             {
    164                 PropertyDescriptor property = properties[i];
    165                 dataTable.Columns.Add(property.Name, Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType);
    166             }
    167             object[] values = new object[properties.Count];
    168             foreach (T item in data)
    169             {
    170                 for (int i = 0; i < values.Length; i++)
    171                 {
    172                     values[i] = properties[i].GetValue(item);
    173                 }
    174 
    175                 dataTable.Rows.Add(values);
    176             }
    177             return dataTable;
    178         }
    179         /// <summary>
    180         /// 插入行
    181         /// </summary>
    182         /// <param name="sheet"></param>
    183         /// <param name="values">行类容,一个单元格一个对象</param>
    184         /// <param name="rowIndex">插入位置,起始位置为1</param>
    185         public void InsertValues(string sheetName, List<object> values, int rowIndex)
    186         {
    187             var sheet = GetOrAddSheet(sheetName);
    188             sheet.InsertRow(rowIndex, 1);
    189             int i = 1;
    190             foreach (var item in values)
    191             {
    192                 sheet.SetValue(rowIndex, i, item);
    193                 i++;
    194             }
    195         }
    196 
    197         /// <summary>
    198         /// 保存修改
    199         /// </summary>
    200         public void Save()
    201         {
    202             ExcelPackage.Save();
    203         }
    204 
    205         /// <summary>
    206         /// 添加Sheet到ExcelPackage
    207         /// </summary>
    208         /// <param name="ExcelPackage">ExcelPackage</param>
    209         /// <param name="sheetName">sheet名称</param>
    210         /// <param name="isDeleteSameNameSheet">如果存在同名的sheet是否删除</param>
    211         /// <returns></returns>
    212         private ExcelWorksheet AddSheet(string sheetName, bool isDeleteSameNameSheet)
    213         {
    214             if (isDeleteSameNameSheet)
    215             {
    216                 DeleteSheet(sheetName);
    217             }
    218             else
    219             {
    220                 while (ExcelPackage.Workbook.Worksheets.Any(i => i.Name == sheetName))
    221                 {
    222                     sheetName = sheetName + "(1)";
    223                 }
    224             }
    225 
    226             ExcelWorksheet ws = ExcelPackage.Workbook.Worksheets.Add(sheetName);
    227             return ws;
    228         }
    229 
    230         private void FromatRow(int rowCount, int colCount, ExcelWorksheet ws)
    231         {
    232             ExcelBorderStyle borderStyle = ExcelBorderStyle.Thin;
    233             Color borderColor = Color.FromArgb(155, 155, 155);
    234 
    235             using (ExcelRange rng = ws.Cells[1, 1, rowCount + 1, colCount])
    236             {
    237                 rng.Style.Font.Name = "宋体";
    238                 rng.Style.Font.Size = 10;
    239                 rng.Style.Fill.PatternType = ExcelFillStyle.Solid;                      //Set Pattern for the background to Solid
    240                 rng.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(255, 255, 255));
    241 
    242                 rng.Style.Border.Top.Style = borderStyle;
    243                 rng.Style.Border.Top.Color.SetColor(borderColor);
    244 
    245                 rng.Style.Border.Bottom.Style = borderStyle;
    246                 rng.Style.Border.Bottom.Color.SetColor(borderColor);
    247 
    248                 rng.Style.Border.Right.Style = borderStyle;
    249                 rng.Style.Border.Right.Color.SetColor(borderColor);
    250             }
    251 
    252             //Format the header row
    253             using (ExcelRange rng = ws.Cells[1, 1, 1, colCount])
    254             {
    255                 rng.Style.Font.Bold = true;
    256                 rng.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
    257                 rng.Style.Fill.BackgroundColor.SetColor(Color.FromArgb(234, 241, 246));  //Set color to dark blue
    258                 rng.Style.Font.Color.SetColor(Color.FromArgb(51, 51, 51));
    259             }
    260         }
    261 
    262         public void Dispose()
    263         {
    264             ExcelPackage.Dispose();
    265             if (fs != null)
    266             {
    267                 fs.Dispose();
    268                 fs.Close();
    269             }
    270 
    271         }
    272     }
    View Code
  • 相关阅读:
    听说高手都用记事本写C语言代码?真的假的!
    面向监狱编程,就靠它了!日子是越来越有判头了!
    如何把安静的程序员逼成话唠!
    想要自学编程?一个B站远远不够!
    2021年,学习C++还香吗?(文末赠书)!
    JVM--分代收集理论和垃圾收集算法
    Redis面试题
    基于RT1052 Aworks 使能GPIO输入功能(六)
    基于RT1052 Aworks 使能GPIO输出功能(五)
    基于RT1052 Aworks 使能ADC功能(四)
  • 原文地址:https://www.cnblogs.com/missile/p/9267360.html
Copyright © 2011-2022 走看看