一、Excel理论知识
最新版NPOI2.4.1链接:https://pan.baidu.com/s/1iTgJi2hGsRQHyw2S_4dIUw 提取码:adnq
整个Excel表格叫做工作簿:WorkBook
工作簿由以下几部分组成
a.页(Sheet);
b.行(Row);
c.单元格(Cell);
二、处理Excel的技术
OLE Automation:程序启动一个Excel进程,然后和Excel进程进行通讯来运行Excel的操作。
优点:强大,Excel能实现的功能,都可以实现
缺点:必须装Excel
把Excel当成数据库,使用Microsoft.Jet.OleDb访问Excel,只适合二维结构,功能少,不用装Excel
OpenXML,微软提供的读写Excel的技术,只能处理xlsx格式文件
NPOI、MyXls,能够分析Excel文件的格式,能够进行常用Excel操作,不依赖于Excel,节省资源,没有安全性和性能的问题。只能处理xls格式文件、不能处理xlsx这样的新版本Excel文件格式。处理xlsx用OpenXML
- 描述工作簿的类:IWorkbook(接口)、HSSFWorkbook(具体实现类)
-
- 描述工作表的类:ISheet(接口)、HSSFSheet(具体实现类)
三、NPOI导出
方式一(默认导出位置)
- private void button1_Click(object sender, EventArgs e)
- {
- List<Person> list = new List<Person>() {
- new Person(){Name="张三",Age="15",Email="123@qq.com" },
- new Person(){Name="李四",Age="16",Email="456@qq.com" },
- new Person(){Name="王五",Age="17",Email="789@qq.com" }
- };
- // 引用命名空间
- // using NPOI.HSSF.UserModel;
- // using NPOI.SS.UserModel;
- // using System.IO;
- //将List集合中的内容导出到Excel中
- //1、创建工作簿对象
- IWorkbook wkBook = new HSSFWorkbook();
- //2、在该工作簿中创建工作表对象
- ISheet sheet = wkBook.CreateSheet("人员信息"); //Excel工作表的名称
- //2.1向工作表中插入行与单元格
- for (int i = 0; i < list.Count; i++)
- {
- //在Sheet中插入创建一行
- IRow row = sheet.CreateRow(i);
- //在该行中创建单元格
- //方式一
- //ICell cell = row.CreateCell(0);
- //cell.SetCellValue(list[i].Name);
- //方式二
- row.CreateCell(0).SetCellValue(list[i].Name); //给单元格设置值:第一个参数(第几个单元格);第二个参数(给当前单元格赋值)
- row.CreateCell(1).SetCellValue(list[i].Age);
- row.CreateCell(2).SetCellValue(list[i].Email);
- }
- //3、写入,把内存中的workBook对象写入到磁盘上
- FileStream fsWrite = File.OpenWrite("Person.xls"); //导出时Excel的文件名
- wkBook.Write(fsWrite);
- MessageBox.Show("写入成功!", "提示");
- fsWrite.Close(); //关闭文件流
- wkBook.Close(); //关闭工作簿
- fsWrite.Dispose(); //释放文件流
- }
Person类:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace _01NPOI的写入
- {
- public class Person
- {
- public string Name { get; set; }
- public string Age { get; set; }
- public string Email { get; set; }
- }
- }
方式二(更友好的一种方式,用户可以指定导出位置)推荐
- private void button3_Click(object sender, EventArgs e)
- {
- List<Person> list = new List<Person>() {
- new Person(){Name="张三",Age="15",Email="123@qq.com" },
- new Person(){Name="李四",Age="16",Email="456@qq.com" },
- new Person(){Name="王五",Age="17",Email="789@qq.com" }
- };
- //创建文件
- string fileName = "人员信息表";
- string saveFilePath = ""; //导出时文件的路径
- SaveFileDialog saveDialog = new SaveFileDialog();
- saveDialog.DefaultExt = "xls"; //默认文件扩展名
- saveDialog.Filter = "Excel文件|*.xls"; //文件名筛选字符串
- saveDialog.FileName = fileName; //导出文件名称
- saveDialog.ShowDialog(); //显示窗口
- saveFilePath = saveDialog.FileName; //文件路径
- // 引用命名空间
- // using NPOI.HSSF.UserModel;
- // using NPOI.SS.UserModel;
- // using System.IO;
- //将List集合中的内容导出到Excel中
- //1、创建工作簿对象
- IWorkbook wkBook = new HSSFWorkbook();
- //2、在该工作簿中创建工作表对象
- ISheet sheet = wkBook.CreateSheet("人员信息"); //Excel工作表的名称
- //2.1向工作表中插入行与单元格
- for (int i = 0; i < list.Count; i++)
- {
- //在Sheet中插入创建一行
- IRow row = sheet.CreateRow(i);
- //在该行中创建单元格
- //方式一
- //ICell cell = row.CreateCell(0);
- //cell.SetCellValue(list[i].Name);
- //方式二
- row.CreateCell(0).SetCellValue(list[i].Name); //给单元格设置值:第一个参数(第几个单元格);第二个参数(给当前单元格赋值)
- row.CreateCell(1).SetCellValue(list[i].Age);
- row.CreateCell(2).SetCellValue(list[i].Email);
- }
- //3、写入,把内存中的workBook对象写入到磁盘上
- FileStream fsWrite = new FileStream(saveFilePath,FileMode.Create);
- wkBook.Write(fsWrite);
- MessageBox.Show("写入成功!", "提示");
- fsWrite.Close(); //关闭文件流
- wkBook.Close(); //关闭工作簿
- fsWrite.Dispose(); //释放文件流
- }
Person类:
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace _01NPOI的写入
- {
- public class Person
- {
- public string Name { get; set; }
- public string Age { get; set; }
- public string Email { get; set; }
- }
- }
方式三、导出dataGridView数据
- public static void ExportExcel(string fileName, DataGridView dgv)
- {
- string saveFileName = "";
- SaveFileDialog saveDialog = new SaveFileDialog();
- saveDialog.DefaultExt = "xls";
- saveDialog.Filter = "Excel文件|*.xls";
- saveDialog.FileName = fileName;
- saveDialog.ShowDialog();
- saveFileName = saveDialog.FileName;
-
- HSSFWorkbook workbook = new HSSFWorkbook();
- MemoryStream ms = new MemoryStream();
-
- NPOI.SS.UserModel.ISheet sheet = workbook.CreateSheet("Sheet1");
-
- int rowCount = dgv.Rows.Count+1;
- int colCount = dgv.Columns.Count;
- int r1;
- NPOI.SS.UserModel.IRow dataRow1 = sheet.CreateRow(0);
-
- for (int i = 0; i < rowCount; i++)
- {
- NPOI.SS.UserModel.IRow dataRow = sheet.CreateRow(i);
- for (int j = 1; j < colCount; j++)
- {
- if (i == 0)
- {
- r1 = i;
- }
- else
- {
- r1 = i - 1;
- }
- if (dgv.Columns[j].Visible && dgv.Rows[r1].Cells[j].Value != null)
- {
- NPOI.SS.UserModel.ICell cell = dataRow.CreateCell(j-1);
- if (i == 0)
- {
- cell.SetCellValue(dgv.Columns[j].HeaderCell.Value.ToString());
- continue;
- }
- cell.SetCellValue(dgv.Rows[r1].Cells[j].FormattedValue.ToString());
- }
- else
- {
- NPOI.SS.UserModel.ICell cell = dataRow.CreateCell(j-1);
- cell.SetCellValue("");
- }
- }
- }
-
- workbook.Write(ms);
- FileStream file = new FileStream(saveFileName, FileMode.Create);
- workbook.Write(file);
- file.Close();
- workbook = null;
- ms.Close();
- ms.Dispose();
- }
DGV中数据导出Excel
四、NPOI读取Excel内容
- private void button2_Click(object sender, EventArgs e)
- {
- //需要读取的文件:人员表.xls
- // 创建文件
- OpenFileDialog ofd = new OpenFileDialog();
- ofd.Filter = "Excel文件|*.xls";
- ofd.ShowDialog();
- string filePath = ofd.FileName;
- FileStream fsRead=null;
- IWorkbook wkBook = null;
- if (filePath != "")
- {
- //1、创建一个工作簿workBook对象
- fsRead = new FileStream(filePath, FileMode.Open);
- //将人员表.xls中的内容读取到fsRead中
- wkBook = new HSSFWorkbook(fsRead);
- //2、遍历wkBook中的每个工作表Sheet
- for (int i = 0; i < wkBook.NumberOfSheets; i++)
- {
- //获取每个工作表对象
- ISheet sheet = wkBook.GetSheetAt(i);
- //获取每个工作表的行
- //foreach遍历 sheet.GetEnumerator
- for (int r = 0; r < sheet.LastRowNum; r++)
- {
- //获取工作表中的每一行
- IRow currentRow = sheet.GetRow(r);
- //遍历当前行中的每个单元格
- for (int c = 0; c < currentRow.LastCellNum; c++)
- {
- try
- {
- //获取每个单元格
- ICell cell = currentRow.GetCell(c);
- if (cell == null) //如果单元格为空时,程序会报错,这里判断提示用户,用try catch防止程序蹦
- {
- MessageBox.Show(string.Format("第{0}行,第{1}列单元格为空!",r,c));
- }
- CellType cType = cell.CellType; // 获取单元格中的类型
- MessageBox.Show(cType.ToString());
- //判断当前单元格的数据类型,可以拓展
- switch (cType)
- {
- case CellType.Numeric: //数字
- MessageBox.Show("我是数字");
- break;
- case CellType.String: //字符串
- MessageBox.Show("我是字符串");
- break;
- case CellType.Boolean:
- MessageBox.Show("我是布尔值");
- break;
- }
- //获取单元格的值
- //日期
- DateTime date = cell.DateCellValue;
- //数字
- double num = cell.NumericCellValue;
- //字符串
- string str = cell.StringCellValue;
- //布尔值
- bool bl = cell.BooleanCellValue;
- }
- catch (Exception EX)
- {
-
- }
-
- }
- }
- }
- }
- else
- {
- MessageBox.Show("选择文件失败!","提示");
- }
- fsRead.Close();
- wkBook.Close();
- fsRead.Dispose();
-
- }
项目链接:https://pan.baidu.com/s/150J59Z3XP2DroZDy9HYfFA 提取码:nkw1
最新版NPOI2.4.1链接:https://pan.baidu.com/s/1iTgJi2hGsRQHyw2S_4dIUw 提取码:adnq
原文链接:http://www.cnblogs.com/chenyanbin/p/10832614.html