C#NPOI對Excel操做(導出)

語法都是基於.net的,第一次寫文章,有錯誤但願讀者提出,不勝感激。c++

NPOI簡介

POI是用Java寫的一種讀取office文件的庫,NPOI至關於POI的.net版本,它實現了電腦在沒有安裝微軟office的狀況下能夠對EXCEL、WORD、Visio等文件的一系列操做,下文使用的是NPOI 2.2.1版本,須要的同窗能夠點擊連接下載。
NPOI下載正則表達式

導出EXCEL

咱們先從數據庫中隨便取一張表,做爲導出的示例,數據庫使用的是sql server。
select * from Employees;
獲得以下數據:
sql


新建一個窗體項目,加上一個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;
        }
    }複製代碼

執行以上代碼:bash


最後打開導出的路徑,打開文件:


此文章僅供學習參考
做者:千夢
相關文章
相關標籤/搜索