一.获取引用NPOI
VS2017,通过Nuget工具包下载NPOI到指定的项目中,如下
二.添加如下命名空间,其中HSSF是操作*.xls文件,XSSF操作*.xlsx文件.
using NPOI;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using NPOI.HSSF.UserModel;
三.关于NPOI关键类/接口:
工作表:IWorkbook,XSSFWorkbook(*.xlsx);HSSFWorkbook(*.xls)
工作表:ISheet,Sheet
行:IRow,
obj_sh.LastRowNum获取最后一行的index
obj_row.LastCellNum;获取当前行的列数
单元格:ICell
四,创建Excel,创建excel常规操作过程如下:
1.创建workbook对象
IWorkbook wbk = new XSSFWorkbook();
2.创建sheet到workbook中
ISheet mysheet = wbk.CreateSheet("mySheet");
3.在sheet对象中创建row
IRow myRow = mysheet.CreateRow(i);
4.在row中创建cell
ICell cell = myRow.CreateCell(i);
5.给cell赋值
cell.SetCellValue("单元格的值")
6.保存workbook对象的数据到电脑磁盘
using (FileStream fs_write = File.OpenWrite(path))
{
wbk.Write(fs_write);
}
或者如下方式也可以
using(FileStream fs_write = File.Open(path,FileMode.Create))
{
wbk.Write(fs_write);
}
//或如下,不用File.Open(...),直接new一个Filestream对象也可以
using (FileStream fs_write = new FileStream(path, FileMode.Create))
{
wbk.Write(fs_write);
}
//上面两种保存Excel方式,要注意FileMode必须是Create,如果是Open,Excel文件损坏打不开!!!
五.创建Excel文件Demo如下:
private void Form1_Load(object sender, EventArgs e){//声明工作本对象(XSSFWorkbook后缀名.xlsx;HSSFWorkbook后缀名.xls)IWorkbook wbk = new XSSFWorkbook();//创建一个sheetISheet mysheet = wbk.CreateSheet("mySheet");for (int i = 0; i < 3; i++){//创建行IRow myRow = mysheet.CreateRow(i);//创建单元格,写入值myRow.CreateCell(0).SetCellValue($"Row{i + 1}Col0");myRow.CreateCell(1).SetCellValue($"Row{i + 1}Col1");myRow.CreateCell(2).SetCellValue($"Row{i + 1}Col2");}int cellCnt = mysheet.GetRow(0).LastCellNum;//自动调整列宽for (int i = 0; i < cellCnt; i++){mysheet.AutoSizeColumn(i);}string path = @"D:\dwang\myWBK.xlsx";//将excel数据赋值给文件流,并excel文件的Write方法参数,保存wbk文件到本地磁盘//using (FileStream fs = File.OpenWrite(path))//{// wbk.Write(fs);//}//或如下,不用File.OpenWrite(Path),直接new一个Filestream对象也可以using (FileStream fs_write = new FileStream(path, FileMode.Create)){wbk.Write(fs_write);}//上面的保存Excel方式,要注意FileMode必须是Create,如果是Open,Excel文件损坏.}
六.读取Excel文件:
读取excel文件过程如下:
1.通过指定的excel文件路径,读取到文件流中
2.创建workbook对象,将excel文件流作为workbook的构造函数传给工作本对象
3.读取sheet,row,cell,获取指定的内容,常见操作如下
3.1. 获取工作簿对象
IWorkbook workbook = new XSSFWorkbook(fs); // 2007
// IWorkbook workbook = new HSSFWorkbook(fs); // 2003
3.2. 获取工作表对象(第一个表,序号从0开始)
ISheet sheet = workbook.GetSheetAt(0);
3.3. 获取工作表的行(第一行)
IRow row = sheet.GetRow(0);
3.4. 获取指定行的单元格
ICell cell = row.GetCell(0);
3.5. 获取单元格样式
ICellStyle cellStyle = cell.CellStyle;
3.6. 创建工作簿对象
XSSFWorkbook workBook= new XSSFWorkbook();
3.7. 创建工作表对象
XSSFSheet newSheet = (XSSFSheet)workBook.CreateSheet("new sheet");
3.8. 创建工作表的行
XSSFRow newRow = (XSSFRow)newSheet.CreateRow(0);
3.9. 创建单元格
XSSFCell newCell = (XSSFCell)newRow.CreateCell(0);
3.10. 单元格写值
newCell.SetCellValue(1);
3.11. 设置Sheet名称
workBook.SetSheetName(0, "第一张表");
3.12. 设置单元格内容
newCell.SetCellValue(11);
3.13. 得到工作簿中Sheet数量
workBook.NumberOfSheets
如下代码是读取Exel文件的常规操作:
private void Form1_Load(object sender, EventArgs e)
{string path = @"D:\dwang\mywbk.xlsx";if(!File.Exists(path)){MessageBox.Show("文件不存在,退出");return;}//读取excel,需要通过filestream读取excel,然后文件流对象作为参数传给workbook构造函数参数FileStream fs_read = File.OpenRead(path);//将文件流中的eexcel文件数据读取到workbook对象中IWorkbook wbk = new XSSFWorkbook(fs_read);//获取wbksheet数量int sheetCnt = wbk.NumberOfSheets;//激活第一个sheetwbk.SetActiveSheet(0);//获取sheet对象ISheet sh = wbk.GetSheetAt(0);//获取最后一行的行indexint rowCnt = sh.LastRowNum;List<string> lst = new List<string>();string cellContents = null;IRow currRow = null;for (int i = 0; i <= rowCnt; i++){//当前行赋值currRow = sh.GetRow(i);//获取当前行的单元格数量,注意,这个数字是列数,不是最后一个单元格索引int cellCnt = currRow.LastCellNum;for (int j = 0; j < cellCnt; j++){//获取当前行的每个单元格内容,并连接给字符串cellContents += $"{currRow.GetCell(j).ToString()},";}lst.Add(cellContents);cellContents = "";}foreach (var item in lst){MessageBox.Show(item);}//更新单元格值,并保存sh.GetRow(0).GetCell(0).SetCellValue("ASDFGH");sh.AutoSizeColumn(0);//关闭excel文件的读取流fs_read.Close();//wbk内容写入到新建的写入流,再到磁盘文件//保存到磁盘:workbook ->filestream -> 磁盘文件using (FileStream fs_write = File.OpenWrite(path)){wbk.Write(fs_write);}
}