C#编程,使用EPPlus操作Excel文件的一种方法

1、EPPlus与NPOI的选择

1、在桌面程序中导入导出数据时会操作Excel文件,常用的第三方控件有NPOIEPPlus
2、相对于NPOI来说,EPPlus的API更加友好,导出数据的能力也比NPOI更强大点。但在操作Excel的功能上还是NPOI强一点(C#
NPOI导出Excel和EPPlus导出Excel比较
): 20列,NPOI能导出4万数据,导出5万数据时报内存溢出。EPPlus能导出20万以上数据,导出23万测试时内存溢出。

3、如果想导出比较复杂的Excel的话可以使用NPOI,但对于常规需求的话EPPlus基本满足了。

2、EPPlus的基本介绍

EPPlus是一个使用Open Office XML(xlsx)文件格式,能读写Excel 2007/2010,不支持2003版本的Excel。
文件的开源组件,在导出Excel的时候不需要电脑上安装office。官网地址:http://epplus.codeplex.com/
使用的话直接NuGet上获取对应的dll即可。

功能点

单元格范围 单元格样式边框,颜色,填充,字体,数字,对齐方式) 图表 图片 形状 注释 桌子 保护 加密 数据透视表 资料验证 条件格式 VBA公式计算

3、参考网址

简介
入门事例
常用属性
推荐:EPlus使用教程
简单属性
进阶用法

4、安装

nuget管理器安装

在这里插入图片描述
注意右侧.net版本要求
在这里插入图片描述

5、注意

EPPlus官方说明中指出,从第5版之后,开源协议有变化,商用的话需要License许可,个人开发可通过配置直接使用。
如果不进行配置直接使用最新版,则会报错。

5版本之前的源代码

5版本源代码

许可配置方法1:使用ExcelPackage类中的LicenseContext属性

ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
using(var package = new ExcelPackage(new FileInfo("MyWorkbook.xlsx")))
{
    
    
}

许可配置方法2:app.config

<appSettings>
    <!--The license context used-->
    <add key="EPPlus:ExcelPackage.LicenseContext" value="NonCommercial" />
</appSettings>

6、读取文件

					//这里的文件选择对话框需要引用windows.forms程序集
 					OpenFileDialog ofd = new OpenFileDialog();
                    ofd.Filter = "Excel文件(*.xls;*.xlsx)|*.xls;*.xlsx|所有文件|*.*";//文件类型
                    ofd.FilterIndex = 2;//默认选择上面类型中的第几个,从左到右,从1开始。
                    ofd.Title = "选择具体的文件";//对话框左上角标题
                    ofd.InitialDirectory = @"D:\";//默认打开的文件夹
                    ofd.Multiselect = false;//是否允许选中多个文件
                    ofd.ValidateNames = true;//验证用户输入是否是一个有效的Windows文件名。
                    ofd.CheckPathExists = true;//验证路径有效性。
                    ofd.CheckFileExists = true;//验证文件有效性。
                    ofd.ShowHelp = true;//出现一个帮助按钮,自定义帮助信息。
                    if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
    
    
                        FilePath  = ofd.FileName;
					   //得到文件路径后,可以直接使用路径,也可以使用文件流的方式
		               //FileStream fs = new FileStream(ofd.FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
		               //using (ExcelPackage package = new ExcelPackage(fs)
		                 
		                ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
		                using (ExcelPackage package = new ExcelPackage(new FileInfo(FilePath)))
		                {
    
    
		                	//whichsheet指sheet表序号,从0开始
		                    ExcelWorksheet sheet = package.Workbook.Worksheets[whichsheet];
		                    var rownum = sheet.Dimension.Rows;//总行
		                    var colnum = sheet.Dimension.Rows;//总列
		                   
		                    //int minColumnNum = sheet.Dimension.Start.Column;//工作区开始列
		                    //int maxColumnNum = sheet.Dimension.End.Column; //工作区结束列
		                    //int minRowNum = sheet.Dimension.Start.Row; //工作区开始行号
		                    //int maxRowNum = sheet.Dimension.End.Row; //工作区结束行号
							
							//strlist是临时定义的一个存放获取的单元格数值的列表
		                    strlist.Clear();
		                    for (int i = 1; i <= rownum; i++)
		                    {
    
    
		                        var contstr = sheet.Cells[$"A{i}"].Value;//A是指A列,这里对A列所有的行进行读值
		                        if (contstr == null)//单元格没数值是空值
		                        {
    
    
		                            strlist.Add(new GridValue(""));
		                            continue;
		                        }
		                        strlist.Add(new GridValue(sheet.Cells[$"A{i}"].Value.ToString()));
		                    }
		                }
                    }
                    

7、写文件

            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            using (ExcelPackage package = new ExcelPackage(new FileInfo(FilePath)))
            {
    
    
                ExcelWorksheet sheet = package.Workbook.Worksheets[0];
                var rownum = sheet.Dimension.Rows;
                var colnum = sheet.Dimension.Columns;
                for (int i = 1; i <= rownum; i++)
                {
    
    
                    sheet.Cells[$"A{i}"].Value = "要写入的数值";
                }
                sheet.Cells[rownum, colnum].AutoFitColumns(0);//尝试自动调整列的宽度,如果有合并单元格,则不起作用
                package.Save();
            }
            System.Windows.MessageBox.Show("保存成功。");

8、常用属性

1、文件属性,Properties属性可以对Office的一些属性进行设置

在这里插入图片描述

2、sheet属性

sheet.DefaultColWidth = 10; //默认列宽
sheet.DefaultRowHeight = 30; //默认行高
sheet.TabColor = Color.Blue; //Sheet Tab的颜色
sheet.Cells.Style.WrapText = true; //单元格文字自动换行
sheet.Cells.AutoFitColumns(0);//自动调整所有列的宽度
sheet.Cells[rownum, colnum].AutoFitColumns(0);//自动调整指定范围内所有列的宽度

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

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;

4、单元格范围ExcelRange类

//获取单元格范围的
public ExcelRange this[string Address] {
    
     get; }//Address是指"A1:C5"这种格式,如果没有字母,只是数字3:3表示整个第3行
public ExcelRange this[int Row, int Col] {
    
     get; }
public ExcelRange this[int FromRow, int FromCol, int ToRow, int ToCol] {
    
     get; }

//复制单元格:
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的行列进行对应,将值设置到其中,这些单元格没有样式和数字格式

5、公式

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

6、单元格

worksheet.Cells[1, 1].Value = "名称";//直接指定行列数进行赋值
worksheet.Cells["A1"].Value = "名称";//直接指定单元格进行赋值

猜你喜欢

转载自blog.csdn.net/qq_43307934/article/details/108549793