日韩欧美人妻无码精品白浆,www.大香蕉久久网,狠狠的日狠狠的操,日本好好热在线观看

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

讀取Excel文件的兩種方法

admin
2018年9月8日 18:51 本文熱度 6705
第一種方法:傳統(tǒng)方法,采用OleDB讀取EXCEL文件,

優(yōu)點(diǎn):寫法簡(jiǎn)單,缺點(diǎn):服務(wù)器必須安有此組件才能用,不推薦使用
private DataSet GetConnect_DataSet2(string fileName) 
          { 
              DataSet myDataSet = new DataSet(); 
              //創(chuàng)建一個(gè)數(shù)據(jù)鏈接 
              string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + fileName + ";Extended Properties=Excel 8.0"; 
              OleDbConnection myConn = new OleDbConnection(strCon); 
              string strCom = " SELECT * FROM [Sheet1$] "; 
              //try 
              //{ 
              myConn.Open(); 
              //打開數(shù)據(jù)鏈接,得到一個(gè)數(shù)據(jù)集 
              OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn); 
              //創(chuàng)建一個(gè) DataSet對(duì)象 
              myDataSet = new DataSet(); 
              //得到自己的DataSet對(duì)象 
              myCommand.Fill(myDataSet, "CodeTable"); 
              //關(guān)閉此數(shù)據(jù)鏈接 
              myConn.Close(); 
              //} 
              //catch (Exception ex) 
              //{ 
     
              //} 
              return myDataSet; 
          }

第二種方法:用第三方組件:NPOI組件,推薦使用此方法

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

NPOI 是 POI 項(xiàng)目的 .NET 版本。POI是一個(gè)開源的Java讀寫Excel、WORD等微軟OLE2組件文檔的項(xiàng)目。

使用 NPOI 你就可以在沒有安裝 Office 或者相應(yīng)環(huán)境的機(jī)器上對(duì) WORD/EXCEL 文檔進(jìn)行讀寫。

NPOI采用的是Apache 2.0許可證(poi也是采用這個(gè)許可證),這意味著它可以被用于任何商業(yè)或非商業(yè)項(xiàng)目,你不用擔(dān)心因?yàn)槭褂盟仨氶_放你自己的源代碼,所以它對(duì)于很多從事業(yè)務(wù)系統(tǒng)開發(fā)的公司來(lái)說(shuō)絕對(duì)是很不錯(cuò)的選擇。

當(dāng)然作為一個(gè)開源許可證,肯定也是有一些義務(wù)的,例如如果你在系統(tǒng)中使用NPOI,你必須保留NPOI中的所有聲明信息。對(duì)于源代碼的任何修改,必須做出明確的標(biāo)識(shí)。
//config中配置的上傳的Excel路徑 
           static object basePath = ConfigurationManager.AppSettings["FilePath"]; 
           #region 讀取Excel文件 
           /// <summary> 
           /// 讀取Excel文件到table中 
           /// </summary> 
           /// <param name="filePath">excel文件路徑</param> 
           /// <returns></returns> 
           public static DataTable ReadExcel(string fileName) 
           { 
               DataTable dt = new DataTable(); 
               string filePath = ""; 
               if (basePath != null) 
               { 
                   filePath = HostingEnvironment.MapPath((basePath.ToString() + fileName)); 
                   dt = ImportExcelFile(filePath); 
               } 
               //文件是否存在 
               if (System.IO.File.Exists(filePath)) 
               { 
     
               } 
               return dt; 
           } 
           public static DataTable ImportExcelFile(string filePath) 
           { 
               HSSFWorkbook hssfworkbook; 
               #region//初始化信息 
               try 
               { 
                   using (FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 
                   { 
                       hssfworkbook = new HSSFWorkbook(file); 
                   } 
               } 
               catch (Exception e) 
               { 
                   throw e; 
               } 
               #endregion 
     
               NPOI.SS.UserModel.ISheet sheet = hssfworkbook.GetSheetAt(0); 
               System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); 
               DataTable dt = new DataTable(); 
               rows.MoveNext(); 
               HSSFRow row = (HSSFRow)rows.Current; 
               for (int j = 0; j < (sheet.GetRow(0).LastCellNum); j++) 
               { 
                   //dt.Columns.Add(Convert.ToChar(((int)''A'') + j).ToString()); 
                   //將第一列作為列表頭 
                   dt.Columns.Add(row.GetCell(j).ToString ()); 
               } 
               while (rows.MoveNext()) 
               { 
                    row = (HSSFRow)rows.Current; 
                   DataRow dr = dt.NewRow(); 
                   for (int i = 0; i < row.LastCellNum; i++) 
                   { 
                       NPOI.SS.UserModel.ICell cell = row.GetCell(i); 
                       if (cell == null) 
                       { 
                           dr[i] = null; 
                       } 
                       else 
                       { 
                           dr[i] = cell.ToString(); 
                       } 
                   } 
                   dt.Rows.Add(dr); 
               } 
               return dt; 
           } 
           #endregion

