当前位置:   article > 正文

C#中 EPPlus对Excel的读写_c# epplus 读取excel xls 后缀

c# epplus 读取excel xls 后缀

1. EPPlus概述

EPPlus 是使用Open Office XML格式(xlsx)读写Excel 2007 / 2010文件的.net开发库。
EPPlus 支持:
  • 单元格范围
  • 单元格样式(边框,颜色,填充,字体,数字,对齐)
  • 图表
  • 图片
  • 形状
  • 批注
  • 表格
  • 保护
  • 加密
  • 数据透视表
  • 数据验证
  • 条件格式
  • VBA
  • 公式计算
  • 更多......

2. EPPlus核心类介绍

2.1  ExcelPackage类

ExcelPackage是EPPlus的入口类,解析一个Excel文件,生成ExcelWorkbook对象来表示一个Excel。该类实现了IDisposable接口,也就是说可以使用using进行对象释放。

10个构造函数,下面是常用的3个:

public ExcelPackage();

public ExcelPackage(FileInfo newFile);

public ExcelPackage(Stream newStream);

不管构造函数中传入的参数是否有效,该类的Workbook属性都会自动创建,无须担心空指针问题。

2.2 ExcelWorkbook类

ExcelWorkbook类表示了一个Excel文件,其Worksheets属性对应着Excel的各个Sheet。Worksheets属性会自动创建,不用担心空指针异常,但是其Count可能为0。

ExcelWorkbook的Properties属性可以对Office的一些属性进行设置,例如:

public string Author { get; set; }
public string Title { get; set; }
public string Comments { get; set; }

注意:在获取具体的Sheet时,索引号从1开始,例如:

ExcelWorksheet sheet = package.Workbook.Worksheets[1];

2.3 ExcelWorksheet类

一些常用属性:

sheet.DefaultColWidth = 10; //默认列宽
sheet.DefaultRowHeight = 30; //默认行高
sheet.TabColor = Color.Blue; //Sheet Tab的颜色
sheet.Cells.Style.WrapText = true; //单元格文字自动换行

对行列的增删操作:

public void InsertRow(int rowFrom, int rows);

public void InsertColumn(int columnFrom, int columns);

public void DeleteRow(int rowFrom, int rows);

public void DeleteColumn(int columnFrom, int columns);

设置指定行或列的样式(宽、高、隐藏、自动换行、数字格式、锁定等):

sheet.Column(1).Width = 10;
sheet.Row(1).Height = 30;

sheet.Column(1).Hidden = true;
sheet.Row(1).Hidden = true;

sheet.Column(1).Style.WrapText = true;

sheet.Column(1).Style.Numberformat.Format = "$#,###.00";

sheet.Row(1).Style.Locked = true;

自适应宽度设置:

public void AutoFit();
public void AutoFit(double MinimumWidth);
public void AutoFit(double MinimumWidth, double MaximumWidth);
//未传入MinimumWidth时,使用Sheet的DefaultColWidth作为最小值,此时若没有提前对DefaultColWidth进行设置就会报错
//此方法时对自动换行和合并的单元格无效

2.4 ExcelRange类

3个获取单元格范围的方法:

public ExcelRange this[string Address] { get; }
//Address是指"A1:C5"这种格式

public ExcelRange this[int Row, int Col] { get; }

public ExcelRange this[int FromRow, int FromCol, int ToRow, int ToCol] { get; }

重要属性:

public object Value { get; set; }
//获取或设置单元格的值

复制单元格:

public void Copy(ExcelRangeBase Destination);

从二维数据集合中装载数据:

public ExcelRangeBase LoadFromCollection<T>(IEnumerable<T> Collection);

public ExcelRangeBase LoadFromDataReader(IDataReader Reader, bool PrintHeaders);

public ExcelRangeBase LoadFromText(FileInfo TextFile);
//这里的文件是指CSV文件

//数据装载时,会与ExcelRange的行列进行对应,将值设置到其中,这些单元格没有样式和数字格式

2.5 样式

样式包括字体、颜色、对齐、边框等。

range.Style.Fill.PatternType = ExcelFillStyle.Solid;
range.Style.Fill.BackgroundColor.SetColor(Color.Gray);
//在设置Style.Fill的其他属性之前,必须设置PatternType 
//设置了Style.Fill.PatternType之后,必须设置Style.Fill.BackgroundColor,否则单元格背景为黑色
//注意Style.Fill.BackgroundColor是个只读属性,需要通过SetColor()方法设置颜色
range.Font.Color.SetColor(Color.Red);
range.HorizontalAlignment = ExcelHorizontalAlignment.CenterContinuous;

2.6  数字格式

range.Style.Numberformat.Format = "$#,###.00";

使用数字格式时,一定要自行检查格式的正确性,因为产生的过程中EPPlus不会检查其正确性,如果格式有错,在打开产生的Excel文件时会提示文件格式不正确。

2.7 公式

