之所以使用EPPlus操作Excel是因为微软自带的运行效率太低,数据多后会特别慢,不能满足现场要求。如果想速度快,而且只是读取Excel的配置还有另一个办法就是将Excel保存成xml文件,参考我的另一个文章:C# 读取XML格式的Excel文件
百度搜常见的有ERRlus和NPOI,NPOI支持多一点性能差一点
1、下载依赖。在引用》管理NuGet中输入》EPPlus
安装如下第一个搜索结果
2、示例代码
using OfficeOpenXml;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Study_CSharp
{
class MyExcelByEPPlus
{
public void Test()
{
Stopwatch watch = new Stopwatch();
watch.Start();
string path = Directory.GetCurrentDirectory() + @"\" + @"file.xlsx";
FileInfo file = new FileInfo(path);
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
using (var package = new ExcelPackage(file))
{
string sheetName = "hello";
var sheet = package.Workbook.Worksheets.Where(x => x.Name == sheetName).FirstOrDefault();
if (sheet == null)
{
sheet = package.Workbook.Worksheets.Add(sheetName);
}
sheet.Cells[1, 2].Value = "lalala"; // 第一行、第二列
//sheet.SetValue(1, 2, "EPPlus value");
sheet.InsertRow(3, 4);
package.Save();
}
watch.Stop();
Console.WriteLine($"Time is {watch.ElapsedMilliseconds} ms");
Console.ReadLine();
}
}
}
运行报错处理
1、错误:OfficeOpenXml.LicenseException:“Please set the ExcelPackage.LicenseContext
ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // 添加这行代码后不会报ExcelPackage错误
using (var p = new ExcelPackage()){}
2、错误:System.InvalidOperationException:“序列不包含任何元素”
// 会报错的函数是这样的
var sheet = package.Workbook.Worksheets.Where(x => x.Name == "hello").First();
// 原因是因为使用First的时候至少必须有一条数据,使用Single查询的时候查询结果必须有且只有一条数据,如果没有查到任何数据就会报上面异常。
// 解决办法:使用FirstOrDefault和SingleOrDefault,如果没有数据的话,返回对应类型的默认值.
var sheet = package.Workbook.Worksheets.Where(x => x.Name == "hello").FirstOrDefault();
3、sheet.SetValue(1, 1, "EPPlus value");报错:System.NullReferenceException:“未将对象引用设置到对象的实例。”
是因为上面的返回的sheet还是空,需要在上面加判断如果为空则添加sheet