Npoi是對(duì)Excel(或者叫office比較合適)進(jìn)行操作的一個(gè)類庫(kù)框架,我們可以不再使用office提供的那個(gè)惡心的接口(速度慢)來(lái)操作了,我們對(duì)于office的操作解放了?,F(xiàn)在最新版的應(yīng)該是1.2.5.如果你安裝了NuGet的話,可以很容易的獲取。

因?yàn)镋xcel 2003極其以前的版本采用的底層代碼和Excel 2007 及其以后的不同,所以對(duì)于這個(gè)分界點(diǎn)是需要我們注意的。為什么會(huì)出現(xiàn)這個(gè)分界點(diǎn),大家想一下,現(xiàn)在微軟的所有東西都在.net 架構(gòu)之下,以前的Excel版本和這個(gè)架構(gòu)肯定是不同的。

我們重點(diǎn)來(lái)說(shuō)excel。畢竟這是在我們的工作中用的最多的一個(gè),Excel包括 文件(file,在Npoi.net中稱為workBook 工作簿)、工作表(sheet)以及里面的單元格,按照從大到小的分類就是文件中包含若干個(gè)sheet,每個(gè)sheet中包含很多單元格。這是Excel 的分類。

為了操作Excel,npoi.net當(dāng)然也需要對(duì)應(yīng)的類來(lái)對(duì)應(yīng)不同的分類,其中

HSSFWorkbook對(duì)應(yīng)的就是Excel文件  工作簿,

HSSFSheet對(duì)應(yīng)的就是Excel中sheet 工作表,

HSSFCell對(duì)應(yīng)的就是Excel的單元格,

HSSFRow對(duì)應(yīng)的就是Excel的行。

有了這幾個(gè)不同的類,我們就可以創(chuàng)建Excel文件,創(chuàng)建sheet,給sheet重命名或刪除sheet,創(chuàng)建行,添加單元格,為單元格設(shè)置格式,我個(gè)人感覺其他的都很簡(jiǎn)單,唯獨(dú)這個(gè)給單元格設(shè)置格式的做法很令人討厭,沒辦法用的別人的,只能有苦自己承受了。