sheet.Cells[1, 3].range.Formula = "AVERAGE(A1, B1)";
sheet.Cells[1, 3].FormulaR1C1 = "AVERAGE(RC[-2], RC[-1])";
//以上两个公式表达意思相同——对于第一行,C列的值等于A列和B列的平均值

使用公式和使用数字格式有同样的注意事项,需要自行检查正确性。

建议总是记录当前Sheet有多少行和列,方便使用公式时定位单元格。

建议对公式相关代码进行注释,有助于其他程序员理解。


  1. /// <summary>
  2. /// 导入
  3. /// </summary>
  4. /// <param name="stream"></param>
  5. /// <returns></returns>
  6. public static ICollection<Student> Import(Stream stream)
  7. {
  8. ICollection<Student> students = new List<Student>();
  9. #region read excel
  10. using (stream)
  11. {
  12. ExcelPackage package = new ExcelPackage(stream);
  13. ExcelWorksheet sheet = package.Workbook.Worksheets[1];
  14. #region check excel format
  15. if (sheet == null)
  16. {
  17. return students;
  18. }
  19. if (!sheet.Cells[1, 1].Value.Equals("Name") ||
  20. !sheet.Cells[1, 2].Value.Equals("Age") ||
  21. !sheet.Cells[1, 3].Value.Equals("Gender") ||
  22. !sheet.Cells[1, 4].Value.Equals("English Score") ||
  23. !sheet.Cells[1, 5].Value.Equals("Math Score"))
  24. {
  25. return students;
  26. }
  27. #endregion
  28. #region get last row index
  29. int lastRow = sheet.Dimension.End.Row;
  30. while (sheet.Cells[lastRow, 1].Value == null)
  31. {
  32. lastRow--;
  33. }
  34. #endregion
  35. #region read datas
  36. for (int i = 2; i <= lastRow; i++)
  37. {
  38. students.Add(new Student
  39. {
  40. Name = sheet.Cells[i, 1].Value.ToString(),
  41. Age = int.Parse(sheet.Cells[i, 2].Value.ToString()),
  42. Gender = (Gender)Enum.Parse(typeof(Gender), sheet.Cells[i, 3].Value.ToString()),
  43. EnglishScore = int.Parse(sheet.Cells[i, 4].Value.ToString()),
  44. MathScore = int.Parse(sheet.Cells[i, 5].Value.ToString())
  45. });
  46. }
  47. }

  1. /// <summary>
  2. /// 导出
  3. /// </summary>
  4. /// <param name="students"></param>
  5. /// <returns></returns>
  6. public static MemoryStream Export(ICollection<Student> students)
  7. {
  8. MemoryStream stream = new MemoryStream();
  9. ExcelPackage package = new ExcelPackage(stream);
  10. package.Workbook.Worksheets.Add("Students");
  11. ExcelWorksheet sheet = package.Workbook.Worksheets[1];
  12. #region write header
  13. sheet.Cells[1, 1].Value = "Name";
  14. sheet.Cells[1, 2].Value = "Age";
  15. sheet.Cells[1, 3].Value = "Gender";
  16. sheet.Cells[1, 4].Value = "English Score";
  17. sheet.Cells[1, 5].Value = "Math Score";
  18. sheet.Cells[1, 6].Value = "Average Score";
  19. using (ExcelRange range = sheet.Cells[1, 1, 1, 6])
  20. {
  21. range.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
  22. range.Style.Fill.BackgroundColor.SetColor(Color.Gray);
  23. range.Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thick;
  24. range.Style.Border.Bottom.Color.SetColor(Color.Black);
  25. range.AutoFitColumns(4);
  26. }
  27. #endregion
  28. #region write content
  29. int pos = 2;
  30. foreach (Student s in students)
  31. {
  32. sheet.Cells[pos, 1].Value = s.Name;
  33. sheet.Cells[pos, 2].Value = s.Age;
  34. sheet.Cells[pos, 3].Value = s.Gender;
  35. sheet.Cells[pos, 4].Value = s.EnglishScore;
  36. sheet.Cells[pos, 5].Value = s.MathScore;
  37. sheet.Cells[pos, 6].FormulaR1C1 = "AVERAGE(RC[-1], RC[-2])";
  38. if (s.MathScore > 90 && s.EnglishScore > 90)
  39. {
  40. using (ExcelRange range = sheet.Cells[pos, 1, pos, 6])
  41. {
  42. range.Style.Font.Color.SetColor(Color.Blue);
  43. }
  44. }
  45. else if (s.MathScore < 80 && s.EnglishScore < 80)
  46. {
  47. using (ExcelRange range = sheet.Cells[pos, 1, pos, 6])
  48. {
  49. range.Style.Font.Color.SetColor(Color.Red);
  50. }
  51. }
  52. using (ExcelRange range = sheet.Cells[pos, 1, pos, 6])
  53. {
  54. range.Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
  55. range.Style.Border.Bottom.Color.SetColor(Color.Black);
  56. range.Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Left;
  57. }
  58. pos++;
  59. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/118542
推荐阅读
相关标签
  

闽ICP备14008679号