Excel的读取和写入
程序员文章站
2022-03-20 12:13:50
一、Excel理论知识 最新版NPOI2.4.1链接:https://pan.baidu.com/s/1iTgJi2hGsRQHyw2S_4dIUw 提取码:adnq • 整个Excel表格叫做工作簿:WorkBook • 工作簿由以下几部分组成 a.页(Sheet); b.行(Row); c.单元 ......
一、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
1 描述工作簿的类:iworkbook(接口)、hssfworkbook(具体实现类) 2 3 描述工作表的类:isheet(接口)、hssfsheet(具体实现类)
三、npoi导出
方式一(默认导出位置)
1 private void button1_click(object sender, eventargs e) 2 { 3 list<person> list = new list<person>() { 4 new person(){name="张三",age="15",email="123@qq.com" }, 5 new person(){name="李四",age="16",email="456@qq.com" }, 6 new person(){name="王五",age="17",email="789@qq.com" } 7 }; 8 // 引用命名空间 9 // using npoi.hssf.usermodel; 10 // using npoi.ss.usermodel; 11 // using system.io; 12 //将list集合中的内容导出到excel中 13 //1、创建工作簿对象 14 iworkbook wkbook = new hssfworkbook(); 15 //2、在该工作簿中创建工作表对象 16 isheet sheet = wkbook.createsheet("人员信息"); //excel工作表的名称 17 //2.1向工作表中插入行与单元格 18 for (int i = 0; i < list.count; i++) 19 { 20 //在sheet中插入创建一行 21 irow row = sheet.createrow(i); 22 //在该行中创建单元格 23 //方式一 24 //icell cell = row.createcell(0); 25 //cell.setcellvalue(list[i].name); 26 //方式二 27 row.createcell(0).setcellvalue(list[i].name); //给单元格设置值:第一个参数(第几个单元格);第二个参数(给当前单元格赋值) 28 row.createcell(1).setcellvalue(list[i].age); 29 row.createcell(2).setcellvalue(list[i].email); 30 } 31 //3、写入,把内存中的workbook对象写入到磁盘上 32 filestream fswrite = file.openwrite("person.xls"); //导出时excel的文件名 33 wkbook.write(fswrite); 34 messagebox.show("写入成功!", "提示"); 35 fswrite.close(); //关闭文件流 36 wkbook.close(); //关闭工作簿 37 fswrite.dispose(); //释放文件流 38 39 }
1 using system; 2 using system.collections.generic; 3 using system.linq; 4 using system.text; 5 using system.threading.tasks; 6 7 namespace _01npoi的写入 8 { 9 public class person 10 { 11 public string name { get; set; } 12 public string age { get; set; } 13 public string email { get; set; } 14 } 15 }
方式二(更友好的一种方式,用户可以指定导出位置)推荐
1 private void button3_click(object sender, eventargs e) 2 { 3 list<person> list = new list<person>() { 4 new person(){name="张三",age="15",email="123@qq.com" }, 5 new person(){name="李四",age="16",email="456@qq.com" }, 6 new person(){name="王五",age="17",email="789@qq.com" } 7 }; 8 //创建文件 9 string filename = "人员信息表"; 10 string savefilepath = ""; //导出时文件的路径 11 savefiledialog savedialog = new savefiledialog(); 12 savedialog.defaultext = "xls"; //默认文件扩展名 13 savedialog.filter = "excel文件|*.xls"; //文件名筛选字符串 14 savedialog.filename = filename; //导出文件名称 15 savedialog.showdialog(); //显示窗口 16 savefilepath = savedialog.filename; //文件路径 17 // 引用命名空间 18 // using npoi.hssf.usermodel; 19 // using npoi.ss.usermodel; 20 // using system.io; 21 //将list集合中的内容导出到excel中 22 //1、创建工作簿对象 23 iworkbook wkbook = new hssfworkbook(); 24 //2、在该工作簿中创建工作表对象 25 isheet sheet = wkbook.createsheet("人员信息"); //excel工作表的名称 26 //2.1向工作表中插入行与单元格 27 for (int i = 0; i < list.count; i++) 28 { 29 //在sheet中插入创建一行 30 irow row = sheet.createrow(i); 31 //在该行中创建单元格 32 //方式一 33 //icell cell = row.createcell(0); 34 //cell.setcellvalue(list[i].name); 35 //方式二 36 row.createcell(0).setcellvalue(list[i].name); //给单元格设置值:第一个参数(第几个单元格);第二个参数(给当前单元格赋值) 37 row.createcell(1).setcellvalue(list[i].age); 38 row.createcell(2).setcellvalue(list[i].email); 39 } 40 //3、写入,把内存中的workbook对象写入到磁盘上 41 filestream fswrite = new filestream(savefilepath,filemode.create); 42 wkbook.write(fswrite); 43 messagebox.show("写入成功!", "提示"); 44 fswrite.close(); //关闭文件流 45 wkbook.close(); //关闭工作簿 46 fswrite.dispose(); //释放文件流 47 }
1 using system; 2 using system.collections.generic; 3 using system.linq; 4 using system.text; 5 using system.threading.tasks; 6 7 namespace _01npoi的写入 8 { 9 public class person 10 { 11 public string name { get; set; } 12 public string age { get; set; } 13 public string email { get; set; } 14 } 15 }
方式三、导出datagridview数据
1 public static void exportexcel(string filename, datagridview dgv) 2 { 3 string savefilename = ""; 4 savefiledialog savedialog = new savefiledialog(); 5 savedialog.defaultext = "xls"; 6 savedialog.filter = "excel文件|*.xls"; 7 savedialog.filename = filename; 8 savedialog.showdialog(); 9 savefilename = savedialog.filename; 10 11 hssfworkbook workbook = new hssfworkbook(); 12 memorystream ms = new memorystream(); 13 14 npoi.ss.usermodel.isheet sheet = workbook.createsheet("sheet1"); 15 16 int rowcount = dgv.rows.count+1; 17 int colcount = dgv.columns.count; 18 int r1; 19 npoi.ss.usermodel.irow datarow1 = sheet.createrow(0); 20 21 for (int i = 0; i < rowcount; i++) 22 { 23 npoi.ss.usermodel.irow datarow = sheet.createrow(i); 24 for (int j = 1; j < colcount; j++) 25 { 26 if (i == 0) 27 { 28 r1 = i; 29 } 30 else 31 { 32 r1 = i - 1; 33 } 34 if (dgv.columns[j].visible && dgv.rows[r1].cells[j].value != null) 35 { 36 npoi.ss.usermodel.icell cell = datarow.createcell(j-1); 37 if (i == 0) 38 { 39 cell.setcellvalue(dgv.columns[j].headercell.value.tostring()); 40 continue; 41 } 42 cell.setcellvalue(dgv.rows[r1].cells[j].formattedvalue.tostring()); 43 } 44 else 45 { 46 npoi.ss.usermodel.icell cell = datarow.createcell(j-1); 47 cell.setcellvalue(""); 48 } 49 } 50 } 51 52 workbook.write(ms); 53 filestream file = new filestream(savefilename, filemode.create); 54 workbook.write(file); 55 file.close(); 56 workbook = null; 57 ms.close(); 58 ms.dispose(); 59 }
四、npoi读取excel内容
1 private void button2_click(object sender, eventargs e) 2 { 3 //需要读取的文件:人员表.xls 4 // 创建文件 5 openfiledialog ofd = new openfiledialog(); 6 ofd.filter = "excel文件|*.xls"; 7 ofd.showdialog(); 8 string filepath = ofd.filename; 9 filestream fsread=null; 10 iworkbook wkbook = null; 11 if (filepath != "") 12 { 13 //1、创建一个工作簿workbook对象 14 fsread = new filestream(filepath, filemode.open); 15 //将人员表.xls中的内容读取到fsread中 16 wkbook = new hssfworkbook(fsread); 17 //2、遍历wkbook中的每个工作表sheet 18 for (int i = 0; i < wkbook.numberofsheets; i++) 19 { 20 //获取每个工作表对象 21 isheet sheet = wkbook.getsheetat(i); 22 //获取每个工作表的行 23 //foreach遍历 sheet.getenumerator 24 for (int r = 0; r < sheet.lastrownum; r++) 25 { 26 //获取工作表中的每一行 27 irow currentrow = sheet.getrow(r); 28 //遍历当前行中的每个单元格 29 for (int c = 0; c < currentrow.lastcellnum; c++) 30 { 31 try 32 { 33 //获取每个单元格 34 icell cell = currentrow.getcell(c); 35 if (cell == null) //如果单元格为空时,程序会报错,这里判断提示用户,用try catch防止程序蹦 36 { 37 messagebox.show(string.format("第{0}行,第{1}列单元格为空!",r,c)); 38 } 39 celltype ctype = cell.celltype; // 获取单元格中的类型 40 messagebox.show(ctype.tostring()); 41 //判断当前单元格的数据类型,可以拓展 42 switch (ctype) 43 { 44 case celltype.numeric: //数字 45 messagebox.show("我是数字"); 46 break; 47 case celltype.string: //字符串 48 messagebox.show("我是字符串"); 49 break; 50 case celltype.boolean: 51 messagebox.show("我是布尔值"); 52 break; 53 } 54 //获取单元格的值 55 //日期 56 datetime date = cell.datecellvalue; 57 //数字 58 double num = cell.numericcellvalue; 59 //字符串 60 string str = cell.stringcellvalue; 61 //布尔值 62 bool bl = cell.booleancellvalue; 63 } 64 catch (exception ex) 65 { 66 67 } 68 69 } 70 } 71 } 72 } 73 else 74 { 75 messagebox.show("选择文件失败!","提示"); 76 } 77 fsread.close(); 78 wkbook.close(); 79 fsread.dispose(); 80 81 }
项目链接:https://pan.baidu.com/s/1kq2iycr8woj8lzkmjla_ma 提取码:4ks9
有不懂的同学,欢迎下方留言~~~
上一篇: 我喜欢坦诚的女人
下一篇: 使用php解析实现二级域名重定向
推荐阅读