一: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;
}
}
}