1. 程式人生 > >C#中使用NPOI將DataTable匯出到Excel檔案

C#中使用NPOI將DataTable匯出到Excel檔案

需要引入dll(可以選擇.net2.0、.net3.5或者.net4.0的dll) 點選下載DLL     Npoi使用手冊
NopiExcel.cs類

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Data;
using NPOI.HSSF.UserModel;
using NPOI.HPSF;
using NPOI.SS.UserModel;
using System.Collections;
using System.Security.Cryptography;


namespace Common
{
    public class NPOIExcel
    {
        /// <summary>
        /// 將Excel讀入到HashTable
        /// </summary>
        /// <param name="path">檔案路徑</param>
        /// <returns>相應的DataTable</returns>
        public static Hashtable ConvertToDataTable(string path)
        {
            if (path == "") return null;
            HSSFWorkbook hssfworkbook=null;
            try
            {
                using (FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read))
                {
                    hssfworkbook = new HSSFWorkbook(file);
                }
            }
            catch
            {
                return null;
            }
           
            Hashtable ht = new Hashtable();
            for (int e = 0; e < (int)hssfworkbook.Count; e++)
            {
                //獲取excel的第一個sheet
                ISheet sheet = hssfworkbook.GetSheetAt(e);
                string sheetName = hssfworkbook.GetSheetName(e);
                DataTable dt = new DataTable();
                //獲取sheet的首行
                IRow headerRow = sheet.GetRow(0);


                //一行最後一個方格的編號 即總的列數
                int cellCount = headerRow.LastCellNum;


                for (int i = headerRow.FirstCellNum; i < cellCount; i++)
                {
                    DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);
                    dt.Columns.Add(column);
                }
                //最後一列的標號  即總的行數
                int rowCount = sheet.LastRowNum;


                for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
                {
                    IRow row = sheet.GetRow(i);
                    DataRow dataRow = dt.NewRow();


                    for (int j = row.FirstCellNum; j < cellCount; j++)
                    {
                        if (row.GetCell(j) != null)
                            dataRow[j] = row.GetCell(j).ToString();
                        else dataRow[j] = "";
                    }


                    dt.Rows.Add(dataRow);
                }               
                sheet = null;
                ht.Add(sheetName, dt);
            }
            hssfworkbook = null;
            return ht;
        }


        /// <summary>
        /// DataTable匯出到Excel檔案  
        /// </summary>
        /// <param name="dtSource">源DataTable</param>
        /// <param name="strHeaderText">表頭文字</param>
        /// <param name="strFileName">儲存位置</param>
        public static void DataTableToExcel(Hashtable ht, string strFileName)
        {
            HSSFWorkbook workbook = new HSSFWorkbook();


            foreach (DictionaryEntry de in ht)
            {
                DataTable dt = (DataTable)de.Value;
                string sheetName = (string)de.Key;
                ISheet sheet = workbook.CreateSheet(sheetName);
                IRow dataRow = sheet.CreateRow(0);
                foreach (DataColumn column in dt.Columns)
                {
                    dataRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
                }


                //填充內容  
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    dataRow = sheet.CreateRow(i + 1);
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        dataRow.CreateCell(j).SetCellValue(dt.Rows[i][j].ToString());
                    }
                }
            }
            workbook.Write(new FileStream(strFileName, FileMode.Create, FileAccess.Write));            
        }
    }
}


後臺執行操作

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Business;
using Common;//nopiExcel放在namespace Commom下
using System.Collections;
using System.Data;
namespace CourseCaculate.PrimaryC
{
    public partial class PrimaryCExport : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
              
            }
        }     

       
        /// <summary>
        /// 匯出
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void btnExport_Click(object sender, EventArgs e)
        {
           
            DataTable dt = CourseMarksDAL.GetDataTableLike();

            IList<string> toEraseList = new List<string>();
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                if (!InNameList(dt.Columns[i].ColumnName))
                {
                    //dt.Columns.RemoveAt(i);
                    toEraseList.Add(dt.Columns[i].ColumnName);
                }
            }
            foreach (string s in toEraseList)
            {
                dt.Columns.Remove(s);
            }
            dt.Columns["TicketNum"].ColumnName = "准考證號";
            dt.Columns["StuID"].ColumnName = "學號";
            dt.Columns["StuName"].ColumnName = "姓名";
            dt.Columns["ProfeName"].ColumnName = "專業名稱";           
            dt.Columns["ExamMarks"].ColumnName = "筆試成績";
          
            string fileName = "C語言成績.xls";
            NPOIHelper.ExportByWeb(dt, fileName);
        }    

        /// <summary>
        /// 判斷是否為列名
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public bool InNameList(string name)
        {
            string[] nameList = { "TicketNum", "StuID", "StuName", "ProfeName", "ExamMarks"};
            for (int i = 0; i < (int)nameList.Length; i++)
            {
                if (name == nameList[i])
                {
                    return true;
                }
            }
            return false;
        }

        
    }
}