NPOI的使用与拼音检索

一:NPOI的使用

1)把Excel中的数据输出

2)将集合中的数据保存到Excel文档中

3)把数据库中的数据导出到Excel表格中

3)把Excel表格中的数据导入到数据库中。


使用NPOI对Excel表格进行操作:

NPOI能够分析Excel文件的格式,能够进行常规Excel操作,不依赖Excel,节省资源,没有安全性、性能问题,在asp.net中使用最合适,只能处理xls格式的文件。

工作簿(Workbook),工作表(Sheet),行(Row),单元格(Cell),Excel中每一个单元格都是有数据类型的,常见的就这四个类

关键是实现的步骤

using _49_ado.net复习;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _50_通过NPOI操作Excel表格
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        //添加外部dll方法的方法(自己在网上下载)
        /// <summary>
        /// 练习1:把集合中的数据导出Excel文件中
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            //创建集合并初始化
            List<Person> list = new List<Person>() {
                new Person() { Name="陈如水",Age=22,Email="25866226058@qq.com"},
                new Person() { Name="陈诗音",Age=23,Email="25226058@qq.com"},
                new Person() { Name="陈诗悦",Age=21,Email="1194320692@qq.com"},
            };

            //1)创建工作簿,因为是写入
            Workbook wkbook = new HSSFWorkbook();
            //2)在此工作簿中创建工作表
            Sheet st = wkbook.CreateSheet("list for person");
            //3)遍历单元格,进行导入
            //向该工作表中插入行与单元格
            for (int i = 0; i < list.Count; i++)
            {
                //在工作表中创建一行
                Row row = st.CreateRow(i);
                //在该行中创建单元格,并设置数据,创建三个单元格
                row.CreateCell(0).SetCellValue(list[i].Name);
                row.CreateCell(1).SetCellValue(list[i].Age);
                row.CreateCell(2).SetCellValue(list[i].Email);
            }
            //4)把内存中的workbook对象写入到磁盘上
            using (FileStream fStream = File.OpenWrite("person.xls"))
            {
                //通过文件流把工作簿写入到磁盘上
                wkbook.Write(fStream);
            }
            MessageBox.Show("写入成功!");
        }
        /// <summary>
        /// 练习2:把Excel文件中的数据遍历输出
        /// 调试----->窗口----->输出
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            using (FileStream fStream = File.OpenRead("person.xls"))
            {
                //创建一个Workbook对象,把哪个文件中的数据读取到工作簿中
                Workbook wkbook = new HSSFWorkbook(fStream);

                //获取工作簿的数量:NumberOfSheets
                for (int i = 0; i < wkbook.NumberOfSheets; i++)
                {
                    //获取工作表对象
                    Sheet sheet = wkbook.GetSheetAt(i);
                    //获取每个工作表中的所有行
                    for (int c = 0; c <= sheet.LastRowNum; c++)
                    {
                        //获取每一行
                        Row row = sheet.GetRow(c);
                        //获取行中的每一个单元格
                        for (int j = 0; j < row.LastCellNum; j++)
                        {
                            Cell cell = row.GetCell(j);
                            //把单元格中的值,以字符串的形式输出
                            string value = cell.ToString();
                            Console.Write("{0}    |    ", value);
                        }
                        //进行换行输出
                        Console.WriteLine();
                    }
                }
            }
        }

        /// <summary>
        /// 把数据库库表中的数据读取到Excel文件中
        /// 把Teacher表中的内容导入到Excel文件中
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            //通过ado.net读取数据
            string sql = "select *  from Teacher";
            //使用SqlDataReader进行数据的操作
            using (SqlDataReader reader = SqlHelper.ExecuteDataReader(sql, CommandType.Text))
            {
                //获取一个Reader对象
                if (reader.HasRows)
                {
                    //一边从数据库中读取数据,一边向Excel中写入数据
                    Workbook wkbook = new HSSFWorkbook();
                    //工作表的名字
                    Sheet sheet = wkbook.CreateSheet("TeacherCopy");
                    int index = 0;

                    while (reader.Read())
                    {
                        //每次从数据库中读取一行数据,就在工作表中创建一行然后进行写入
                        Row row = sheet.CreateRow(index);
                        index++;
                        int id = reader.GetInt32(0);
                        string name = reader.GetString(1);
                        bool gender = reader.GetBoolean(2);
                        int age = reader.GetInt32(3);
                        //查看某个列的值是否为空:IsDBNull();
                        string address = reader.IsDBNull(4) ? "null" : reader.GetString(4);
                        //在行中创建单元格
                        row.CreateCell(0).SetCellValue(id);
                        row.CreateCell(1).SetCellValue(name);
                        row.CreateCell(2).SetCellValue(gender);
                        row.CreateCell(3).SetCellValue(age);
                        row.CreateCell(4).SetCellValue(address);
                    }
                    //写入完毕后,把工作簿保存到磁盘上。
                    using (FileStream fStream = File.OpenWrite("Teacher.xls"))
                    {
                        wkbook.Write(fStream);
                    }
                    MessageBox.Show("导入数据成功");
                }
                else
                {
                    MessageBox.Show("没有读取到数据!");
                }
            }
        }
        /// <summary>
        /// 把Excel文件中的数据读取到数据库中
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button4_Click(object sender, EventArgs e)
        {
            //从Excel中读取数据
            using (FileStream fStream = File.OpenRead("Teacher.xls"))
            {
                //把这个Excel读取到内存中的工作簿文件中,里面是有工作表的
                Workbook wkbook = new HSSFWorkbook(fStream);
                //获取工作簿中的工作表,因为只有一张表,所以传递的数据为0
                Sheet sheet = wkbook.GetSheetAt(0);
                string insert_sql = "insert into Teacher1 values(@TeaName,@TeaGender,@TeaAge)";
                for (int i = 0; i <=sheet.LastRowNum; i++)
                {
                    //每次循环遍历的时候创建参数
                    SqlParameter[] pms = new SqlParameter[] {
                        new SqlParameter("@TeaName",SqlDbType.NVarChar,20),
                        new SqlParameter("@TeaGender",SqlDbType.NVarChar,50),
                        new SqlParameter("@TeaAge",SqlDbType.Int)
                    };

                    //读取每一行的数据
                    Row row = sheet.GetRow(i);
                    List<Cell> listCell = new List<Cell>();

                    for (int j = 1; j < row.LastCellNum-1; j++)
                    {
                        //遍历每一个单元格的数据
                        Cell cell = row.GetCell(j);
                        //把每一个单元格中的内容放到集合里面
                        listCell.Add(cell);
                    }


                    for (int c= 0; c < listCell.Count; c++)
                    {
                        pms[c].Value = listCell[c].ToString();
                    }
                    //每次插入一行数据
                    SqlHelper.ExecuteNoQuery(insert_sql,CommandType.Text, pms);
                }
            }
        }
    }
}

