• 【小丸类库系列】Excel操作类


      1 using Microsoft.Office.Interop.Excel;
      2 using System;
      3 using System.IO;
      4 using System.Reflection;
      5 
      6 namespace ECIT.ProjectManagementSystem.Common
      7 {
      8     public class ExcelHelper : IDisposable
      9     {
     10         #region 成员变量
     11 
     12         private object missing = Missing.Value;
     13         private Application app;
     14         private Workbook workBook;
     15         public Worksheet workSheet;
     16 
     17         public void setWorkSheet(int i)
     18         {
     19             workSheet = (Worksheet)workBook.Worksheets[i];
     20         }
     21 
     22         #endregion 成员变量
     23 
     24         #region 公共属性
     25 
     26         /// <summary>
     27         /// WorkSheet数量
     28         /// </summary>
     29         public int WorkSheetCount
     30         {
     31             get { return workBook.Sheets.Count; }
     32         }
     33 
     34         #endregion 公共属性
     35 
     36         #region 构造函数
     37 
     38         /// <summary>
     39         /// 构造函数,新建一个工作簿
     40         /// </summary>
     41         public ExcelHelper()
     42         {
     43             app = new Application();
     44             workBook = app.Workbooks.Add(Type.Missing);
     45             workSheet = (Worksheet)app.Worksheets[1];
     46         }
     47 
     48         /// <summary>
     49         /// 构造函数,打开一个已有的工作簿
     50         /// </summary>
     51         /// <param name="fileName">Excel文件名</param>
     52         public ExcelHelper(string fileName)
     53         {
     54             if (!File.Exists(fileName))
     55                 throw new Exception("指定路径的Excel文件不存在!");
     56 
     57             app = new Application();
     58 
     59             workBook = app.Workbooks.Open(fileName,
     60                 Type.Missing, Type.Missing, Type.Missing, Type.Missing,
     61                 Type.Missing, Type.Missing, Type.Missing, Type.Missing,
     62                 Type.Missing, Type.Missing, Type.Missing, Type.Missing);
     63 
     64             workSheet = (Worksheet)app.Worksheets[1];
     65         }
     66 
     67         #endregion 构造函数
     68 
     69         #region 工作表操作
     70 
     71         /// <summary>
     72         /// 删除工作表
     73         /// </summary>
     74         /// <param name="i">工作表的序号</param>
     75         public void RemoveSheet(int i)
     76         {
     77             Worksheet worksheet = (Worksheet)app.Worksheets[i];
     78             app.DisplayAlerts = false;
     79             worksheet.Delete();
     80             app.DisplayAlerts = true;
     81         }
     82 
     83         /// <summary>
     84         /// 增加工作表
     85         /// </summary>
     86         /// <param name="i">工作表的序号</param>
     87         public void AddSheet(int i)
     88         {
     89             app.Worksheets.Add(Type.Missing, Type.Missing, i, XlSheetType.xlWorksheet);
     90         }
     91 
     92         #endregion 工作表操作
     93 
     94         #region 单元格操作
     95 
     96         /// <summary>
     97         /// 获得最大行号
     98         /// </summary>
     99         /// <returns></returns>
    100         public int GetUsedRangeRow()
    101         {
    102             return workSheet.UsedRange.Rows.Count;
    103         }
    104 
    105         /// <summary>
    106         /// 获得最大列号
    107         /// </summary>
    108         /// <returns></returns>
    109         public int GetUsedRangeColumn()
    110         {
    111             return workSheet.UsedRange.Columns.Count;
    112         }
    113 
    114         /// <summary>
    115         /// 获取单元格的文本内容
    116         /// </summary>
    117         /// <param name="row">行号</param>
    118         /// <param name="column">列号</param>
    119         /// <returns></returns>
    120         public string GetCellText(int row, int column)
    121         {
    122             if (workSheet == null)
    123                 return null;
    124             Range range = (Range)workSheet.Cells[row, column];
    125             string cellContent = (range.Value2 == null) ? "" : range.Text.ToString();
    126             return cellContent;
    127         }
    128 
    129         /// <summary>
    130         /// 赋值单元格
    131         /// </summary>
    132         /// <param name="excelRange"></param>
    133         /// <param name="value"></param>
    134         public void SetValue(ExcelRange excelRange, object value)
    135         {
    136             workSheet.Range[excelRange.ToString()].Value2 = value;
    137         }
    138 
    139         /// <summary>
    140         /// 设置字体大小
    141         /// </summary>
    142         /// <param name="excelRange"></param>
    143         /// <param name="size"></param>
    144         public void SetFontSize(ExcelRange excelRange, int size)
    145         {
    146             workSheet.Range[excelRange.ToString()].Font.Size = size;
    147         }
    148 
    149         /// <summary>
    150         /// 设置字体颜色
    151         /// </summary>
    152         /// <param name="excelRange"></param>
    153         /// <param name="color"></param>
    154         public void SetFontColor(ExcelRange excelRange, System.Drawing.Color color)
    155         {
    156             workSheet.Range[excelRange.ToString()].Font.Color = color;
    157         }
    158 
    159         /// <summary>
    160         /// 设置单元格背景色
    161         /// </summary>
    162         /// <param name="excelRange"></param>
    163         /// <param name="color"></param>
    164         public void SetBackgroundColor(ExcelRange excelRange, System.Drawing.Color color)
    165         {
    166             workSheet.Range[excelRange.ToString()].Interior.Color = color;
    167         }
    168 
    169         /// <summary>
    170         /// 设置字体粗体
    171         /// </summary>
    172         /// <param name="excelRange"></param>
    173         /// <param name="isBold"></param>
    174         public void SetFontBold(ExcelRange excelRange, bool isBold)
    175         {
    176             workSheet.Range[excelRange.ToString()].Font.Bold = isBold;    //设置字体粗体。
    177         }
    178 
    179         /// <summary>
    180         /// 设置是否有下划线
    181         /// </summary>
    182         /// <param name="excelRange"></param>
    183         /// <param name="isUnderline"></param>
    184         public void SetUnderline(ExcelRange excelRange, bool isUnderline)
    185         {
    186             workSheet.Range[excelRange.ToString()].Font.Underline = isUnderline;
    187         }
    188 
    189         /// <summary>
    190         /// 设置字体
    191         /// </summary>
    192         /// <param name="excelRange"></param>
    193         /// <param name="fontname"></param>
    194         public void SetFontName(ExcelRange excelRange, string fontname)
    195         {
    196             workSheet.Range[excelRange.ToString()].Font.Name = fontname;
    197         }
    198 
    199         /// <summary>
    200         /// 设置单元格宽度
    201         /// </summary>
    202         /// <param name="excelRange"></param>
    203         /// <param name="columnwidth"></param>
    204         public void SetColumnWidth(ExcelRange excelRange, int columnwidth)
    205         {
    206             workSheet.Range[excelRange.ToString()].ColumnWidth = columnwidth;
    207         }
    208 
    209         /// <summary>
    210         /// 文本自动换行
    211         /// </summary>
    212         /// <param name="excelRange"></param>
    213         /// <param name="isWrapText"></param>
    214         public void SetWrapText(ExcelRange excelRange, bool isWrapText)
    215         {
    216             workSheet.Range[excelRange.ToString()].WrapText = isWrapText;
    217         }
    218 
    219         /// <summary>
    220         /// 文本横向对齐方式
    221         /// </summary>
    222         /// <param name="excelRange"></param>
    223         /// <param name="xlHAlign"></param>
    224         public void SetHorizontalAlignment(ExcelRange excelRange, XlHAlign xlHAlign)
    225         {
    226             workSheet.Range[excelRange.ToString()].HorizontalAlignment = xlHAlign;
    227         }
    228 
    229         /// <summary>
    230         /// 文本垂直对齐方式
    231         /// </summary>
    232         /// <param name="excelRange"></param>
    233         /// <param name="xlHAlign"></param>
    234         public void SetVerticalAlignment(ExcelRange excelRange, XlHAlign xlHAlign)
    235         {
    236             workSheet.Range[excelRange.ToString()].VerticalAlignment = xlHAlign;
    237         }
    238 
    239         /// <summary>
    240         /// 自动调整列宽
    241         /// </summary>
    242         /// <param name="excelRange"></param>
    243         public void FitColumn(ExcelRange excelRange)
    244         {
    245             workSheet.Range[excelRange.ToString()].EntireColumn.AutoFit();
    246         }
    247 
    248         /// <summary>
    249         /// 设置单元格边框
    250         /// </summary>
    251         /// <param name="excelRange"></param>
    252         public void SetBorderAround(ExcelRange excelRange, XlLineStyle LineStyle, XlBorderWeight BorderWeight)
    253         {
    254             workSheet.Range[excelRange.ToString()].BorderAround(LineStyle, BorderWeight, XlColorIndex.xlColorIndexAutomatic, 15);    //设置区域边框
    255         }
    256 
    257         /// <summary>
    258         /// 单元格合并动作
    259         /// </summary>
    260         /// <param name="excelRange"></param>
    261         /// <param name="IsMergeCells"></param>
    262         public void MergeCell(ExcelRange excelRange, bool IsMergeCells)
    263         {
    264             workSheet.Range[excelRange.ToString()].MergeCells = IsMergeCells;
    265         }
    266 
    267         #endregion 单元格操作
    268 
    269         #region 图表绘制
    270 
    271         /// <summary>
    272         /// 3D柱状图
    273         /// </summary>
    274         /// <param name="excelRange"></param>
    275         /// <param name="left"></param>
    276         /// <param name="top"></param>
    277         /// <param name="width"></param>
    278         /// <param name="height"></param>
    279         /// <param name="title"></param>
    280         /// <param name="xTitle"></param>
    281         /// <param name="yTitle"></param>
    282         /// <param name="plotBy">XlRowCol.xlRows=数据系列在一列中 XlRowCol.xlColumns=数据系列在一行中</param>
    283         public void Draw3DColumn(ExcelRange excelRange, double left, double top, double width, double height, string title, string xTitle, string yTitle, XlRowCol plotBy)
    284         {
    285             ChartObjects charts = (ChartObjects)workSheet.ChartObjects(Type.Missing);
    286             ChartObject chartObj = charts.Add(left, top, width, height);
    287             Chart chart = chartObj.Chart;
    288             chart.ChartWizard(workSheet.Range[excelRange.ToString()], XlChartType.xl3DColumn, missing, plotBy, 1, 1, true, title, xTitle, yTitle, 1);
    289         }
    290 
    291         /// <summary>
    292         /// 3D柱状图
    293         /// </summary>
    294         /// <param name="excelRange"></param>
    295         /// <param name="startRange"></param>
    296         /// <param name="width"></param>
    297         /// <param name="height"></param>
    298         /// <param name="title"></param>
    299         /// <param name="xTitle"></param>
    300         /// <param name="yTitle"></param>
    301         /// <param name="plotBy">XlRowCol.xlRows=数据系列在一列中 XlRowCol.xlColumns=数据系列在一行中</param>
    302         public void Draw3DColumn(ExcelRange excelRange, ExcelRange startRange, double width, double height, string title, string xTitle, string yTitle, XlRowCol plotBy)
    303         {
    304             Draw3DColumn(excelRange, Convert.ToDouble(workSheet.Range[startRange.ToString()].Left), Convert.ToDouble(workSheet.Range[startRange.ToString()].Top), width, height, title, xTitle, yTitle, plotBy);
    305         }
    306 
    307         /// <summary>
    308         /// 3D饼图
    309         /// </summary>
    310         /// <param name="excelRange"></param>
    311         /// <param name="left"></param>
    312         /// <param name="top"></param>
    313         /// <param name="width"></param>
    314         /// <param name="height"></param>
    315         /// <param name="title"></param>
    316         public void Draw3DPie(ExcelRange excelRange, double left, double top, double width, double height, string title)
    317         {
    318             ChartObjects charts = (ChartObjects)workSheet.ChartObjects(Type.Missing);
    319             ChartObject chartObj = charts.Add(left, top, width, height);
    320             Chart chart = chartObj.Chart;
    321             chart.ChartWizard(workSheet.Range[excelRange.ToString()], XlChartType.xl3DPie, missing, XlRowCol.xlColumns, 1, 1, true, title, missing, missing, 1);
    322         }
    323 
    324         /// <summary>
    325         /// 3D饼图
    326         /// </summary>
    327         /// <param name="excelRange"></param>
    328         /// <param name="startRange"></param>
    329         /// <param name="width"></param>
    330         /// <param name="height"></param>
    331         /// <param name="title"></param>
    332         public void Draw3DPie(ExcelRange excelRange, ExcelRange startRange, double width, double height, string title)
    333         {
    334             Draw3DPie(excelRange, Convert.ToDouble(workSheet.Range[startRange.ToString()].Left), Convert.ToDouble(workSheet.Range[startRange.ToString()].Top), width, height, title);
    335         }
    336 
    337         #endregion 图表绘制
    338 
    339         #region 文件操作
    340 
    341         /// <summary>
    342         /// 保存文件
    343         /// </summary>
    344         /// <param name="fileName"></param>
    345         public void SaveFile(string fileName)
    346         {
    347             try
    348             {
    349                 workBook.RefreshAll();
    350                 workBook.SaveAs(fileName, missing, missing, missing, missing, missing, XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing);
    351             }
    352             catch (Exception e)
    353             {
    354                 Console.WriteLine(e);
    355                 throw e;
    356             }
    357         }
    358 
    359         #endregion 文件操作
    360 
    361         #region 资源回收
    362 
    363         private bool disposed = false;
    364 
    365         ~ExcelHelper()
    366         {
    367             //必须为false
    368             Dispose(false);
    369         }
    370 
    371         public void Dispose()
    372         {
    373             //必须为true
    374             Dispose(true);
    375             //通知垃圾回收机制不再调用终结器(析构器)
    376             GC.SuppressFinalize(this);
    377         }
    378 
    379         private void Dispose(bool disposing)
    380         {
    381             if (disposed)
    382             {
    383                 return;
    384             }
    385             if (disposing)
    386             {
    387                 // 清理托管资源
    388             }
    389 
    390             // 清理非托管资源
    391             if (app != null)
    392             {
    393                 app.Quit();
    394                 app = null;
    395             }
    396 
    397             GC.Collect();
    398             GC.WaitForPendingFinalizers();
    399 
    400             //让类型知道自己已经被释放
    401             disposed = true;
    402         }
    403 
    404         #endregion 资源回收
    405     }
    406 
    407     /// <summary>
    408     /// EXCEL单元格操作范围
    409     /// </summary>
    410     public class ExcelRange
    411     {
    412         public string RangeString { get; set; }
    413 
    414         public ExcelRange(string RangeString)
    415         {
    416             this.RangeString = RangeString;
    417         }
    418 
    419         /// <summary>
    420         /// 输入Excel的行号和列号获得范围
    421         /// </summary>
    422         /// <param name="x">列号</param>
    423         /// <param name="y">行号</param>
    424         public ExcelRange(int x, int y)
    425         {
    426             this.RangeString = IntToLetter(x) + y.ToString();
    427         }
    428 
    429         public ExcelRange(int x1, int y1, int x2, int y2)
    430         {
    431             this.RangeString = IntToLetter(x1) + y1.ToString() + ":" + IntToLetter(x2) + y2.ToString();
    432         }
    433 
    434         public ExcelRange(ExcelRange from, ExcelRange to)
    435         {
    436             this.RangeString = from.RangeString + ":" + to.RangeString;
    437         }
    438 
    439         static public implicit operator ExcelRange(string value)
    440         {
    441             return new ExcelRange(value);
    442         }
    443 
    444         static public implicit operator string (ExcelRange ExcelRange)
    445         {
    446             return ExcelRange.RangeString;
    447         }
    448 
    449         public override string ToString()
    450         {
    451             return RangeString;
    452         }
    453 
    454         /// <summary>
    455         /// 将Excel列的整数索引值转换为字符索引值
    456         /// </summary>
    457         /// <param name="n"></param>
    458         /// <returns></returns>
    459         public static string IntToLetter(int n)
    460         {
    461             if (n > 700)
    462                 throw new Exception("索引超出范围,Excel的列索引不能超过700!");
    463 
    464             int i = Convert.ToInt32(n / 26);
    465             int j = n % 26;
    466 
    467             char c1 = Convert.ToChar(i + 64);
    468             char c2 = Convert.ToChar(j + 64);
    469 
    470             if (n > 26)
    471                 return c1.ToString() + c2.ToString();
    472             else if (n == 26)
    473                 return "Z";
    474             else
    475                 return c2.ToString();
    476         }
    477     }
    478 }
  • 相关阅读:
    《程序员修炼之道》阅读笔记2
    《程序员修炼之道》阅读笔记1
    Ubuntu16桥接模式上网并设置静态ip
    读《架构漫谈》有感
    质量属性6个常见属性的场景分析
    sql注水
    python版本切换
    使用vue-cli构建 webpack打包工具时,生产环境下,每次build时,删除dist目录,并重新生成,以防dist目录文件越来越多。
    Java栈与堆
    从一个字符串s的第i个字符(不包括此字符)开始删除n个字符
  • 原文地址:https://www.cnblogs.com/maruko/p/5015778.html
Copyright © 2020-2023  润新知