zoukankan      html  css  js  c++  java
  • NPOI将MSSQL数据与EXCEL数据进行导入导出

    首先我们来讨论一下如何用ADO.NET处理Excel的技术

    一、OLEAutomation  

    优点:强大,能够使用Excel的所有功能,要求装Excel。微软力推的用法,毕竟是一家子嘛,但!它的运行会启动Excel进程,不适合于服务器运行(ASP.NET网站(B\S),安全性,效率方面不适合),参考资料http://topic.csdn.net/t/20031204/09/2525334.html

     

    演示引用Excel.Interop

    首页导入 office 的 12.0.0.0 版本的DLL(如果没有这个DLL,说明该系统的OFFICE版本不对)

    引入命名空间后

    missing = System.Reflection.Missing.Value;

                ApplicationClass app = new ApplicationClass();

                app.SheetsInNewWorkbook = 1;

     

                //指定生成Excel的过程是否“可见”(会打开一个Excel

                //false表示后台自动创建好了

                //true会打开一个Excel(可以看见的 )

                app.Visible = false;

                Workbook wb = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);

                Worksheet sheet = (Worksheet)wb.Sheets[1];

                sheet.get_Range("A1", "A1").Value2 = "hello,大家好!";

                wb.SaveAs(@"c:\1.xls", XlFileFormat.xlExcel9795, missing, missing, missing, missing, XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing);

                app.Quit();

                Console.WriteLine("ok");

                Console.ReadKey();

    object 

    //如果报“类型“Microsoft.Office.Interop.Excel.ApplicationClass”未定义构造函数    
    无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口。 ”的错误,则:

    Microsoft.Office.Interop.Excel的属性(嵌入互操作类型),改为false。 

     

    二、把Excel当成数据库,使用Microsoft.Jet.OleDb访问访问Excel ,参考资料 http://tieba.baidu.com/f?kz=331569890 只适合于完全二维结构,功能最弱,很少用。不用装Excel

     

    三、OpenXML,微软提供的读写Excel的技术,优点和NPOI差不多,不过只能处理xlsx格式文件。docxpptx。即Office 2007及以上版本。

     

    四、NPOIMyXls等,NPOI能够分析Excel文件的格式,能够进行常用Excel操作,不依赖于Excel,节省资源,没有安全性、性能的问题,在ASP.net中用最合适。只能处理xls格式文件、不能处理xlsx这样的新版本Excel文件格式。处理xlsx还要用OpenXML

    NPOI能提供Office 2003版本的导入导出,一般公司导入导出Excel 2003,也一般能够实现日常操作的一般功能,而且它学起来也比较简单。所以我今天主要是讲NPOI的使用。

     

    NPOI是由两个程序员(一位是中国人,一位是土耳其人)编写的,他们把JAVA版本的POI移置成了.NET版本就成了NPOI(详见博客园:博主:Tony Qu

     

    好了,现在开始我们的NPOIMSSQL数据与EXCEL数据进行导入导出

     

    1、到网上下载NPOIDLL文件

     

    2、添加DLL的引用

     

    3、引入命名空间

     

    4、好了,一切准备就续,开始把MSSQL数据导出到EXCEL 2003

     

     //数据导出

            private void button1_Click(object sender, EventArgs e)

            {

                //得到reader对象

                SqlDataReader reader = SqlHelper.ExecuteReader("select * from tblperson");

                    //判断是否有数据读出来

                if (reader.HasRows)

                {

                    //创建一个工作薄

                    using (Workbook wk = new HSSFWorkbook())

                    {

                        //创建一个工作表

                        using (Sheet sheet = wk.CreateSheet("name"))

                        {

                            //创建第一行,创建表头

                            Row row1 = sheet.CreateRow(0);

                            for (int i = 0; i < reader.FieldCount; i++)

                            {

                                //循环添加第一行数据

                                Cell cell = row1.CreateCell(i);

                                //添加表名到Cell的第一行的每个单元格中

                                cell.SetCellValue(reader.GetName(i));  //reader.GetName可以获得表名

                            }

                            //从索引为1的行开始添加数据库中的数据

                            int rowindex = 1;

                            while (reader.Read())

                            {

                                Row row = sheet.CreateRow(rowindex);

                                for (int i = 0; i < reader.FieldCount; i++)  //reader.FieldCount可以获得表的行数

                                {

                                    Cell cell = row.CreateCell(i);

                                    //一定要先getvaluetostring,如果得到的值为空的话,EXCEL中将是一个【空】,我把字换成一个“没有数据”

                                    if (reader.GetValue(i).ToString() == "")

                                    {

                                        cell.SetCellValue("没有数据");//考虑到表中可能有空的数据

                                    }

                                    else

                                    {

                                        cell.SetCellValue(reader.GetValue(i).ToString());//SetCellValue可以把数据填到每一个单元格中

                                    }

                                }

                                rowindex++;//这样就可以循环遍历每行了

                            }

                            //创建一个xls文档

                            using (FileStream fs = File.OpenWrite(@"e:\test.xls"))//创建一个EXCEL文件流

                            {

                                //将数据写到文件流中

                                wk.Write(fs);

                            }

                        }

     

                    }

                    MessageBox.Show("写入完毕");

                }

                else

                {

                    MessageBox.Show("表中没有数据");

                }

            }

     

    现在我们把Excel文件导入到数据库中,  反过来道理差不多,一些简单的就不再讲了

     

         private void button2_Click(object sender, EventArgs e)

            {

                //EXCEL文件读到文件流中

                using (FileStream fs = File.OpenRead(@"E:\老师的课堂资料\20120511JsDom\05_三层项目\1\客户资料new.xls"))

                {

                    using (Workbook wk = new HSSFWorkbook(fs))

                    {

                        using (Sheet sheet = wk.GetSheetAt(0))//读索引为0的工作表

                        {

                            string sql = "insert into t_customers(cc_customername,cc_cellphone,cc_landline,cc_carnum,cc_bracketnum,cc_buydate)values(@name,@phone,@line,@carnum,@bracketnum,@buydate)";

                            SqlParameter[] pms1 = new SqlParameter[]

                            {

                                //创建变量承载读出来的每个单元格的数据,有几个Cell就申明几个变量,注意,变量的数据类型要与数据库中的数据类型一致。

                                 new SqlParameter("@name",SqlDbType.VarChar),

                                 new SqlParameter("@phone",SqlDbType.VarChar),

                                 new SqlParameter("@line",SqlDbType.VarChar),

                                 new SqlParameter("@carnum",SqlDbType.VarChar),

                                 new SqlParameter("@bracketnum",SqlDbType.VarChar),

                                 new SqlParameter("@buydate",SqlDbType.DateTime)

                            };

                            //从索引为1的行读起

                            for (int i = 1; i < sheet.LastRowNum; i++)

                            {

                                Row row = sheet.GetRow(i);

                                for (int j = 0; j < row.LastCellNum; j++)

                                {

                                    if (row.GetCell(j) == null)//如果EXCEL表中有空的单元格就往表里有一个‘空’,如果没这个判断的话,会出现末将对象引用到实例的错误

                                    {

                                        pms1[j].Value = "";

                                    }

                                    else

                                    {

                                        pms1[j].Value = row.GetCell(j).ToString();

                                    }

                                }  

                              SqlHelper.ExecuteNonQuery(sql, pms1);//循环遍历每一行,加一行数据

     

                            }

                            //row end

                        }

                        //sheet end

                    }

                   //wk end

                }

                MessageBox.Show("数据导入成功");

                //fs end

            }

    注意:如果在SqlHelper中出现这个错误是因为我们在上面循环遍历每一行,到第二操作的时候SqlParameter就不能为command对象再加一个SqlParameter对象。

     

    那么我们就要把command对象里的parameter清空

       int r = cmd.ExecuteNonQuery();

        cmd.Parameters.Clear();

      return r;

     

    学习心得:在学习第三方DLL文件 的引入时,如果有API的话,我们可以看API文档,但当我们不知道实现该接口的类到底有哪些成员变量和方法,一般情况下,它的成员和方法都不会很多,我们可以通过想实现的动作用平时的方法来“猜出来”,也可以‘点’着猜。

     

     

     

  • 相关阅读:
    浅谈 js字符串 trim 方法之正则篇
    各大型网站使用的服务器空间运行环境盘点
    博客打开慢?请禁用WordPress默认的谷歌字体!
    巧妙设计:让页面活起来
    最流行的JavaScript库jQuery不再支持旧版IE
    Spring各个版本源码下载地址
    mysql 修改字符集
    Spring AOP aspectjweaver.jar与aopalliance-1.0.jar 下载地址
    <<Java | Java正则表达式 | 学习总结>>
    <Java并发编程实战 | 前言 | 学习总结>
  • 原文地址:https://www.cnblogs.com/inline/p/2498630.html
Copyright © 2011-2022 走看看