excel 基础

•整个excel 表格叫工作表:workbook;工作表包含的叫页:sheet;行:row;单元格:cell。
excel 中的电话号码问题,看起来像数字的字符串以半角单引号开头就没问题了。
•使用区域(usedrange):用excel 表的时候不一定是从最左上角的单元格开始用,为了减小文件尺寸,有使用区域的概念,excel 只存储使用区域。
程序处理excel 的技术
•ole automation:程序启动一个excel 进程,然后和excel 进程进行通讯来进行excel 的操作。优点:强大,能够使用excel 的所有功能,要求装excel ,微软最推荐这种用法,因为可以促进excel 的销量。会启动excel 进程,不适合于服务器(比如asp.net网站,安全性、效率)。参考资料http://www.makaidong.com/denylau/archive/2010/04/30/1725172.html 
–演示一下,引用excel .interop,代码在备注

applicationclass c = new applicationclass();            c.visible = false;            workbook wb = c.workbooks.add(xlwbatemplate.xlwbatworksheet);            //wb.saveas("c:/1.xls", null, null, null, null, xlsaveasaccessmode.xlnochange, xlsaveasaccessmode.xlnochange, null, null, null, null, null);
•(*)把excel 当成其他数据库 ,使用microsoft.jet.oledb访问访问excel ,参考资料 http://tieba.baidu.com/f?kz=331569890 只适合于完全二维结构,功能最弱,很少用。不用装excel 。
•(*) openxml,微软提供的读写excel 的技术,优点和npoi差不多,不过只能处理xlsx格式文件。docx、pptx
•npoi、myxls等,npoi能够分析excel 文件的格式,能够进行常用excel 操作,不依赖于excel ,节省资源,没有安全性、性能的问题,在asp.net中用最合适。只能处理xls格式文件、不能处理xlsx这样的新版本excel 文件格式。
 
                                                                                              npoi组件的引入
•我们平时调用的类是已经添加到引用的,如果想调用系统内置的没有添加引用的其他dll(*严格的说是在gac中的assembly)就要添加引用,在【.net】选项卡中选择,对于另外一些第三方dll(*严格说是assembly)则需要点击【浏览】选项卡选择对应的dll文件。
•将npoi包解压到硬盘中,然后在项目中添加引用,浏览,将解压目录下的dll全部添加进来
•(*)poi是apache的一个java开源项目,npoi是poi在.net下的移植版本,很多.net的移植版本开源项目都是在原来的java版本名称前加上n,比如nhibernate 、ndoc、nunit、nant。
                                                                                                 npoi起步

1、读取

using (filestream stream = new filestream(@"c:\客户资料.xls", filemode.open, fileaccess.read))

{

hssfworkbook workbook = new hssfworkbook(stream);

messagebox.show(workbook.getsheetname(0));

}

2、遇到错误别慌,仔细看错误信息。可能遇到

此文来自: 马开东博客 转载请注明出处 网址:http://www.makaidong.com

的问题:文件被其他进程占用。

3、npoi处理wps生成的xls有问题。

