赞
踩
1、在桌面程序中导入导出数据时会操作Excel文件,常用的第三方控件有NPOI与EPPlus。
2、相对于NPOI来说,EPPlus的API更加友好,导出数据的能力也比NPOI更强大点。但在操作Excel的功能上还是NPOI强一点(C#
NPOI导出Excel和EPPlus导出Excel比较): 20列,NPOI能导出4万数据,导出5万数据时报内存溢出。EPPlus能导出20万以上数据,导出23万测试时内存溢出。3、如果想导出比较复杂的Excel的话可以使用NPOI,但对于常规需求的话EPPlus基本满足了。
EPPlus是一个使用Open Office XML(xlsx)文件格式,能读写Excel 2007/2010,不支持2003版本的Excel。
文件的开源组件,在导出Excel的时候不需要电脑上安装office。官网地址:http://epplus.codeplex.com/
使用的话直接NuGet上获取对应的dll即可。
单元格范围 单元格样式边框,颜色,填充,字体,数字,对齐方式) 图表 图片 形状 注释 桌子 保护 加密 数据透视表 资料验证 条件格式 VBA公式计算
简介
入门事例
常用属性
推荐:EPlus使用教程
简单属性
进阶用法
注意右侧.net版本要求
EPPlus官方说明中指出,从第5版之后,开源协议有变化,商用的话需要License许可,个人开发可通过配置直接使用。
如果不进行配置直接使用最新版,则会报错。
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
using(var package = new ExcelPackage(new FileInfo("MyWorkbook.xlsx")))
{
}
<appSettings>
<!--The license context used-->
<add key="EPPlus:ExcelPackage.LicenseContext" value="NonCommercial" />
</appSettings>
//这里的文件选择对话框需要引用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()));
}
}
}
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("保存成功。");
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);//自动调整指定范围内所有列的宽度
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 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的行列进行对应,将值设置到其中,这些单元格没有样式和数字格式
sheet.Cells[1, 3].range.Formula = "AVERAGE(A1, B1)";
sheet.Cells[1, 3].FormulaR1C1 = "AVERAGE(RC[-2], RC[-1])";
//以上两个公式表达意思相同——对于第一行,C列的值等于A列和B列的平均值
worksheet.Cells[1, 1].Value = "名称";//直接指定行列数进行赋值
worksheet.Cells["A1"].Value = "名称";//直接指定单元格进行赋值
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。