語法都是基於.net的,第一次寫文章,有錯誤但願讀者提出,不勝感激。c++
POI是用Java寫的一種讀取office文件的庫,NPOI至關於POI的.net版本,它實現了電腦在沒有安裝微軟office的狀況下能夠對EXCEL、WORD、Visio等文件的一系列操做,下文使用的是NPOI 2.2.1版本,須要的同窗能夠點擊連接下載。
NPOI下載正則表達式
咱們先從數據庫中隨便取一張表,做爲導出的示例,數據庫使用的是sql server。
select * from Employees;
獲得以下數據:
sql
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;
}
}複製代碼
執行以上代碼:bash