NOPI導入導出EXCEL


一、簡介

1. 什么是NPOI

NPOI,顧名思義,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java寫成的庫,能夠幫助開發者在沒有安裝微軟Office的情況下讀寫Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。在本文發布時,POI的最新版本是3.5 beta 6。

NPOI 1.x是基於POI 3.x版本開發的,與poi 3.2對應的版本是NPOI 1.2,目前最新發布的版本是1.2.1,在該版本中僅支持讀寫Excel文件和Drawing格式,其他文件格式將在以后的版本中得到支持。

1.2  目前POI版本中的HWPF(用於Word的讀寫庫)還不是很穩定,並非正式發布版本,且負責HWPF的關鍵開發人員已經離開,所以NPOI可能考慮自己重新開發HWPF。另外,目前微軟正在開發Open XML Format SDK,NPOI可能會放棄對ooxml的支持,當然這取決於用戶的需求和Open XML Format SDK的穩定性和速度。從目前而言,NPOI有幾大優勢

第一,完全基於.NET 2.0,而非.NET 3.0/3.5。

第二,讀寫速度快(有個國外的兄弟回復說,他原來用ExcelPackage生成用了4-5個小時,現在只需要4-5分鍾)

第三,穩定性好(相對於用Office OIA而言,畢竟那東西是基於Automation做的,在Server上跑個Automation的東西,想想都覺得可怕),跑過了將近1000個測試用例(來自於POI的testcase目錄)

第四,API簡單易用,當然這得感謝POI的設計師們

第五,完美支持Excel 2003格式(據說myxls無法正確讀取xls模板,但NPOI可以),以后也許是所有Office 2003格式

希望NPOI把這些優勢繼續發揚下去,這樣NPOI才會更有競爭力。

1.3  NPOI 1.2中各Assembly的作用

NPOI目前有好幾個assembly,每個的作用各有不同,開發人員可以按需加載相應的assembly。在這里大概羅列一下:

NPOI.Util  基礎輔助庫
NPOI.POIFS   OLE2格式讀寫庫
NPOI.DDF   Microsoft Drawing格式讀寫庫
NPOI.SS   Excel公式計算庫
NPOI.HPSF   OLE2的Summary Information和Document Summary Information屬性讀寫庫
NPOI.HSSF   Excel BIFF格式讀寫庫

 

 ps:先去官網:http://npoi.codeplex.com/下載需要引入dll(可以選擇.net2.0或者.net4.0的dll),然后在網站中添加引用。

 

二、導入EXCEL

 #region==Excel導入==
        
        private void ExcelImport()
        {
            
            string fileurl = GetFormString("fileurl");
            if (fileurl != "")
            {
                string FileName = HttpRuntime.AppDomainAppPath.ToString() + fileurl;
                FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read);
                IWorkbook book = null;  //新建IWorkbook對象  

                if (FileName.IndexOf(".xlsx") > 0) // 2007版本  
                {
                    book = new XSSFWorkbook(fs);  //xlsx數據讀入workbook  
                }
                else if (FileName.IndexOf(".xls") > 0) // 2003版本  
                {
                    book = new HSSFWorkbook(fs);  //xls數據讀入workbook  
                }
                //待收貨訂單
                BLL.t_order bll = new BLL.t_order();
                List<Model.t_order> listorder = bll.GetModelList(" OrderState=2  ");
                List<string> strlist = new List<string>();

                int sheetCount = book.NumberOfSheets;
                for (int sheetIndex = 0; sheetIndex < sheetCount; sheetIndex++)
                {
                    NPOI.SS.UserModel.ISheet sheet = book.GetSheetAt(sheetIndex);//獲取第sheetIndex個工作表  
                    if (sheet == null) continue;

                    NPOI.SS.UserModel.IRow row = sheet.GetRow(0);
                    if (row == null) continue;
                    int firstCellNum = row.FirstCellNum;
                    int lastCellNum = row.LastCellNum;
                    if (firstCellNum == lastCellNum) continue;

                    for (int i = 1; i <= sheet.LastRowNum; i++)//對工作表除去表頭的每一行
                    {
                        string cellValue = "";
                        for (int j = firstCellNum; j < lastCellNum; j++)
                        {
                            cellValue += sheet.GetRow(i).GetCell(j).ToString() + ",";//將每一行的數據以,相連
                        }
                        strlist.Add(cellValue);
                    }
                }
            
                for (int j = 0; j < strlist.Count; j++)
                {
                    if (strlist[j] != "")
                    {
                      string[] arr = strlist[j].Split(',');   //再進行拆分
                        for (int k = 0; k < listorder.Count; k++)
                        {

                            if (listorder[k].BillNumber == arr[0])
                            {
                                listorder[k].FreightNumber = arr[1];
                                listorder[k].FreightName = arr[2];
                                bll.Update(listorder[k]);
                                break;
                            }
                        }
                    }
                }
                fs.Close();
                //book.Close();  
                Common.Utils.DeleteUpFile(fileurl);
                ResponseText(Newtonsoft.Json.JsonConvert.SerializeObject(new { res = 1, msg = "操作成功!" }));
            }
            else {
                ResponseText(Newtonsoft.Json.JsonConvert.SerializeObject(new { res = 0, msg = "操作失敗!" }));
            
            }                
        }
        #endregion

 

