C#操作Excel数据库方法

NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。

NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。

使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写。 

优势

编辑

(一)传统操作Excel遇到的问题:

1、如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致服务器宕机。

2、Excel会把只包含数字的列进行类型转换,本来是文本型的,Excel会将其转成数值型的,比如编号000123会变成123。

3、导出时,如果字段内容以“-”或“=”开头,Excel会把它当成公式进行,会报错。

4、Excel会根据Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为该列为数值型,自动将该列转变成类似1.42702E+17格式,日期列变成包含日期和数字的。

(二)使用NPOI的优势

1、您可以完全免费使用该框架

2、包含了大部分EXCEL的特性(单元格样式、数据格式、公式等等)

3、专业的技术支持服务(24*7全天候) (非免费)

4、支持处理的文件格式包括xls, xlsx, docx.

5、采用面向接口的设计架构( 可以查看 NPOI.SS 的命名空间)

6、同时支持文件的导入和导出

7、基于.net 2.0 也支持xlsx 和 docx格式(当然也支持.net 4.0)

8、来自全世界大量成功且真实的测试Cases

9、大量的实例代码

11、你不需要在服务器上安装微软的Office,可以避免版权问题。

12、使用起来比Office PIAAPI更加方便,更人性化。

13、你不用去花大力气维护NPOINPOI Team会不断更新、改善NPOI,绝对省成本。

14、不仅仅对与Excel可以进行操作,对于doc、ppt文件也可以做对应的操作

NPOI之所以强大,并不是因为它支持导出Excel,而是因为它支持导入Excel,并能“理解”OLE2文档结构,这也是其他一些Excel读写库比较弱的方面。通常,读入并理解结构远比导出来得复杂,因为导入你必须假设一切情况都是可能的,而生成你只要保证满足你自己需求就可以了,如果把导入需求和生成需求比做两个集合,那么生成需求通常都是导入需求的子集,这一规律不仅体现在Excel读写库中,也体现在pdf读写库中,目前市面上大部分的pdf库仅支持生成,不支持导入。

构成

编辑

NPOI 1.2.x主要由POIFS、DDF、HPSF、HSSF、SS、Util六部分组成。

NPOI.POIFS

OLE2/ActiveX文档属性读写库

NPOI.DDF

Microsoft Office Drawing读写库

NPOI.HPSF

OLE2/ActiveX文档读写库

NPOI.HSSF

Microsoft Excel BIFF(Excel 97-2003)格式读写库

NPOI.SS

Excel公用接口及Excel公式计算引擎

NPOI.Util

基础类库,提供了很多实用功能,可用于其他读写文件格式项目的开发

表1 NPOI组成部分

NPOI 1.x的最新版为NPOI 1.2.5,其中包括了以下功能:

1、读写OLE2文档

2、读写DocummentSummaryInformationSummaryInformation

3、基于LittleEndian的字节读写

4、读写Excel BIFF格式

5、识别并读写Excel BIFF中的常见Record,如RowRecord, StyleRecord, ExtendedFormatRecord

6、支持设置单元格的高、宽、样式等

7、支持调用部分Excel内建函数,比如说sum, countif以及计算符号

8、支持在生成的XLS内嵌入打印设置,比如说横向/纵向打印、缩放、使用的纸张等。

NPOI 2.0主要由SS, HPSF, DDF, HSSF, XWPF, XSSF, OpenXml4Net, OpenXmlFormats组成,具体列表如下:

Assembly名称 模块/命名空间 说明
NPOI.DLL

NPOI.POIFS

OLE2/ActiveX文档属性读写库

NPOI.DLL

NPOI.DDF

微软Office Drawing读写库

NPOI.DLL

NPOI.HPSF

OLE2/ActiveX文档读写库

NPOI.DLL

NPOI.HSSF

微软Excel BIFF(Excel 97-2003, doc)格式读写库

NPOI.DLL

NPOI.SS

Excel公用接口及Excel公式计算引擎

NPOI.DLL

NPOI.Util

基础类库,提供了很多实用功能,可用于其他读写文件格式项目的开发

NPOI.OOXML.DLL NPOI.XSSF Excel 2007(xlsx)格式读写库
NPOI.OOXML.DLL NPOI.XWPF Word 2007(docx)格式读写库
NPOI.OpenXml4Net.DLL NPOI.OpenXml4Net OpenXml底层zip包读写库
NPOI.OpenXmlFormats.DLL NPOI.OpenXmlFormats 微软Office OpenXml对象关系库

项目近况:

编辑

在2013年10月8日,NPOI 2.0 beta 1发布,并已经支持Excel 2007和Word 2007。

系统要求:

VS2012/VS2010,基于.NET 4.0或者.NET 2.0
  VS2005/VS2008,基于.NET 2.0 (SP1) 
  VS2003,基于.NET 1.1 (仅更新到1.2.1版本,之后不再支持.NET 1.1)
  medium trust environment in ASP.NET

