C#操作Excel数据库方法

在装有加密软件的电脑上,用其它软件打开Excel表格不修改数据,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、支持处理的文件格式包括xlsxlsxdocx.

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.DLLNPOI.XSSFExcel 2007(xlsx)格式读写库
NPOI.OOXML.DLLNPOI.XWPFWord 2007(docx)格式读写库
NPOI.OpenXml4Net.DLLNPOI.OpenXml4NetOpenXml底层zip包读写库
NPOI.OpenXmlFormats.DLLNPOI.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

 

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

        private void button2_Click(object sender, EventArgs e)
        {
            //创建一个集合
            List<Person> list = new List<Person>() { 
            new Person(){ Name="张楠", Age=18, Email="zhangnan@163.com"},
            new Person(){ Name="王鑫", Age=19, Email="wangxin@yahoo.com"},
            new Person(){ Name="刘翰", Age=17, Email="liuhan@sohu.com"}
            };

            //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<ordermsg> list = new List<ordermsg>();
        public List<ordermsg> list2 = new List<ordermsg>();
        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;}

    }
}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#中,将Excel数据导入到数据库可以通过以下步骤实现: 1. 首先,创建一个用于存储Excel数据的DataTable对象。可以使用第二个引用中的代码,通过选择Excel文件并将其数据加载到DataTable中。 2. 在保存到数据库之前,需要确保DataTable中有有效的数据。可以使用第一个引用中的代码,对DataTable进行验证。 3. 然后,使用一个循环遍历DataTable中的每一行数据,并将其插入到数据库表中。可以使用第三个引用中的方法,创建一个SQL语句将Excel数据逐行插入到数据库表中。 4. 最后,根据需要,在数据插入完成后显示相应的提示信息。 需要注意的是,在插入数据时,可以选择使用事务来确保数据的完整性和一致性。可以根据需求,选择在每查询一个对象就提交一次到数据库,或者每遍历一次就生成一条SQL语句,根据事务提交到数据库。 这样,通过以上步骤,可以将Excel中的数据成功导入到数据库中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [C#学习笔记---通过Excel导入数据库](https://blog.csdn.net/xhtom44301/article/details/128666198)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [C# Excel导入数据库](https://download.csdn.net/download/water17ball/2658931)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值