public class NpoiNet
    {
        public void CreateWorkBook()
        {
            string filePath = HttpContext.Current.Server.MapPath("~/npoi.xls");
            //表示一個(gè)文件流
            FileStream fileStream = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite);
            HSSFWorkbook workBook = new HSSFWorkbook();//相當(dāng)于創(chuàng)建了一個(gè)內(nèi)存中的Excel 只是還沒有寫到硬盤上
            try
            {
                /*按照約定在每個(gè)Excel文件中至少要包含一個(gè)sheet,如果沒有任何sheet,打開Excel文件的時(shí)候會(huì)報(bào)錯(cuò)。
               在以前的npoi版本中,如果不是自己手動(dòng)的創(chuàng)建一個(gè)sheet,npoi框架是不會(huì)自動(dòng)創(chuàng)建一個(gè)的,但是在最新版的1.2.5中,
               我發(fā)現(xiàn)即使你忘記了創(chuàng)建sheet的操作,框架會(huì)自動(dòng)創(chuàng)建一個(gè)sheet,當(dāng)然如果你手動(dòng)創(chuàng)建了一個(gè)sheet,則框架就不會(huì)
                自動(dòng)的創(chuàng)建一個(gè)sheet,這就像構(gòu)造函數(shù),如果沒有寫任何一個(gè),.Net會(huì)默認(rèn)存在一個(gè),但是你創(chuàng)建了一個(gè)構(gòu)造函數(shù),則
                 * 框架就不會(huì)自動(dòng)創(chuàng)建了
                 * */
                workBook.CreateSheet("guozhiqi");//sheet的名稱為guozhiqi
                workBook.CreateSheet();//sheet的名稱為sheet1  從1開始命名
                workBook.CreateSheet("yuanjinzhou");
                workBook.CreateSheet();//這個(gè)sheet的名稱應(yīng)該為什么?答案是sheet3
                //創(chuàng)建了sheet 下面我們來(lái)創(chuàng)建單元格
                HSSFSheet sheetGuozhiqi = (HSSFSheet)workBook.GetSheet("guozhiqi");//獲取到sheet名稱為guozhiqi的那個(gè)工作簿
                //創(chuàng)建了工作簿 添加單元格之前首先要添加行
                //在這里請(qǐng)注意  行和列的下標(biāo)都是從0開始的 而不是Excel文件中的1
                for (int i = 0; i <= 10; i++)
                {
                    sheetGuozhiqi.CreateRow(i);//創(chuàng)建了11行
                }
                //創(chuàng)建了行之后 就要在每個(gè)行中創(chuàng)建單元格
                //如果沒有在之前創(chuàng)建行
                //  HSSFRow newRow = (HSSFRow)sheetGuozhiqi.GetRow(12);這是錯(cuò)誤的 程序會(huì)報(bào)異常 這就告訴我們 如果行還沒有創(chuàng)建
                //就不可以獲取
                HSSFRow newRow = (HSSFRow)sheetGuozhiqi.GetRow(0);
                HSSFCell[] cells = new HSSFCell[11];
                //在第0行的位置創(chuàng)建單元格
                for (int i = 0; i <= 10; i++)
                {
                    cells[i] = (HSSFCell)newRow.CreateCell(i);//為第0行創(chuàng)建了10個(gè)單元格
                }
                //這里取得單元格的異常出現(xiàn)位置相同 就是如果沒有創(chuàng)建就不要試圖獲取
                HSSFCell newCell = (HSSFCell)newRow.GetCell(0);//取得第0行第0個(gè)單元格
                //獲取到了單元格 賦值 為了方便說(shuō)明 我多獲取幾個(gè)單元格的值
                //Excel單元格有很多類型 例如字符串 數(shù)字 bool等類型,
                cells[0].SetCellValue(false);//賦值為bool型
                cells[1].SetCellValue(DateTime.Now);//賦值為日期型
                cells[2].SetCellValue(3.1415926);//賦值為double類型
                cells[3].SetCellValue("guozhiqi");//賦值為字符串guozhiqi
                //為單元格賦值以后 我們就要開始取值了
                bool cell0 = cells[0].BooleanCellValue;
               // string cell00 = cells[0].StringCellValue; 錯(cuò)誤 這句話的意思就是說(shuō)存儲(chǔ)的時(shí)候是什么類型 就必須用對(duì)應(yīng)的
                //取值方法取值
                DateTime dateTime = cells[1].DateCellValue;
                double cell2 = cells[2].NumericCellValue;
                string cell3 = cells[3].StringCellValue;
                //可以正常創(chuàng)建單元格 從單元格取值是遠(yuǎn)遠(yuǎn)不夠的 還有就是客戶可能會(huì)要求合并單元格  為單元格設(shè)置樣式
                //合并單元格的操作不必要?jiǎng)?chuàng)建所有的行或列,只需要制定范圍即可
                sheetGuozhiqi.AddMergedRegion(new NPOI.SS.Util.Region(1,1,20,20));//合并單元格
                HSSFCellStyle cellStyle = (HSSFCellStyle)workBook.CreateCellStyle();
                cellStyle.Alignment = HorizontalAlignment.CENTER;//居中顯示
                cellStyle.FillBackgroundColor = 244;
                cellStyle.FillPattern = FillPatternType.BRICKS;//填充模式
                cellStyle.IsHidden = false;//單元格是否隱藏
                cellStyle.IsLocked = false;//單元格是否鎖定
                cellStyle.VerticalAlignment = VerticalAlignment.CENTER;//垂直居中
               
                //設(shè)置單元格字體
                HSSFFont font =(HSSFFont) workBook.CreateFont();
                font.Color = 200;
                font.FontHeight = 18;//設(shè)置字體大小
                font.FontName = "黑體";//設(shè)置字體為黑體
                font.IsItalic = false;//是否是斜體
                font.IsStrikeout = true;//是否有中間線
                font.Underline = (byte)FontUnderlineType.DOUBLE;//設(shè)置下劃線
                cellStyle.SetFont(font);
                //將設(shè)置好的樣式應(yīng)用到對(duì)應(yīng)的單元格上 否則是沒有效果的
                cells[0].CellStyle = cellStyle;
                if (!workBook.IsWriteProtected)
                {
                    workBook.Write(fileStream);
                }
            }
            catch (Exception ex)
            {
                HttpContext.Current.Response.Write(ex.Message+ex.Source+ex.StackTrace);
            }
            finally
            {
                if (fileStream != null)
                {
                    fileStream.Close();
                }
            }
        }
    }

