语法都是基于.net的,第一次写文章,有错误希望读者提出,不胜感激。
NPOI简介
POI是用Java写的一种读取office文件的库,NPOI相当于POI的.net版本,它实现了电脑在没有安装微软office的情况下可以对EXCEL、WORD、Visio等文件的一系列操作,下文使用的是NPOI 2.2.1版本,需要的同学可以点击链接下载。
NPOI下载
导出EXCEL
我们先从数据库中随便取一张表,作为导出的示例,数据库使用的是sql server。
select * from Employees;
得到如下数据:
新建一个窗体项目,加上一个button,一个label(提示使用)
添加button的click事件,执行下列代码:
private void button1_Click(object sender, EventArgs e)
{
//要执行的sql语句
string sql = "select * from Employees where cc_autoid < 50";
//调用函数导出Excel,函数实现在下面
ExportExcelFromSql(sql, @"D:\", 1);
}复制代码
ExportExcelFromSql函数的实现:
参数1是要执行的sql语句
参数2是要导出的路径(注意路径字符串前要转移,加上@)
参数3是导出的格式(1 || 2)
1是xls格式
2是xlsx格式
下文的SqlHelper也是自己封装ADO.net的静态类,这里不详细介绍了
private void ExportExcelFromSql(string sql,string path,int format)
{
//是用正则表达式判断输入的格式是否是1或者2
Regex reg = new Regex("[^12]");
string x = format.ToString();
if(reg.IsMatch(x))
{
return;
}
//执行sql语句
SqlDataReader reader = SqlHelper.ExecuteReader(sql, CommandType.Text);
//创建一个IWorkbook的集合,如果format为1就构造HSSFWork创建xls格式的EXCEL,为2就构造XSSFWork创建xlsx格式的EXCEL
List<IWorkbook> list = new List<IWorkbook>();
//判断是否有数据,如果没有,label做出提示
if (reader.HasRows)
{
list.Add(new HSSFWorkbook());//xls格式
list.Add(new XSSFWorkbook());//xlsx格式
//首先创建EXCEL工作簿,三元运算符判断格式
IWorkbook workbook = (format == 1) ? list[0] : list[1];
//创建一张工作表,这里工作表没有准确命名,可以在传一个参数 来确定表明,或者用正则表达式提出from后的数据库表名作为工作表的名称
ISheet sheet = workbook.CreateSheet("1");
//创建一行,作为表头
IRow row_head = sheet.CreateRow(0);
//循环得到数据库列名,创建第一行
for (int h = 0; h < reader.FieldCount; h++)
{
row_head.CreateCell(h).SetCellValue(reader.GetName(h));
}
int index = 1;
while (reader.Read())
{
IRow row = sheet.CreateRow(index);
index++;
for (int c = 0; c < reader.FieldCount; c++)
{
//这边得到每一行一列的数据类型,转换成string做switch判断
Type type = reader.GetFieldType(c);
string type_string = type.ToString().Replace("System.", "");
switch (type_string)
{
//考虑到数据库中的null值,这里用了可空值类型,如果为null,就调用SetCellType(CellType.Blank)插入EXCEL中,表示一个空单元格
case "Int32":
int? temp_int = reader.IsDBNull(c) ? null : (int?)reader.GetInt32(c);
if (temp_int == null)
{
row.CreateCell(c).SetCellType(CellType.Blank);
}
else
{
row.CreateCell(c).SetCellValue((int)temp_int);
}
break;
case "String":
string temp_string = reader.IsDBNull(c) ? null : reader.GetString(c);
if (temp_string == null)
{
row.CreateCell(c).SetCellType(CellType.Blank);
}
else
{
row.CreateCell(c).SetCellValue(temp_string);
}
break;
case "DateTime":
DateTime? temp_datetime = reader.IsDBNull(c) ? null : (DateTime?)reader.GetDateTime(c);
if (temp_datetime == null)
{
row.CreateCell(c).SetCellType(CellType.Blank);
}
else
{
ICellStyle cell_style = workbook.CreateCellStyle();
cell_style.DataFormat = HSSFDataFormat.GetBuiltinFormat("m/d/yy h:mm");
ICell cell = row.CreateCell(c);
cell.CellStyle = cell_style;
cell.SetCellValue((DateTime)temp_datetime);
}
break;
}
}
}
//最后使用文件流导出到path位置,还是三元运算符判断保存类型
using (FileStream fs = File.OpenWrite(path + @"T_customers" + ((format == 1) ? ".xls" : ".xlsx")))
{
workbook.Write(fs);
}
label1.Text = "导出EXCEL成功\r\n" + path + @"Employees.xlsx" + "\r\n" + System.DateTime.Now.ToString();
}
else
{
label1.Text = "没有读取到数据";
return;
}
}复制代码
执行以上代码:
最后打开导出的路径,打开文件:
此文章仅供学习参考
作者:千梦