三、導出EXCEL

   #region==導出訂單==
        private HSSFWorkbook BuildSwitchData(List<Model.t_order> lS)
        {
           
          
            try
            {
                HSSFWorkbook wb = new HSSFWorkbook();
                HSSFSheet sheet = (HSSFSheet)wb.CreateSheet("待發貨訂單"); //創建工作表
                sheet.CreateFreezePane(0, 1); //凍結列頭行
                HSSFRow row_Title = (HSSFRow)sheet.CreateRow(0); //創建列頭行
                row_Title.HeightInPoints = 19.5F; //設置列頭行高

                #region 設置列寬
                sheet.SetColumnWidth(0, 50 * 256);
                sheet.SetColumnWidth(1, 24 * 256);
                sheet.SetColumnWidth(2, 37 * 256);
                sheet.SetColumnWidth(3, 22 * 256);
                sheet.SetColumnWidth(4, 20 * 256);
                sheet.SetColumnWidth(5, 20 * 256);
                #endregion

                #region 設置列頭單元格樣式
                HSSFCellStyle cs_Title = (HSSFCellStyle)wb.CreateCellStyle(); //創建列頭樣式
                cs_Title.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; //水平居中
                cs_Title.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; //垂直居中
                HSSFFont cs_Title_Font = (HSSFFont)wb.CreateFont(); //創建字體
                cs_Title_Font.Boldweight = 700; //字體加粗
                cs_Title_Font.FontHeightInPoints = 12; //字體大小
                cs_Title.SetFont(cs_Title_Font); //將字體綁定到樣式
                #endregion

                #region 生成列頭
                for (int i = 0; i < 8; i++)
                {
                    HSSFCell cell_Title = (HSSFCell)row_Title.CreateCell(i); //創建單元格
                    cell_Title.CellStyle = cs_Title; //將樣式綁定到單元格
                    switch (i)
                    {
                        case 0:
                            cell_Title.SetCellValue("訂單編號");
                            break;
                        case 1:
                            cell_Title.SetCellValue("商品信息");
                            break;
                        case 2:
                            cell_Title.SetCellValue("收件人姓名");
                            break;
                        case 3:
                            cell_Title.SetCellValue("收件人電話");
                            break;
                        case 4:
                            cell_Title.SetCellValue("收件人地址");
                            break;
                        case 5:
                            cell_Title.SetCellValue("寄件人姓名");
                            break;
                        case 6:
                            cell_Title.SetCellValue("寄件人電話");
                            break;
                        case 7:
                            cell_Title.SetCellValue("寄件人地址");
                            break;
                    }
                }
                #endregion

                for (int i = 0; i < lS.Count; i++)
                {
                    #region 設置內容單元格樣式
                    HSSFCellStyle cs_Content = (HSSFCellStyle)wb.CreateCellStyle(); //創建列頭樣式
                    cs_Content.Alignment = NPOI.SS.UserModel.HorizontalAlignment.Center; //水平居中
                    cs_Content.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center; //垂直居中
                    #endregion

                    #region 生成內容單元格
                    HSSFRow row_Content = (HSSFRow)sheet.CreateRow(i + 1); //創建行
                    row_Content.HeightInPoints = 16;
                    for (int j = 0; j < 8; j++)
                    {
                        HSSFCell cell_Conent = (HSSFCell)row_Content.CreateCell(j); //創建單元格
                        cell_Conent.CellStyle = cs_Content;
                        switch (j)
                        {
                            case 0:
                                cell_Conent.SetCellValue(lS[i].BillNumber);
                                break;
                            case 1:
                                cell_Conent.SetCellValue(OrderGoodsInfo(lS[i].ID.ToString()));
                                break;
                            case 2:
                                cell_Conent.SetCellValue(lS[i].ContactPeople);
                                break;
                            case 3:
                                cell_Conent.SetCellValue(lS[i].ContactPhone);
                                break;
                            case 4:
                                cell_Conent.SetCellValue(lS[i].AddrDesc);
                                break;
                            case 5:
                                cell_Conent.SetCellValue(lS[i].DeliverPeople);
                                break;
                            case 6:
                                cell_Conent.SetCellValue(lS[i].DeliverPhone);
                                break;
                            case 7:
                                cell_Conent.SetCellValue("");
                                break;
                        }
                    }
                    #endregion
                }

                return wb;
            }
            catch { return null; }

        }
        //獲得訂單商品信息
        private string OrderGoodsInfo(string orderid) {
            string info = "";
            List<Model.t_orderdetail> list = new BLL.t_orderdetail().GetModelList(" OrderID ='" + orderid + "'");
            for (int i = 0; i < list.Count; i++) {
                info += "【" + list[i].GoodsName + " 規格:" + list[i].SpecDesc + " 數量:" + list[i].GoodsCount+ "】";
            }
              return info;
        
        }

        protected void fileBtn2_Click(object sender, EventArgs e)
        {
            try
            {
                List<Model.t_order> lS = new List<Model.t_order>();
                BLL.t_order bll = new BLL.t_order();
                Model.t_order order = null;
                for (int i = 0; i < rptList.Items.Count; i++)
                {
                    string id = ((HiddenField)rptList.Items[i].FindControl("hidId")).Value;
                    CheckBox cb = (CheckBox)rptList.Items[i].FindControl("chkId");
                    if (cb.Checked)
                    {
                        order = bll.GetModel(Common.Utils.ToGuid(id));
                        if (order != null)
                        {
                            lS.Add(order);
                        }
                    }
                }
                string idlist = GetQueryString("idlist");
                string sExportFileName = ""; //導出的臨時文件的名稱
                string sExportFilePath = ""; //導出的臨時文件路徑
                try
                {
                    HSSFWorkbook wb = BuildSwitchData(lS);
                    string sExportDir = HttpContext.Current.Server.MapPath("~") + "/orderdocument"; //臨時保存文件夾
                    sExportFileName = DateTime.Now.ToString("yyyyMMddHHmmss") + "待發貨訂單" + ".xls";
                    sExportFilePath = sExportDir + "/" + sExportFileName;
                    if (!Directory.Exists(sExportDir))
                        Directory.CreateDirectory(sExportDir);
                    using (FileStream file = new FileStream(sExportFilePath, FileMode.Create))
                    {
                        wb.Write(file);
                    }
                }
                catch
                {
                    HttpContext.Current.Response.Write("<script type='text/javascript'>alert('導出發生異常!');window.history.back();</script>");
                    if (File.Exists(sExportFilePath))
                        File.Delete(sExportFilePath);
                    return;
                }
                HttpContext.Current.Response.ContentType = "application/vnd.ms-excel; charset=UTF-8";
                HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + sExportFileName);
                HttpContext.Current.Response.TransmitFile(sExportFilePath); //將指定的文件直接寫入 HTTP 響應輸出流,而不在內存中緩沖該文件
                HttpContext.Current.Response.Flush();
                if (File.Exists(sExportFilePath))
                    File.Delete(sExportFilePath);
                HttpContext.Current.Response.End();
            }
            catch
            {
                HttpContext.Current.Response.Write("<script type='text/javascript'>window.location.href = location.href;parent.layer.msg(導出成功!);</script>");
            }
        }
        #endregion

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM