年底這段時間實在太忙了,各種事情都湊在這個時候,沒時間去學(xué)習(xí)自己感興趣的東西,所以博客也好就沒寫了。最近工作上有個小功能要做成Web應(yīng)用,之前曾經(jīng)有過類似需求,當(dāng)時用的是WCF做WebAPI,前端用ExtJS。這次需求不關(guān)鍵,只要能解決問題就好,具體用什么技術(shù)無所謂,正好趕上ASP.NET 5發(fā)布,所以打算嘗試一下。在Windows下借助強(qiáng)大的VS一路安裝就解決問題了,不過ASP.NET5跨平臺啊,決定試一下在Linux下部署開發(fā)環(huán)境,以后再忽悠別人入坑也更有說服力。之前一直用Windows,只是出于好奇裝過Linux,所以對Linux不是很熟系,邊查邊做,期間自然是各種坑,折騰了一天多,不過最后也算跑起來了,在這里記錄一下踩到的坑和解決的以及未解決的問題。 0x01 Windows和Ubuntu雙系統(tǒng)之前都使用虛擬機(jī)裝Linux的,這次既然要測試就認(rèn)真一點(diǎn)吧,從硬盤中劃出了100G的空間,參照網(wǎng)上的教程裝了Ubuntu雙系統(tǒng)。不過這個不是本文的重點(diǎn),而且很容易就能搜到大量教程,具體就不說了。我參考的這篇文章: http://www./Linux/2012-05/59663.htm 0x02 安裝ASP.NET 5開發(fā)環(huán)境下面重點(diǎn)開始了,主要步驟參照的微軟的官方文檔: https://docs./en/latest/getting-started/installing-on-linux.html 首先說明一下踩到的第一個坑,因為很多命令都需要用到sudo,所以我干脆sudo bash把終端切換到了root,造成的后果就是后面建立的有些文件夾都是root的,導(dǎo)致后來在非root下用yo創(chuàng)建項目的時候出現(xiàn)權(quán)限錯誤,花了很多時間才找到問題。所以為了少出現(xiàn)不必要的麻煩下面操作時建議大家還是老老實實用sudo。下面截圖中可以看到我還是用的root,大家不要這樣。 1 安裝DNVM首先準(zhǔn)備開發(fā)環(huán)境搭建用到的工具。一般來說很可能系統(tǒng)自帶了,不過以防萬一還是運(yùn)行一下,反正也很快: sudo apt-get install unzip curl 這個命令會安裝unzip和curl兩個工具,用于解壓和下載 什么是DNVM、DNX可以參照@張善友 的這篇文章http://www.cnblogs.com/shanyou/p/4589930.html 寫的很全面 然后下載DNVM。官網(wǎng)文檔給出了以下命令: curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh 這里就用到剛剛準(zhǔn)備好的curl了,不過一般系統(tǒng)都自帶了。 按照系統(tǒng)提示在下載完后執(zhí)行命令 source ~/.dnx/dnvm/dnvm.sh 這樣DNVM就安裝完成了??梢暂斎雂nvm看是否安裝成功。 2 使用DNVM安裝DNX首先還是需要準(zhǔn)備安裝中用到的工具 sudo apt-get install libunwind8 gettext libssl-dev libcurl4-openssl-dev zlib1g libicu-dev uuid-dev 然后用DNVM安裝DNX for.NET Core dnvm upgrade -r coreclr 然后使用DNVM安裝DNX for Mono dnvm upgrade -r mono 安裝時提示我的系統(tǒng)里沒有Mono,需要安裝。參照官網(wǎng)文檔給出的鏈接,依次執(zhí)行以下命令: apt-key adv --keyserver keyserver.ubuntu.com –recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EFecho "deb http://download./repo/debian wheezy main" | tee /etc/apt/sources.list.d/mono-xamarin.list apt-get update apt-get install Mono-Complete 3 安裝libuv為什么要安裝這個東西呢,因為開發(fā)中需要運(yùn)行本地Web服務(wù)測試啊,在Windows中我們有IIS Express,可是Linux中沒有。官方推薦使用的是kestrel,而kestrel用到了libuv這個庫,所以我們需要安裝這個庫。這個庫是用源碼編譯的方式安裝的,命令比較多,反正我是一行一行復(fù)制著完成的,基本上復(fù)制完下一條命令的時間上一條命令就執(zhí)行完成了,體驗也算不錯:)大致的過程就是:安裝編譯需要的工具,下載并解壓源代碼,編譯安裝,加載共享庫使新庫生效。 sudo apt-get install make automake libtool curl curl -sSL https://github.com/libuv/libuv/archive/v1.4.2.tar.gz | sudo tar zxfv - -C /usr/local/srccd /usr/local/src/libuv-1.4.2sudo sh autogen.shsudo ./configuresudo makesudo make installsudo rm -rf /usr/local/src/libuv-1.4.2 && cd ~/sudo ldconfig 至此我們已經(jīng)完成ASP.NET 5 開發(fā)環(huán)境的安裝了。這樣是不是就結(jié)束了呢?剛開始我也是這么想的,不過馬上就意識到不對了。當(dāng)我想建個測試工程的時候發(fā)現(xiàn)無法入手,在Windows上我都是用VS新建解決方案,選擇Web,然后選擇用什么樣的模板,可是在Linux下沒有模板啊,總不能手動一個一個文件建立吧。然后繼續(xù)看文檔找到原來還有Your First APS.NET 5 Application on XXX系列,不過里面沒有Linux,參照Mac應(yīng)該也沒問題。 https://docs./en/latest/tutorials/your-first-mac-aspnet.html 0x03 安裝和配置開發(fā)工具開發(fā)工具自然是Visula Studio Code,官網(wǎng)下載 https://code./ 下載后解壓,直接運(yùn)行Code即可使用。 建立項目時的模板是通過yeoman生成的。安裝yeoman需要用npm,于是我們先安裝npm sudo apt-get install npm npm和nodejs是相互依賴的,安裝其中任意一個都會自動安裝上另外一個。安裝后可以使用 npm install -g yo bower grunt-cli gulp 來安裝yeoman、bower、grunt-cli、gulp。不過問題來了,yeoman需要nodejs版本在0.12以上,而用apt-get安裝的版本只是0.10,各種折騰都升級不了,包括使用傳說中的n這個名字怪異但據(jù)說是專用于升級nodejs的工具都不行。在網(wǎng)上查來查去找到了這邊文章: http://my.oschina.net/tbaby/blog/412052 里面有這么一條命令: curl --silent --location https://deb.nodesource.com/setup_0.12 | sudo bash - 打開 https://deb.看了下我擦原來在這里 運(yùn)行上面那條命令下載完成后還會提示 執(zhí)行這條命令 sudo apt-get install nodejs 就可以安裝最新版本的nodejs了。安裝完成后已經(jīng)成了最新的0.12.9 這樣再使用npm安裝yeoman等一系列工具就沒有問題了,命令如下: npm install -g yo bower grunt-cli gulp yeoman是裝好了,不過yeoman還不能生成針對ASP.NET的模板,這個也是需要我們安裝的。使用以下命令來安裝ASP.NET模板: npm install -g generator-aspnet 安裝完成后我們就可以使用yeoman建立工程了。進(jìn)入我們想放置工程的目錄,運(yùn)行 yo aspnet 然后我們就看到了模板選擇界面,我們選擇WebApplication,然后會提示我們輸入應(yīng)用的名稱,我們輸入first,然后yeoman會幫我們創(chuàng)建first這個目錄,然后把項目文件都建立好。 使用VSCode打開first目錄會提示缺少依賴 在工程所在目錄下執(zhí)行下面命令 dnu restore 這樣就可以解決依賴的問題。如果是第一次restore要下載很多東西可能會花點(diǎn)時間。 完成之后目錄結(jié)構(gòu)大概就是這樣,跟用VS創(chuàng)建的一致。代碼也會有屬性和方法的引用提示。 在工程的project.json文件中我們可以看到commands中友web這個命令,在dependency中我們也能找到相應(yīng)的依賴。使用web這個命令就能開啟kestrel服務(wù)。 在工程所在目錄下執(zhí)行 dnx web 可以開啟web服務(wù),這樣在瀏覽器中輸入localhost:5000就能看到我們的頁面了。 嘗試把HomeController中About的消息改一下。必須要重啟Web服務(wù)才能生效,這點(diǎn)不如用VS啊,VS可以直接改了保存然后F5刷新就能看效果,跟用腳本開發(fā)一樣。 比較奇怪的是把dnx切換到coreclr后輸入dnx沒有任何反映,網(wǎng)上查也沒看到問題出在哪里。有知道的請賜教。 0x04 寫在最后的廢話由于對Linux不是很熟悉,整個過程遇到了很多大大小小的問題,我挑了幾個比較惱人的寫了下。還有些弱智到會暴露智商的我都沒提,這樣才夠心機(jī)。不過完成后對dnvm、dnx等很多概念有了更多的認(rèn)識。但讓我做ASP.NET 5開發(fā)的話我還是會選擇windows啊,畢竟親生的還有強(qiáng)大的VS。最后再說一下Ubuntu的使用,之前一直使用Windows,突然換到了Ubuntu感覺沒有想象中的那么困難,圖形界面也算比較成熟了,很多工具用Web應(yīng)用基本可以解決。開發(fā)的話JetBrains系列都可以使用,加上現(xiàn)在還多了VSCode,只要不寫WPF感覺問題都不是很大。遇到問題了網(wǎng)上搜一下基本也都能解決,慢慢就應(yīng)該能熟練了吧。 評論 #1樓 2015-12-25 20:50 | weixiao520 受益良多。 支持(0)反對(0) #2樓[樓主] 2015-12-25 20:53 | durow @weixiao520 我也是瞎折騰,以后再跟別人說跨平臺的時候就更有底氣了:) 支持(0)反對(0) #3樓 2015-12-26 10:00 | dudu 運(yùn)行命令 export DNX_TRACE=1 后,可以看到基于coreclr運(yùn)行dnx web的錯誤信息 支持(0)反對(0) #4樓[樓主] 2015-12-26 11:11 | durow @dudu 多謝dudu大大,回去了試一下,說實話我個人更傾向用coreclr。 支持(0)反對(0) #5樓 2015-12-26 13:18 | dudu @durow 我都是Linux上不裝mono,直接dnvm upgrade -r coreclr 支持(1)反對(0) #6樓[樓主] 2015-12-26 13:29 | durow @dudu 我剛開始也是這么打算的,出現(xiàn)問題半天沒找到原因。后來試了下mono能跑說明問題就是出在coreclr上了,肯定我哪里沒搞好。 支持(1)反對(0) #7樓 2015-12-26 13:38 | dudu @durow 試試 sudo ln -s /usr/local/lib/libuv.so /usr/lib/libuv.so.1 支持(0)反對(0) #8樓[樓主] 2015-12-26 14:01 | durow @dudu 之前查這個問題時看到有說可能這個原因的,去那個目錄下看過,有那個連接。而且mono能跑起來說明kestrel應(yīng)該沒問題。網(wǎng)上也找到有別人問過類似問題,有回答說是coreclr的問題,還不夠完善,不過那個回答很早了,我這個問題應(yīng)該不是那個原因。我在想是不是漏掉了什么東西,之前裝了dnx for mono的時候提示我沒有Mono,讓我記得裝。裝了coreclr后沒注意到有沒有提示,是不是還需要其他東西。 支持(0)反對(0) #9樓 2015-12-26 15:22 | zwmyxzs unbuntu15? 支持(0)反對(0) #10樓 2015-12-26 15:35 | Amonk 66666666666666 支持(0)反對(0) #11樓 2015-12-26 15:35 | Amonk 這才是我想要的 支持(0)反對(0) #12樓[樓主] 2015-12-26 15:42 | durow @zwmyxzs 我擦厲害,是15,這個怎么看出來的啊 支持(0)反對(0) #13樓 2015-12-26 16:03 | zwmyxzs @durow coreclr只在14下發(fā)布通過,有個組件叫l(wèi)ibicu,14是libicu52,15這個東西比較高是libicu55,你試試下個libicu52可能就好了。 wget http://security./ubuntu/pool/main/i/icu/libicu52_52.1-8ubuntu0.2_amd64.deb dpkg -i libicu52_52.1-8ubuntu0.2_amd64.deb 支持(0)反對(0) #14樓[樓主] 2015-12-26 16:25 | durow @zwmyxzs 太感謝了,人在外面,回去了試試。園子里果然牛人多。 支持(0)反對(0) #15樓[樓主] 2015-12-26 16:30 | durow @zwmyxzs 看到你那篇文章了,我擦我搜了好久也沒找到你那篇。 看來用Ubuntu還是要選擇長期維護(hù)版啊,支持的比較好。 支持(0)反對(0) #16樓 2015-12-26 20:40 | xiaohuazi curl -O http://img.my.csdn.net/uploads/201211/29/1354170699_6619.png |http://ubmcmm./media/v1/0f000rjWcxSC61lrQ9tTZ6.jpg 這個用法是錯的! 支持(0)反對(0) NPOI 讀取excel到DataTable 讀取隱藏列 讀取公式列處理思路: 1.打開excel 用NPOI進(jìn)行讀?。?/p> 2.讀取第一個Sheet; 讀取過程中: a.先設(shè)置相應(yīng)列 不隱藏 b.讀取Cell時 先判斷是否的包含公式 相應(yīng)代碼如下: public static DataTable ReadDataFromExcelByNPOI(){DataTable dt = new DataTable(); var filePathAndName = Path.Combine(Server.MapPath("~/Content/Excel"), "ExcelForUploadTest.xls"); //打開文件讀取數(shù)據(jù)stream = System.IO.File.Open(filePathAndName2, FileMode.Open); //通過Stream創(chuàng)建WorkbookHSSFWorkbook workbook = new HSSFWorkbook(stream); //獲取excel的第一個sheetHSSFSheet sheet = (HSSFSheet)workbook.GetSheetAt(0); //設(shè)置隱藏列 為 不隱藏for (int iHide = 0; iHide <= 40; iHide++) {sheet.SetColumnHidden(iHide, false);} //最后一列的標(biāo)號(即總的行數(shù))int rowCount = sheet.LastRowNum; //獲取sheet的首行HSSFRow headerRow = (HSSFRow)sheet.GetRow(0); //一行最后一個方格的編號(即總的列數(shù))int cellCount = headerRow.LastCellNum; string columnNames = @"A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,AZ"; string[] columns = columnNames.Split(','); //使用 A B C D ... 字母的方式 命名DataTable的各列名for (int i = headerRow.FirstCellNum; i < cellCount; i++){ //DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue);DataColumn column = new DataColumn(columns[i]);dt.Columns.Add(column);} for (int i = (iHeaderRowIndex.Value + 1); i <= rowCount; i++){ HSSFRow row = (HSSFRow)sheet.GetRow(i);DataRow dataRow = dt.NewRow(); if (row != null){ for (int j = row.FirstCellNum; j < cellCount; j++){ if (row.GetCell(j) != null){ //如果是公式Cell //則僅讀取其Cell單元格的顯示值 而不是讀取公式if (row.GetCell(j).CellType == CellType.FORMULA){dataRow[j] = row.GetCell(j).StringCellValue;}else{dataRow[j] = row.GetCell(j).ToString();}}}} //某標(biāo)示列 33 //某標(biāo)示列 38 //其值非空 標(biāo)示是有效數(shù)據(jù) //其值為空 標(biāo)示結(jié)束if(string.IsNullOrEmpty(dataRow[33].ToString()) && string.IsNullOrEmpty(dataRow[38].ToString())){ break;//讀取結(jié)束 退出For循環(huán) } else{dt.Rows.Add(dataRow);} }workbook = null;sheet = null; return dt;}#endregion |
|