NPOI作为国人开发的开源项目,文档完善,更新及时,为.NET开发者提供了便利,主要用于生成Excel报表,搜索引擎模块中Excel中的文本提取,批量生成Excel文件,基于Excel文件模板生成新的Excel等多方面。

开发团队

编辑

Tony Qu(中国)

加入时间:2008年9月8日

huseyin

加入时间:2008年10月17日

atao.Xiang (中国)

加入时间:2009年10月12日

系统要求

编辑

VS2010 with .NET 4.0 runtime
  VS2005 or VS2008 with .NET 2.0 Runtime (SP1) 
  vs2003 with .NET 1.1

 

C#操作Excel数据库方法_第1张图片

 C#操作Excel数据库方法_第2张图片

C#操作Excel数据库方法_第3张图片

namespace 使用NPOI操作Excel
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //创建一个集合
            List list = new List() { 
            new Person(){ Name="张楠", Age=18, Email="[email protected]"},
            new Person(){ Name="王鑫", Age=19, Email="[email protected]"},
            new Person(){ Name="刘翰", Age=17, Email="[email protected]"}
            };

            //Excel导出数据的步骤
            //1.创建一个空的Workbook对象(工作簿)
            IWorkbook wk = new HSSFWorkbook();

            //2.创建一个工作表Sheet
            ISheet sheet = wk.CreateSheet("People");
            //3.创建sheet中的行
            //遍历list
            int rowIndex = 0;
            foreach (Person item in list)
            {
                //每遍历一条数据创建一行
                IRow row = sheet.CreateRow(rowIndex);
                //创建行中的单元格
                row.CreateCell(0).SetCellValue(item.Name);
                row.CreateCell(1).SetCellValue(item.Age);
                row.CreateCell(2).SetCellValue(item.Email);
                rowIndex++;
            }

            //4.把内存当中的workbook写入到磁盘中
            using (FileStream fsWrite = File.OpenWrite("People.xls"))
            {
                wk.Write(fsWrite);
            }
            MessageBox.Show("ok");

        }


        //读取Excels
        private void button1_Click(object sender, EventArgs e)
        {
            //1.创建一个workbook对象,该对象中包含了excel文件中的数据
            //1.1创建一个文件流
            using (FileStream fsRead = File.OpenRead("ReadExcel.xls"))
            {
                //1.2根据指定的文件流,创建一个workbook对象
                IWorkbook wk = new HSSFWorkbook(fsRead);
                //1.3获取该“工作簿”中的每个sheet(每个工作表)(循环)
                for (int i = 0; i < wk.NumberOfSheets; i++)
                {
                    //1.4获取每个工作表
                    ISheet sheet = wk.GetSheetAt(i);
                    Console.WriteLine("=============={0}==================", sheet.SheetName);
                    //1.5获取当前工作表中的每一行
                    for (int r = 0; r <= sheet.LastRowNum; r++)
                    {
                        //1.6获取每一行
                        IRow currentRow = sheet.GetRow(r);
                        if (currentRow != null)
                        {
                            //1.7获取当前行中的每个单元格
                            for (int c = 0; c < currentRow.LastCellNum; c++)
                            {
                                ////1.8获取每个单元格的值
                                //string val = currentRow.GetCell(c).ToString();
                                //Console.Write(val + "\t|");
                                ICell cell = currentRow.GetCell(c);
                                if (cell != null)
                                {
                                    // cell.ToString();//把每个单元格中的值都当做字符串来处理了。
                                    //cell.NumericCellValue
                                    //cell.StringCellValue
                                    //cell.BooleanCellValue
                                    switch (cell.CellType)
                                    {
                                        case CellType.BLANK:
                                            break;
                                        case CellType.BOOLEAN:
                                            break;
                                        case CellType.ERROR:
                                            break;
                                        case CellType.FORMULA:
                                            break;
                                        case CellType.NUMERIC:
                                            break;
                                        case CellType.STRING:
                                            break;
                                        case CellType.Unknown:
                                            break;
                                        default:
                                            break;
                                    }
                                }
                            }
                            Console.WriteLine();
                        }


                    }
                }

            }

        }
    }
    public class Person
    {
        public string Name
        {
            get;
            set;
        }
        public int Age
        {
            get;
            set;
        }
        public string Email
        {
            get;
            set;
        }

    }
}

利用NPOI从datagridview中导出数据到Excel(已验证)

利用NPOI从Excel中导出数据到datagridview(已验证)

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.SS.UserModel;
using NPOI.HSSF.UserModel;

namespace NPOIANDXML
{
    public partial class Form1 : Form
    {
        public List list = new List();
        public List list2 = new List();
        public Form1()
        {
            InitializeComponent();
        }

        private void btnReadExcel_Click(object sender, EventArgs e)
        {
            //1、创建一个workbook对象,该对象中包含了Excel文件中的数据
            //1.1 创建一个文件流
            using (FileStream fsRead = File.OpenRead("555.xls"))
            {
                //1.2根据指定的文件流,创建一个workbook对象
                IWorkbook wk = new HSSFWorkbook(fsRead);
                //1.3获取该"工作薄"中的每个sheet
                for (int i = 0; i < wk.NumberOfSheets; i++)
                {
                    //1.4获取每个工作表
                    ISheet sheet = wk.GetSheetAt(i);
                    //1.5获取当前工作表中的每一行
                    for (int r = 1; r < sheet.LastRowNum; r++)
                    {
                        ordermsg objordermsg = new ordermsg();
                        //获取表中每一行的数据
                        IRow currentRow = sheet.GetRow(r);      

                            if (currentRow != null)
                            {
                                objordermsg.ordernumber = currentRow.GetCell(0).ToString() ;
                                objordermsg.materialcode = currentRow.GetCell(1).ToString();
                                objordermsg.materialsname = currentRow.GetCell(2).ToString();
                                objordermsg.materiasquantity = currentRow.GetCell(3).ToString();
                                if (currentRow.GetCell(4) == null)
                                {
                                    objordermsg.barcode = "";
                                }
                                else
                                {
                                    objordermsg.barcode = currentRow.GetCell(4).ToString();
                                }
               
                                objordermsg.actualquantity = currentRow.GetCell(5).ToString();
                                objordermsg.barcodeconfirm = currentRow.GetCell(6).ToString();

                            }
                            list.Add(objordermsg);
                        }    
                    
                        
                }
            }
            this.dataGridView1.DataSource = list;
        }

        private void btnWriteExcel_Click(object sender, EventArgs e)
        {
            if (this.dataGridView1.Rows.Count == 0)
            {
                MessageBox.Show("datagridview中无数据");
            }
            //遍历datagridview中的数据保存到list集合中
            for (int i = 0; i < this.dataGridView1.Rows.Count; i++)
            {
                //for (int j = 0; j < dataGridView1.ColumnCount; j++)
                //{
                    ordermsg objordermsg = new ordermsg();
                    
                    objordermsg.ordernumber = this.dataGridView1.Rows[i].Cells[0].Value.ToString();
                    objordermsg.materialcode = this.dataGridView1.Rows[i].Cells[1].Value.ToString();
                    objordermsg.materialsname = this.dataGridView1.Rows[i].Cells[2].Value.ToString();
                    objordermsg.materiasquantity = this.dataGridView1.Rows[i].Cells[3].Value.ToString();
                    if (this.dataGridView1.Rows[i].Cells[4].Value==null)
                    {
                        objordermsg.barcode = "";
                    }
                    else
                    {
                        objordermsg.barcode = this.dataGridView1.Rows[i].Cells[4].Value.ToString();
                    }
                    
                    objordermsg.actualquantity = this.dataGridView1.Rows[i].Cells[5].Value.ToString();
                    objordermsg.barcodeconfirm = this.dataGridView1.Rows[i].Cells[6].Value.ToString();
                    list2.Add(objordermsg);
                //}
            }
            //Excel导出数据的步骤
            //1、创建一个空的Workbook对象(工作簿)
            IWorkbook wk = new HSSFWorkbook();
            //2、创建一个工作表sheet
            ISheet sheet = wk.CreateSheet("ToExcel");
            //3、创建sheet中的行
            int rowIndex = 0;
            foreach (ordermsg item in list2)
            {
                //每遍历一条数据创建一行
                IRow row = sheet.CreateRow(rowIndex); //创建行
                //创建行中的单元格
                row.CreateCell(0).SetCellValue(item.ordernumber);
                row.CreateCell(1).SetCellValue(item.materialcode);
                row.CreateCell(2).SetCellValue(item.materialsname);
                row.CreateCell(3).SetCellValue(item.materiasquantity);
                row.CreateCell(4).SetCellValue(item.barcode);
                row.CreateCell(5).SetCellValue(item.actualquantity);
                row.CreateCell(6).SetCellValue(item.barcodeconfirm);

                rowIndex++;
            }
            //4、把内存当中的workbook写入到磁盘中
            using (FileStream fsWrite = File.OpenWrite("ToExcel.xls"))
            {
                wk.Write(fsWrite);
            }
            MessageBox.Show("导出数据OK");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NPOIANDXML
{
    public class ordermsg
    {
        public string ordernumber {set;get;}
        public string materialcode { set; get;}
        public string materialsname { set; get;}
        public string materiasquantity { set; get;}
        public string barcode { set; get; }
        public string actualquantity { set; get;}
        public string barcodeconfirm { set; get;}

    }
}

 

你可能感兴趣的:(C#)