zoukankan      html  css  js  c++  java
  • C#学习-处理Excel

    首先先了解下一个Excel文件的组成

    1.一个Excel包含多个工作表(Sheet)

    2.一个工作表(Sheet)包含多行(Row)

    3.一行(Row)包含多个单元格(Cell)

    如何判断一个单元格中的数据是数字类型,还是字符串类型?

    字符串在左边,数值类型在右边

    如果单元格式string类型,则用ToString()
    如果单元格时数字类型,则调用NumericCellValue,返回double
    如果单元格时公式类型,则调用CellFormula(),返回strng
    如果单元格时bool类型,则调用BooleanCellValue(),返回的是bool

    image

    image

    工具准备:

    两个程序集NOPI.dll和Ionic.Zip.dll

    对以上程序集的介绍

    描述工作簿的类型:IWorkbook(接口),HSSFWorkbook(具体实现类)

    描述工作表的类型:ISheet(接口),HSSFSheet(具体实现类)

    1.读取Excel中文件

    Student.xls文件如下

    image

    输出结果如下

    image

    代码

    private void ReadExcel( )
    {
        //1.将Excel读到文件流中
        using (FileStream fsRead=File.OpenRead("Student.xls"))
        {
            //2.根据文件流,创建一个工作簿对象(workbook)
            IWorkbook wk=new HSSFWorkbook(fsRead);
            //3.读取工作簿中的工作表
            for (int i = 0; i < wk.NumberOfSheets; i++)
            {
                //3.1根据索引,获取一个工作表
                ISheet sheet = wk.GetSheetAt(i);
                //3.2输出工作表的名称
                Console.WriteLine("====={0}=====",sheet.SheetName);
                //4.遍历工作表每一行的数据
                for (int r= 0; r <=sheet.LastRowNum; r++)
                {
                    //获取当前行
                    IRow row = sheet.GetRow(r);
                    //5.遍历一行中的每一个单元格,当这一行为空时,row会返回null
                    if (row!=null)
                    {
                        //遍历一行的每一个单元格
                        for (int c = 0; c < row.LastCellNum; c++)
                        {
                            //创建单元格对象
                            ICell cell = row.GetCell(c);
                            //如果单元格未使用,则为null
                            if (cell!=null)
                            {
                                Console.Write(cell.ToString()+"	");
                            }
                        }
                    }
                    Console.WriteLine();
                }
            }
        }
    }

    2.写入Excel

    private void WriteExcel( )
    {
        List<Person>listPersons=new List<Person>()
        {
            new Person(){Name="张三 1",Age=11,Gender=''},
            new Person(){Name="张三 2",Age=21,Gender=''},
            new Person(){Name="张三 3",Age=31,Gender=''},
            new Person(){Name="张三 4",Age=41,Gender=''}
        };
        //1.创建Workbook对象
        IWorkbook wk=new HSSFWorkbook();
        //2.创建工作表对象 
        ISheet sheet = wk.CreateSheet("Persons");
        //3.向工作表中添加行
        for (int i = 0; i <= listPersons.Count-1; i++)
        {
            IRow row = sheet.CreateRow(i);
            row.CreateCell(0).SetCellValue(listPersons[i].Name);
            row.CreateCell(1).SetCellValue(listPersons[i].Age);
            row.CreateCell(2).SetCellValue(listPersons[i].Gender.ToString());
        }
        using (FileStream writer=File.OpenWrite("Persons.xls"))
        {
            wk.Write(writer);
        }
        Console.WriteLine("ok");
    }

    查看Excel文件

    image

    3.表中数据读到Excel

    数据库中列的类型

    其中Age为int类型,而且为可空类型

    image

    image

    代码

    private void TableToExcel( )
    {
        //1.读取数据
        string strSql = "select * from Persons";
        using (SqlDataReader reader=SQLHelper.ExecuteReader(strSql,CommandType.Text))
        {
            if (reader.HasRows)
            {
                IWorkbook wk=new HSSFWorkbook();
                ISheet sheet = wk.CreateSheet("Person1");
                int rowIndex = 0;
                while (reader.Read())
                {
                    int id = reader.GetInt32(0);
                    string name = reader.GetString(1);
                    //数据库中Age为可空类型
                    int? age = reader.IsDBNull(2) ? null : (int?) reader.GetInt32(2);
                    string gender = reader.GetString(3);
    
                    IRow row = sheet.CreateRow(rowIndex);
                    rowIndex++;
    
                    //向行中创建单元格
                    row.CreateCell(0).SetCellValue(id);
                    row.CreateCell(1).SetCellValue(name);
                    //对于数据库中可空的类型
                    ICell cellAge = row.CreateCell(2);
                    if (age == null)
                    {
                        //设置单元格的数据类型为Blank,即空单元格
                        cellAge.SetCellType(CellType.BLANK);
                    }
                    else
                    {
                        cellAge.SetCellValue((int)age);
                    }
                    row.CreateCell(3).SetCellValue(gender);
                }
                using (FileStream write=File.OpenWrite("TablePersons.xls"))
                {
                    wk.Write(write);
                }
            }
        }
        Console.WriteLine("ok");
    }

    输出结果

    image

    4.Excel中数据读取到数据库中

    Excel中数据

    image

    代码运行后,数据库中数据

    image

    代码

    private void ExcelToTable( )
    {
        using (FileStream read=File.OpenRead("Persons.xls"))
        {
            //1.创建工作簿对象
            IWorkbook wk=new HSSFWorkbook(read);
           //2.读取第一张工作表
            ISheet sheet = wk.GetSheetAt(0);
            string strSql = "insert into Persons values(@Name,@Age,@Gender)";
            //遍历工作表中的每一行:从0开始
            for (int i = 0; i <= sheet.LastRowNum-1; i++)
            {
                //遍历每一行中的每一个单元格:从0开始
                //字符串类型
                IRow row = sheet.GetRow(i);
                string name = row.GetCell(0).StringCellValue;
                //可空类型
                ICell cellAge = row.GetCell(1);
                int? age = null;
                if (cellAge != null && cellAge.CellType != CellType.BLANK)
                {
                    age = Convert.ToInt32(cellAge.NumericCellValue);
                }
                //字符类型
                char[] genders = row.GetCell(2).StringCellValue.ToCharArray();
                char gender = genders[0];
                
                SqlParameter[] paras=new SqlParameter[]
                {
                    new SqlParameter("@Name",name), 
                    new SqlParameter("@Age",age==null?DBNull.Value:(object)age),
                    new SqlParameter("@Gender",gender),
                };
                SQLHelper.ExecuteNonquery(strSql, CommandType.Text, paras);
            }
        }
        Console.WriteLine("ok");
    }
    更多精彩内容请看:http://www.cnblogs.com/2star
  • 相关阅读:
    vue_源码 原理 剖析
    vue_vuex
    vue_VueRouter 路由_路由器管理n个路由_并向路由组件传递数据_新标签路由_编程式路由导航
    vue_mint-ui
    vue_ajax 请求
    vue_组件间通信:自定义事件、消息发布与订阅、槽
    vue_小项目_吃饭睡觉打豆豆
    vue-cli 脚手架 Command Line Interface
    程序员面试金典-面试题 04.03. 特定深度节点链表
    程序员面试金典-面试题 04.02. 最小高度树
  • 原文地址:https://www.cnblogs.com/kimisme/p/4364043.html
Copyright © 2011-2022 走看看