读取excel

 private void button1_click(object sender, eventargs e)        {            //using (filestream stream = new filestream(@"c:\book1.xls", filemode.open, fileaccess.read))            //{            //    hssfworkbook workbook = new hssfworkbook(stream);            //    messagebox.show(workbook.getsheetname(0));            //}

            //using (filestream stream = new filestream(@"c:\book1.xls", filemode.open, fileaccess.read))            //{            //    hssfworkbook workbook = new hssfworkbook(stream);            //    hssfsheet sheet = workbook.getsheetat(0);            //    hssfrow row = sheet.getrow(0);            //    hssfcell cell1 = row.getcell(1);            //    hssfcell cell0 = row.getcell(0);

            //    messagebox.show(cell1.numericcellvalue.tostring());            //    messagebox.show(cell0.stringcellvalue.tostring());            //}

            //using (filestream stream = new filestream(@"c:\book1.xls", filemode.open, fileaccess.read))            //{            //    hssfworkbook workbook = new hssfworkbook(stream);            //    hssfsheet sheet = workbook.getsheetat(0);            //    hssfrow row = sheet.getrow(0);            //    hssfcell cell1 = row.getcell(1);            //    if (cell1.celltype == hssfcell.cell_type_string)            //    {            //        messagebox.show("字符串");            //    }            //    else if (cell1.celltype == hssfcell.cell_type_numeric)            //    {            //        messagebox.show("数字");            //    }            //}

            using (filestream stream = new filestream(@"c:\book1.xls", filemode.open, fileaccess.read))            {                hssfworkbook workbook = new hssfworkbook(stream);                hssfsheet sheet = workbook.getsheetat(0);                for (int i = 0; i <= sheet.lastrownum; i++)                {                    hssfrow row = sheet.getrow(i);                    hssfcell cell0 = row.getcell(0);                    hssfcell cell1 = row.getcell(1);                    messagebox.show(string.format("{0}的年龄是:{1}",cell0.stringcellvalue,cell1.numericcellvalue));

                }                //messagebox.show(sheet.lastrownum.tostring());            }

        }
•读取字符串类型数据messagebox.show(sheet.getrow(3).getcell(4).stringcellvalue); 读取数字类型数据numericcellvalue。
•判断单元格数据类型:读取getcell(4).celltype,与hssfcell类中定义的常量比较即可。
•判断使用区域:结束行号:lastrownum

using system;using system.collections.generic;using system.componentmodel;using system.data;using system.drawing;using system.linq;using system.text;using system.windows.forms;using system.io;using npoi.hssf.usermodel;using callcenterclient.dal;using system.data.sqlclient;

namespace callcenterclient.customers{    public partial class formcustmgr : form    {        public formcustmgr()        {            initializecomponent();        }

        private void btnimportexcel _click(object sender, eventargs e)        {            //string filename = @"c:\khzl.xls";            string filename = txtfilename.text;//界面上敲的是什么就是什么,没有转义,转义是给编译器看的

            try            {                using (filestream stream = new filestream(filename, filemode.open, fileaccess.read))                {                    hssfworkbook workbook = new hssfworkbook(stream);                    hssfsheet sheet = workbook.getsheetat(0);                    for (int i = 1; i <= sheet.lastrownum; i++)//注意从第1行开始读,第一行是表头                    {                        hssfrow row = sheet.getrow(i);                        hssfcell cellname = row.getcell(0);                        hssfcell celltel = row.getcell(1);                        hssfcell cellbuydate = row.getcell(2);                        hssfcell cellcarno = row.getcell(3);                        hssfcell cellbrno = row.getcell(4);

                        //sqlhelper.executenonquery("insert into t_customers(id,name,telphone,buydate,carnum,bracketnum) values(newid(),@name,@telphone,@buydate,@carnum,@bracketnum)",                        //    new sqlparameter("name", cellname.stringcellvalue),                        //    new sqlparameter("telphone", celltel.stringcellvalue),                        //    new sqlparameter("buydate", cellbuydate.datecellvalue),                        //    new sqlparameter("carnum", cellcarno.stringcellvalue),                        //    new sqlparameter("bracketnum", cellbrno.stringcellvalue));//newid()写在sql语句综合 中,在c#看来就是普通字符串,把sql扔给sqlserver运行,sqlserver会识别这个函数

                        //sqlhelper.executenonquery("insert into t_customers(id,name,telphone,buydate,carnum,bracketnum) values(" + newid() + ",@name,@telphone,@buydate,@carnum,@bracketnum)");//错误,注意区别。

                        sqlhelper.executenonquery("insert into t_customers(id,name,telphone,buydate,carnum,bracketnum) values(newid(),@name,@telphone,@buydate,@carnum,@bracketnum)",                            new sqlparameter("name", cellname.stringcellvalue),//易错:别写成new sqlparameter("name", cellname)                            new sqlparameter("telphone", celltel.stringcellvalue),                            new sqlparameter("buydate", cellbuydate.datecellvalue),                            new sqlparameter("carnum", cellcarno.stringcellvalue),                            new sqlparameter("bracketnum", cellbrno.stringcellvalue));

                    }                }                messagebox.show("导入成功!");            }            catch (ioexception ex)//抓住ioexception类型的异常(文件正在被打开等异常)            {                messagebox.show(ex.message);            }        }

        private void btnimportexcel 2_click(object sender, eventargs e)        {            string filename = txtfilename.text;//界面上敲的是什么就是什么,没有转义,转义是给编译器看的

            try            {                using (filestream stream = new filestream(filename, filemode.open, fileaccess.read))                {                    hssfworkbook workbook = new hssfworkbook(stream);                    hssfsheet sheet = workbook.getsheetat(0);                    for (int i = 1; i <= sheet.lastrownum; i++)//注意从第1行开始读,第一行是表头                    {                        hssfrow row = sheet.getrow(i);                        hssfcell cellname = row.getcell(0);                        hssfcell celltel = row.getcell(1);                        hssfcell cellbuydate = row.getcell(2);                        hssfcell cellcarno = row.getcell(3);                        hssfcell cellbrno = row.getcell(4);

                        //正确写法                        int count = (int)sqlhelper.executescalar("select count(*) from t_customers where carnum=@carnum or bracketnum=@bracketnum", new sqlparameter("carnum", cellcarno.stringcellvalue),                            new sqlparameter("bracketnum", cellbrno.stringcellvalue));                        //是否其他数据库 中有这辆车                        if (count > 0)                        {                            continue;                        }                        datetime buydate;                        if (cellbuydate.celltype == hssfcell.cell_type_numeric)//日期类型                        {                            buydate = cellbuydate.datecellvalue;                        }                        else if (cellbuydate.celltype == hssfcell.cell_type_string)//2008年9月8号                        {                            string strbuydate = cellbuydate.stringcellvalue;                            strbuydate = strbuydate.replace("号", "日");                            buydate = convert.todatetime(strbuydate);                        }                        else                        {                            throw new exception("未知的购买日期单元格类型");                        }

                        sqlhelper.executenonquery("insert into t_customers(id,name,telphone,buydate,carnum,bracketnum) values(newid(),@name,@telphone,@buydate,@carnum,@bracketnum)",                            new sqlparameter("name", cellname.stringcellvalue),//易错:别写成new sqlparameter("name", cellname)                            new sqlparameter("telphone", celltel.stringcellvalue),                            new sqlparameter("buydate", buydate),                            new sqlparameter("carnum", cellcarno.stringcellvalue),                            new sqlparameter("bracketnum", cellbrno.stringcellvalue));

                        //错误写法:一个sqlparameter只能被一个command使用,只能添加一次                        //sqlparameter pcarnum = new sqlparameter("carnum", cellcarno.stringcellvalue);

                        //int count = (int)sqlhelper.executescalar("select count(*) from t_customers where carnum=@carnum or bracketnum=@bracketnum", pcarnum,                        //    new sqlparameter("bracketnum", cellbrno.stringcellvalue));                        ////是否其他数据库 中有这辆车                        //if (count > 0)                        //{                        //    continue;                        //}

                        //sqlhelper.executenonquery("insert into t_customers(id,name,telphone,buydate,carnum,bracketnum) values(newid(),@name,@telphone,@buydate,@carnum,@bracketnum)",                        //    new sqlparameter("name", cellname.stringcellvalue),//易错:别写成new sqlparameter("name", cellname)                        //    new sqlparameter("telphone", celltel.stringcellvalue),                        //    new sqlparameter("buydate", cellbuydate.datecellvalue),                        //    pcarnum,                        //    new sqlparameter("bracketnum", cellbrno.stringcellvalue));

                        //影响的行数指的是修改了(update、delete等)的数据的行数,而不是select结果集的行数                        //int count =sqlhelper.executenonquery("select * from t_customers where carnum=@carnum or bracketnum=@bracketnum",new sqlparameter("carnum",cellcarno.stringcellvalue),                        //    new sqlparameter("bracketnum", cellbrno.stringcellvalue));                        ////是否其他数据库 中有这辆车                        //if (count > 0)                        //{                        //    continue;                        //}

                        //sqlhelper.executenonquery("insert into t_customers(id,name,telphone,buydate,carnum,bracketnum) values(newid(),@name,@telphone,@buydate,@carnum,@bracketnum)",                        //    new sqlparameter("name", cellname.stringcellvalue),//易错:别写成new sqlparameter("name", cellname)                        //    new sqlparameter("telphone", celltel.stringcellvalue),                        //    new sqlparameter("buydate", cellbuydate.datecellvalue),                        //    new sqlparameter("carnum", cellcarno.stringcellvalue),                        //    new sqlparameter("bracketnum", cellbrno.stringcellvalue));

                    }                }                messagebox.show("导入成功!");            }            catch (ioexception ex)//抓住ioexception类型的异常(文件正在被打开等异常)            {                messagebox.show(ex.message);            }        }

        private void button1_click(object sender, eventargs e)        {           

            try            {                importexcel 3();                messagebox.show("导入成功!");            }            catch (ioexception ex)//抓住ioexception类型的异常(文件正在被打开等异常)            {                messagebox.show(ex.message);            }        }

        private void importexcel 3()        {            string filename = txtfilename.text;//界面上敲的是什么就是什么,没有转义,转义是给编译器看的            using (filestream stream = new filestream(filename, filemode.open, fileaccess.read))            {                hssfworkbook workbook = new hssfworkbook(stream);                hssfsheet sheet = workbook.getsheetat(0);                using (sqlconnection conn = new sqlconnection(sqlhelper.connstr))                {                    conn.open();                    for (int i = 1; i <= sheet.lastrownum; i++)//注意从第1行开始读,第一行是表头                    {                        hssfrow row = sheet.getrow(i);                        hssfcell cellname = row.getcell(0);                        hssfcell celltel = row.getcell(1);                        hssfcell cellbuydate = row.getcell(2);                        hssfcell cellcarno = row.getcell(3);                        hssfcell cellbrno = row.getcell(4);

                        //正确写法                        int count = (int)sqlhelper.executescalar(conn,"select count(*) from t_customers where carnum=@carnum or bracketnum=@bracketnum", new sqlparameter("carnum", cellcarno.stringcellvalue),                            new sqlparameter("bracketnum", cellbrno.stringcellvalue));                        //是否其他数据库 中有这辆车                        if (count > 0)                        {                            continue;                        }                        datetime buydate;                        if (cellbuydate.celltype == hssfcell.cell_type_numeric)//日期类型                        {                            buydate = cellbuydate.datecellvalue;                        }                        else if (cellbuydate.celltype == hssfcell.cell_type_string)//2008年9月8号                        {                            string strbuydate = cellbuydate.stringcellvalue;                            strbuydate = strbuydate.replace("号", "日");                            buydate = convert.todatetime(strbuydate);                        }                        else                        {                            throw new exception("未知的购买日期单元格类型");                        }

                        sqlhelper.executenonquery(conn, "insert into t_customers(id,name,telphone,buydate,carnum,bracketnum) values(newid(),@name,@telphone,@buydate,@carnum,@bracketnum)",                            new sqlparameter("name", cellname.stringcellvalue),//易错:别写成new sqlparameter("name", cellname)                            new sqlparameter("telphone", celltel.stringcellvalue),                            new sqlparameter("buydate", buydate),                            new sqlparameter("carnum", cellcarno.stringcellvalue),                            new sqlparameter("bracketnum", cellbrno.stringcellvalue));

                    }                }

            }        }

        private void btnexporttoexcel 1_click(object sender, eventargs e)        {            if (savefiledlg.showdialog() != dialogresult.ok)            {                return;            }            hssfworkbook workbook = new hssfworkbook();            hssfsheet sheet = workbook.createsheet();            //姓名    电话    购买日期    车号    车架号            //别用dataset,因为数据量可能会非常大,如果用dataset会非常占内存。

            using (sqlconnection conn = new sqlconnection(sqlhelper.connstr))            {                conn.open();                using (sqlcommand cmd = conn.createcommand())                {                    cmd.commandtext = "select * from t_customers";                    using (sqldatareader reader = cmd.executereader())                    {   //todo:加表头。                        int rownum = 0;//行号                        while (reader.read())                        {                            string name = reader.getstring(reader.getordinal("name"));                            string telphone = reader.getstring(reader.getordinal("telphone"));                            datetime buydate = reader.getdatetime(reader.getordinal("buydate"));                            string carnum = reader.getstring(reader.getordinal("carnum"));                            string brnum = reader.getstring(reader.getordinal("bracketnum"));

                            hssfrow row = sheet.createrow(rownum);//创建第rownum行

                            row.createcell(0, hssfcell.cell_type_string).setcellvalue(name);                            row.createcell(1, hssfcell.cell_type_string).setcellvalue(telphone);                            row.createcell(2, hssfcell.cell_type_string).setcellvalue(buydate.toshortdatestring());                            row.createcell(3, hssfcell.cell_type_string).setcellvalue(carnum);                            row.createcell(4, hssfcell.cell_type_string).setcellvalue(brnum);                            rownum++;                        }                    }                }            }

            using (filestream stream = new filestream(savefiledlg.filename, filemode.openorcreate, fileaccess.readwr ite))            {                workbook.write(stream);            }            messagebox.show("保存成功!");

        }

        private void formcustmgr_load(object sender, eventargs e)        {            this.t_customerstableadapter1.fill(this.datasetcustomers1.t_customers);        }

        private void btnaddnew_click(object sender, eventargs e)        {            datarowview drv = bscustomers.addnew() as datarowview;            callcenterclient.dal.datasetcustomers.t_customersrow custrow = drv.row as callcenterclient.dal.datasetcustomers.t_customersrow;            custrow.id = guid.newguid();        }

        private void btnsave_click(object sender, eventargs e)        {            t_customerstableadapter1.update(this.datasetcustomers1.t_customers);        }    }} mmmm写入excel 
 hssfworkbook workbook = new hssfworkbook();            hssfsheet sheet = workbook.createsheet();            hssfrow row = sheet.createrow(0);            row.createcell(0, hssfcell.cell_type_string).setcellvalue("hello");            row.createcell(1, hssfcell.cell_type_numeric).setcellvalue(3.14);            using (filestream stream = new filestream(@"c:\1.xls", filemode.openorcreate, fileaccess.readwr ite))            {                workbook.write(stream);            }

 

搜索此文相关文章:C#变成数据导入Excel和导出Excel

 

此文链接:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E6%B1%87/38169.shtml

 

转载请注明出处:C#变成数据导入Excel和导出Excel - 博客园

C#变成数据导入Excel和导出Excel的更多相关文章

  1. ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据

    ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案   ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...

  2. .Net NPOI 根据excel模板导出excel、直接生成excel

    一.根据Excel模板导出excel 1.导入NPOI.dll  2.DAL中添加类ExportExcel.cs using NPOI.SS.UserModel; using System; usin ...

  3. [转]Excel.dll 导出Excel控制

    Excel.dll 导出Excel控制 2010-06-12 11:26 2932人阅读 评论(2) 收藏 举报 excelmicrosoftstring产品服务器google 最近做了个导出Exce ...

  4. 纳税服务系统【用户模块之使用POI导入excel、导出excel】

    前言 再次回到我们的用户模块上,我们发现还有两个功能没有完成: 对于将网页中的数据导入或导出到excel文件中,我们是完全没有学习过的.但是呢,在Java中操作excel是相对常用的,因此也有组件供我 ...

  5. [poi使用]使用excel模版导出excel

    ​ Apache POI是基于Office Open XML标准(OOXML)和Microsoft的OLE 2复合文档格式(OLE2)处理各种文件格式的开源项目.简而言之,您可以使用Java读写MS ...

  6. C#导出EXCEL(DataTable导出EXCEL)

    using System; using System.Collections.Generic; using System.Text; using System.Data; using System.I ...

  7. poi根据excel模板导出Excel

    /****单元格值对象**/public class Cells { /*** * 行 */ private int row; /** * 列 */ private int column; /** * ...

  8. 【Java excel】导出excel文件

    TestExprot package excel; import java.io.File; import java.io.IOException; import java.text.DateForm ...

  9. POI操作EXCEL之导出Excel(设置有效性,下拉列表引用)

    本人使用的是poi-bin-3.10-FINAL-20140208.zip 版本的poi以下是程序关键代码: //需要引用的类 import java.io.File; import java.io. ...

随机推荐

  1. FIO工具常用参数

    name 可能被用于覆盖作业的名称. filename fio 通常基于该作业名称,线程编号,构成一个文件名称和位置.如果您不想让线程之间的共享文件在一个作业或作业.指定文件名都以覆盖默认的. loc ...

  2. 为Photoshop添加右键快捷

    打开注册表,开始--->运行--->regedit 找到  HKEY_CLASSES_ROOT  <----> *<---->shell 新建项,使用Photosh ...

  3. uiautomator做自动化的过程

    UIautiomator官网地址:http://android.toolib.net/sdk/index.html 1.环境搭建 使用uiautomator需要导入jar包,uiautomator.j ...

  4. 在centos 64bit 系统中安装使用WPS office的方法

    1. 安装32位开发库: yum install xulrunner.i686 yum install libXtst.i686 2. 在官网下载 wps-office-8.1.0.3724-0.1. ...

  5. 面试之SQL

    1. 查询性能优化:从数据库查询数据时,你一定遇到过查询很慢的情况,请问你是怎么处理的. 答: 遇到的问题描述:是遇到过这种情况,我们给客户做过一款软件,日志库搜集了6000万条数据,显示.查询时候慢 ...

  6. MySQL 테이블 타입(Heap, MyIsam, InnoDB...) 변경하기

    alter table 을 이용해서 기존의 생성된 테이블의 타입(Heap, MyIsam, InnoDB...)을 변경하는 명령어 입니다. 잠시 까먹은 분은 계실지 몰라도 원래 모르는 ...

  7. 服务端缓存HttpRuntime.Cache的使用

    HttpRuntime.Cache.Insert("缓存key", "缓存content", null, DateTime.Now.AddMinutes(3), ...

  8. ASP长文章分页的两个方法,函数

    '按标识手动分页 function manualPage(str) pages=request.QueryString("page") contentstr=split(str,& ...

  9. C++多态性与C#的比较

        多态性:统一操作作用于不同的对象可以有不同的解释,产生不同的执行结果.多态性可以分为两种:一是编译时的多态性,一是运行时的多态性.     编译时的多态性包括重载.覆盖.运算符重载.对于非虚的 ...

  10. Windows8.1下PHP环境配置(PHP5.6、Apache2.4、MySql5.6)

    Step0 安装准备(均为64-bit版本) 下载php "Non Thread Safe"是IIS专用的,"Thread Safe"是Apache服务器用的. ...