C#使用NPOI库操作Excel文件
NPOI支持的文件格式处理xls、xlsx外,还包括doc、ppt、vsd等,本文介绍NPOI对Excel的基本操作。
xcel工作簿、工作表、xls、xlsx概念
Excel中工作簿、工作表、xls、xlsx的概念如下:
1. 每一个Excel文件都可以看做是一个工作簿,当打开一个Excel文件时,就等于打开了一个Excel工作簿。
2. 当打开了excel工作簿后在窗口底部看到的“Sheet”标签标示的是工作表,有几个标签就表示有几个工作表。
简单做一个类比,一个Excel文件即一个工作簿可以看做一本书,一个工作表即一个Sheet页面是书内的一页,可以 有很多页。Excel2003最多可以添加255个,Excel2007随意加。
3. xls是Office 2003以及之前版本Excel的扩展名,xlsx是Office 2007及之后版本Excel所用的扩展名。xlsx用新的基于 XML的压缩文件格式取代了之前的默认文件格式,在传统的文件名后面添加了字面x(即.docx取代.doc、.xlsx取 代.xls,等等),使其占用的空间更小。xlsx向下兼容xls。
1.首先添加NPOI类库的引用(也可手动添加引用):
2.在项目中添加引用:
using NPOI.SS.UserModel;
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
首先介绍如何新建Excel工作表:
HSSF使用于2007之前的xls版本,XSSF适用于2007及其之后的xlsx版本。
以下程序新建了一个Excel 2003 xls和一个2007 xlsx文件,每个Excel文件初始包含了2个工作表。
//------创建2003工作表
HSSFWorkbook workbook2003 = new HSSFWorkbook(); //新建xls工作簿
workbook2003.CreateSheet("Sheet1"); //新建3个Sheet工作表
workbook2003.CreateSheet("Sheet2");
workbook2003.CreateSheet("Sheet3");
FileStream file2003 = new FileStream(@"E:\Excel2003.xls", FileMode.Create);
workbook2003.Write(file2003);
file2003.Close(); //关闭文件流
workbook2003.Close();
//--------创建2007工作表
Console.WriteLine("开始创建工作簿");
XSSFWorkbook workbook2007 = new XSSFWorkbook(); //新建xlsx工作簿
workbook2007.CreateSheet("Sheet1");
workbook2007.CreateSheet("Sheet2");
workbook2007.CreateSheet("Sheet3");
FileStream file2007 = new FileStream(@"E:\Excel2007.xlsx", FileMode.Create);
workbook2007.Write(file2007);
file2007.Close();
workbook2007.Close();
Console.ReadKey();
以下介绍如何导出到Excel和导入到数据库:
/// <summary>
/// 写入Excel工作簿
/// </summary>
public static void inexcel()
{
Console.WriteLine("创建excel2003");
HSSFWorkbook workbook2003 = new HSSFWorkbook();//新建工作簿
Console.WriteLine("创建excel2003一个工作表");
workbook2003.CreateSheet("Sheet1"); //新建1个Sheet工作表
HSSFSheet SheetOne = (HSSFSheet)workbook2003.GetSheet("Sheet1"); //获取名称为Sheet1的工作表
//对工作表先添加行,下标从0开始
for (int i = 0; i <=Gettable().Rows.Count; i++)
{
//对每一行创建10个单元格
SheetOne.CreateRow(i); //创建10行
HSSFRow SheetRow = (HSSFRow)SheetOne.GetRow(i); //获取Sheet1工作表的首行
HSSFCell[] SheetCell = new HSSFCell[Gettable().Columns.Count];
for (int j = 0; j < Gettable().Columns.Count; j++)
{
SheetCell[j] = (HSSFCell)SheetRow.CreateCell(j);
if (i == 0)
{
SheetCell[j].SetCellValue(Gettable().Columns[j].ToString());
}
else
{
SheetCell[j].SetCellValue(Gettable().Rows[i-1][j].ToString());
}
}
}
FileStream file2003 = new FileStream(@"E:\Excel2003.xls", FileMode.Create);
workbook2003.Write(file2003);
file2003.Close();
workbook2003.Close();
Console.ReadLine();
}
/// <summary>
/// 获取数据库数据到DataTable
/// </summary>
/// <returns></returns>
public static DataTable Gettable()
{
string con = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
using (SqlConnection conn = new SqlConnection(con))
{
SqlDataAdapter adaperter = new SqlDataAdapter("select * from Users", conn);
DataTable dataTable = new DataTable();
adaperter.Fill(dataTable);
return dataTable;
}
}
/// <summary>
/// Excel导入到数据库
/// </summary>
public static void Insert()
{
using (FileStream fileReader = File.OpenRead(@"E:\\Excel2011.xls"))
{
//创建工作簿对象接收文件流(Excel信息)
IWorkbook workbook = new HSSFWorkbook(fileReader);
//工作簿共有几个表
//int count = workbook.NumberOfSheets;
//创建工作表读取工作簿表信息
//ISheet sheet= workbook.GetSheet("表名称");
ISheet sheet = workbook.GetSheetAt(0);
string sql = @" insert into Users1(UserId, UserName, UserPass, LogDayCount) values (@UserId, @UserName,@UserPass,@LogDayCount)";
int ii = 0;
//r = 1,剔除表头一行
for (int r = 1; r <=sheet.LastRowNum; r++)
{
//定义参数数组para
SqlParameter[] para = new SqlParameter[] {
new SqlParameter("UserId",SqlDbType.Int,32),
new SqlParameter("UserName",SqlDbType.NVarChar,200),
new SqlParameter("UserPass",SqlDbType.NVarChar,300),
new SqlParameter("LogDayCount",SqlDbType.Int,32),
};
//创建一行获取sheet行数据
// IRow row1 = sheet.GetRow(0);
IRow row = sheet.GetRow(r);
List<ICell> listcell = new List<ICell>();
//int c = 1 即不读取自动编号的Id列
for (int c = 0; c < row.LastCellNum; c++)
{
//将每行每个单元格的值添加带listcell集合中
listcell.Add(row.GetCell(c));
}
//循环赋值给para
for (int i = 0; i <listcell.Count; i++)
{
para[i].Value = listcell[i].ToString();
}
//执行添加Sql语句
string sqlcon = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
ii += SqlHelper.ExecuteNonQuery(sqlcon, CommandType.Text, sql, para);
}
if (ii > 0)
{
Console.WriteLine("已将Excel数据插入到数据库表");
Console.ReadKey();
}
else
{
Console.WriteLine("Excel数据插入到数据库表失败");
Console.ReadKey();
}
}
}