二:拼音检索

1)如何把汉字转化成拼音(如何获取一个汉字的拼音)?

2)如何简体中文转化成繁体中文?

3)为什么要使用拼音检索?

4)更新数据库中性名列的拼音

 

需要下载微软的国际化包:International_Pack_1.0.rar,获取其中的程序集文件ChineseConverter.dll

核心是ChineseChar类的使用,如何使用帮助文档?

 

把实现封装成一个方法

看帮助文档重点是看类的类型和其中的方法。

 

操作数据库时,先把Sql语句执行一遍,看看能不能得到自己想要的结果。

using _49_ado.net复习;
using Microsoft.International.Converters.PinYinConverter;
using Microsoft.International.Converters.TraditionalChineseToSimplifiedConverter;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _51_拼音检索
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 汉字转化成拼音
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        private void button1_Click(object sender, EventArgs e)
        {
            string input = tb1.Text.Trim();
            tb2.Text = GetPinYinFromString(input);
        }

        /// <summary>
        /// 简体中文转化成繁体中文
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            string input = tb1.Text.Trim();
            tb2.Text = GetIntronationalFromSimple(input);
        }

        /// <summary>
        /// 更新数据库Teacher中姓名列的拼音,便于检索
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, EventArgs e)
        {
            string query_sql = "select TeaId,TeaName from Teacher1";
            //参数是要执行的sql语句和命令类型
            using (SqlDataReader reader = SqlHelper.ExecuteDataReader(query_sql, CommandType.Text))
            {
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        int TeaId = reader.GetInt32(0);
                        string TeaName = reader.GetString(1);
                        //调用方法获取名称的拼音
                        string pinyin = GetPinYinFromString(TeaName);
                        //已经能够成功执行
                        UpdateSqlBy(TeaId, pinyin);
                    }
                }
            }
        }

        private void UpdateSqlBy(int teaId, string pinyin)
        {
            //执行更新操作,Sql语句中变量的声明
            string insert_sql = "update Teacher1 SET TeaPinYin=@py where TeaId=@TeaId";
            //创建参数数组
            SqlParameter[] pms = new SqlParameter[] {
                //每次更新一行数据,进行循环更新
                 new SqlParameter("@py",SqlDbType.NVarChar,20) { Value= pinyin },
                 new SqlParameter("@TeaId",SqlDbType.Int) { Value= teaId },
            };
            //使用SqlHelper执行更新操作
            SqlHelper.ExecuteNoQuery(insert_sql, CommandType.Text, pms);
        }

        private string GetPinYinFromString(string input)
        {
            //通过StringBuilder去拼接字符串
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < input.Length; i++)
            {
                ChineseChar cn = new ChineseChar(input[i]);
                //1)判断是否能够转化成拼音
                if (cn.PinyinCount > 0)
                {
                    //2)Pinyins的结果是集合,只取集合中的第一个拼音,因为可能是多音字
                    string py = cn.Pinyins[0];
                    //3)后面有音标,所以需要截取
                    sb.Append(py.Substring(0, py.Length - 1));
                }
            }
            return sb.ToString();
        }

        private string GetIntronationalFromSimple(string input)
        {
            //是枚举类型
            string result = ChineseConverter.Convert(input, ChineseConversionDirection.SimplifiedToTraditional);
            return result;
        }
    }
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值