總結(jié),既然這篇博客是Npoi.net的總結(jié),那么我不可能就是舉了一個(gè)例子就算了事,畢竟博客園中園友們舉得例子已經(jīng)夠多了,下面我就把在使用npoi.net會(huì)遇到的一些小問(wèn)題總結(jié)一下。

  1. 在實(shí)例化了一個(gè)WorkBook之后,最好添加一個(gè)sheet,雖然在最新版的Npoi.net中自動(dòng)添加了,但是遇到遷移到原來(lái)版本就會(huì)出現(xiàn)問(wèn)題。所以我建議還是最少添加一個(gè)sheet
  2. 在從單元格取值時(shí)要注意單元格的類型,一定要用對(duì)應(yīng)的類型的方法來(lái)取單元格中的對(duì)應(yīng)類型的值,如果不確定,那只能是強(qiáng)制轉(zhuǎn)換成為string類型,畢竟string類型是excel中其他類型都可以轉(zhuǎn)換過(guò)來(lái)的
  3. 在獲取sheet中的某一行或者某一行的某一個(gè)單元格的時(shí)候,還要注意就是一定要確保創(chuàng)建了該行,并且取單元格還要確保創(chuàng)建了單元格,否則會(huì)報(bào)Null reference not to object 這個(gè)我們經(jīng)常會(huì)看到的異常信息。在外層一定要加上try捕獲異常
  4. 合并單元格是sheet的工作,因此需要獲取對(duì)應(yīng)的sheet,然后調(diào)用其AddMergedRegion方法合并單元格,在合并單元格的時(shí)候,我們不需要確保該單元格已經(jīng)存在或創(chuàng)建。
  5. 在為單元格設(shè)置樣式的過(guò)程中,我們會(huì)發(fā)現(xiàn)所有和樣式相關(guān)的類的創(chuàng)建都是通過(guò)workBook.Create(Font)..這種方式來(lái)執(zhí)行的,我們不可以直接new一個(gè)類的實(shí)例。
  6. 如果前面的工作都已經(jīng)做好,需要把內(nèi)存中的excel表寫到硬盤上時(shí),需要調(diào)用 workBook.write()方法,傳入一個(gè)文件流進(jìn)行創(chuàng)建。在這里有可能會(huì)出現(xiàn)一個(gè)問(wèn)題,就是你要?jiǎng)?chuàng)建的文件你已經(jīng)打開了,這時(shí)程序就會(huì)出現(xiàn)異常, 因此我們?cè)谡{(diào)試程序的時(shí)候一定要記得打開了excel文件以后要關(guān)閉
  7. 最后需要注意的就是文件流,在我們把excel寫到硬盤上以后,要顯式的調(diào)用其close()方法關(guān)閉文件流。因?yàn)槿绻魂P(guān)閉文件流的話,以后就會(huì)出現(xiàn)無(wú)法重新創(chuàng)建該文件的錯(cuò)誤,并且會(huì)提示 某文件正由另一進(jìn)程使用,因此該進(jìn)程無(wú)法訪問(wèn)此文件。

該文章在 2018/9/8 18:51:55 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

麻豆精品一二| 手机版大香蕉视频在线播放| 日韩毛片91| 久久精区| 欧美女同精品一区二区| 日本妞一区| 亚洲图片日韩在线| ess少妇精选pics| 午夜福利第一次破亚洲| 99精品视频8人妻| 野外少妇激情| 黄色一级片九九九| 日韩在线欧美精品国产| 制服淫语在线| 日本一区欧美一区| 漂亮人妻被强完成BD性犯罪| 亚洲视频无码图片| 美女亚洲黄| 久久精品美女网站| 日本久久久综合网| 天天不卡av| 亚洲天堂av播放| 人妻美女在线| 美女日韩3区| 嫩草视频精品视频一二三区| 婷婷yy麻豆| 国产色婷涩涩婷| 欧美日韩中文字幕搜索| 香蕉成熟了成人黄色片| 在线亚洲成人| 色婷婷五月天成人| 亚洲无码啪啪啪黑丝| 亚洲AV 漫画一区| 亚洲产最新精品| 国产区二区三区极品| 欧美视频633625163区| 欧洲激情无码| 亚洲天堂网站无码动漫| 色爱区宗合网| 91麻豆线上观看| 亚洲韩国性爱视频|