1.打開(kāi)excel,并打開(kāi)一個(gè)文檔,這文檔有一列數(shù)據(jù)是小數(shù)。2.選中這列數(shù)據(jù),右鍵點(diǎn)擊,然后點(diǎn)擊‘設(shè)置單元格格式’3.彈出設(shè)置單元格格式窗口,點(diǎn)擊左邊的‘百分比’4.點(diǎn)擊后,設(shè)置是否顯示小數(shù),按默認(rèn),點(diǎn)擊下方的確定按鈕。5。文檔里的數(shù)據(jù),已經(jīng)成功設(shè)置顯示為百分比數(shù)據(jù)了。
1.打開(kāi)excel,并打開(kāi)一個(gè)文檔,這文檔有一列數(shù)據(jù)是小數(shù)。
2.選中這列數(shù)據(jù),右鍵點(diǎn)擊,然后點(diǎn)擊‘設(shè)置單元格格式’3.彈出設(shè)置單元格格式窗口,點(diǎn)擊左邊的‘百分比’4.點(diǎn)擊后,設(shè)置是否顯示小數(shù),按默認(rèn),點(diǎn)擊下方的確定按鈕。5。文檔里的數(shù)據(jù),已經(jīng)成功設(shè)置顯示為百分比數(shù)據(jù)了。
加入輔助列,用公式mid()引入個(gè)位、十位、百位、千位,再排序就OK。
首先要導(dǎo)入spring相關(guān)包,poi,和fileupload包,我是使用maven構(gòu)建的。
一.導(dǎo)入excel
(1)使用spring上傳文件
a.前臺(tái)頁(yè)面提交
<formname="excelImportForm"action="${pageContext.request.contextPath}/brand/importBrandSort"method="post"onsubmit="returncheckImportPath();"enctype="multipart/form-data"id="excelImportForm">
<inputtype="hidden"name="ids"id="ids">
<div>
<div>
<label><inputid="excel_file"type="file"name="filename"accept="xls"/></label>
<div>
<inputid="excel_button"type="submit"value="導(dǎo)入Excel"/>
</div>
</div>
</div>
<div>
<buttontype="button"data-dismiss="modal"onClick="uncheckBoxes();">取消</button>
</div>
b.后臺(tái)spring的controller進(jìn)行相關(guān)操作,這里主要講的是使用spring上傳文件,和讀取文件信息。
使用spring上傳文件之前,需要配置bean。
<beanid="multipartResolver"></bean>@RequestMapping(value="/importBrandSort",method=RequestMethod.POST)
publicModelAndViewimportBrandSort(@RequestParam("filename")MultipartFilefile,
HttpServletRequestrequest,HttpServletResponseresponse)throwsException{
Stringtemp=request.getSession().getServletContext()
.getRealPath(File.separator)
+"temp";//臨時(shí)目錄
FiletempFile=newFile(temp);
if(!tempFile.exists()){
tempFile.mkdirs();
}
DiskFileUploadfu=newDiskFileUpload();
fu.setSizeMax(10*1024*1024);//設(shè)置允許用戶(hù)上傳文件大小,單位:位
fu.setSizeThreshold(4096);//設(shè)置最多只允許在內(nèi)存中存儲(chǔ)的數(shù)據(jù),單位:位
fu.setRepositoryPath(temp);//設(shè)置一旦文件大小超過(guò)getSizeThreshold()的值時(shí)數(shù)據(jù)存放在硬盤(pán)的目錄
//開(kāi)始讀取上傳信息
//
intindex=0;
/*ListfileItems=null;
try{
fileItems=fu.parseRequest(request);
}
catch(Exceptione){
e.printStackTrace();
}
Iteratoriter=fileItems.iterator();//依次處理每個(gè)上傳的文件
FileItemfileItem=null;
while(iter.hasNext()){
FileItemitem=(FileItem)iter.next();//忽略其他不是文件域的所有表單信息
if(!item.isFormField()){
fileItem=item;
//index++;
}
}
if(fileItem==null)
returnnull;
*/
if(file==null)
returnnull;
logger.info(file.getOriginalFilename());
Stringname=file.getOriginalFilename();//獲取上傳文件名,包括路徑
//name=name.substring(name.lastIndexOf("\\")+1);//從全路徑中提取文件名
longsize=file.getSize();
if((name==null||name.equals(""))&&size==0)
returnnull;
InputStreamin=file.getInputStream();
List<BrandMobileInfoEntity>BrandMobileInfos=brandService
.importBrandPeriodSort(in);
//改為人工刷新緩存KeyContextManager.clearPeriodCacheData(new
//PeriodDimensions());//清理所有緩存
intcount=BrandMobileInfos.size();
StringstrAlertMsg="";
if(count!=0){
strAlertMsg="成功導(dǎo)入"+count+"條!";
}else{
strAlertMsg="導(dǎo)入失??!";
}
logger.info(strAlertMsg);
//request.setAttribute("brandPeriodSortList",BrandMobileInfos);
//request.setAttribute("strAlertMsg",strAlertMsg);
request.getSession().setAttribute("msg",strAlertMsg);
returnget(request,response);
//returnnull;
}
代碼中的注釋部分是如果不使用spring的方式,如何拿到提交過(guò)來(lái)的文件名(需要是要apache的一些工具包),其實(shí)使用spring的也是一樣,只是已經(jīng)做好了封裝,方便我們寫(xiě)代碼。
代碼中的后半部分是讀取完上傳文文件的信息和對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新之后,輸出到前臺(tái)頁(yè)面的信息。
上述代碼中:InputStreamin=file.getInputStream();
List<BrandMobileInfoEntity>BrandMobileInfos=brandService
.importBrandPeriodSort(in);讀取excel的信息。
(2)使用poi讀取excel
a.更新數(shù)據(jù)庫(kù)
@Override
publicList<BrandMobileInfoEntity>importBrandPeriodSort(InputStreamin)throwsException{
List<BrandMobileInfoEntity>brandMobileInfos=readBrandPeriodSorXls(in);
for(BrandMobileInfoEntitybrandMobileInfo:brandMobileInfos){
mapper.updateByConditions(brandMobileInfo);
}
returnbrandMobileInfos;
}
這部分是sevice層的代碼,用于讀取excel信息之后更新數(shù)據(jù)庫(kù)數(shù)據(jù),我這里是使用mybatis。定義一個(gè)類(lèi)BrandMobileInfoEntity,用與保存excel表每一行的信息,而List<BrandMobileInfoEntity>則保存了全部信息,利用這些信息對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新。
b.讀取excel信息
privateList<BrandMobileInfoEntity>readBrandPeriodSorXls(InputStreamis)
throwsIOException,ParseException{
HSSFWorkbookhssfWorkbook=newHSSFWorkbook(is);
List<BrandMobileInfoEntity>brandMobileInfos=newArrayList<BrandMobileInfoEntity>();
BrandMobileInfoEntitybrandMobileInfo;
//循環(huán)工作表Sheet
for(intnumSheet=0;
numSheet<hssfWorkbook.getNumberOfSheets();numSheet++){
HSSFSheethssfSheet=hssfWorkbook.getSheetAt(numSheet);
if(hssfSheet==null){
continue;
}
//循環(huán)行Row
for(introwNum=1;rowNum<=hssfSheet.getLastRowNum();rowNum++){
brandMobileInfo=newBrandMobileInfoEntity();
HSSFRowhssfRow=hssfSheet.getRow(rowNum);
for(inti=0;i<hssfRow.getLastCellNum();i++){
HSSFCellbrandIdHSSFCell=hssfRow.getCell(i);
if(i==0){
brandMobileInfo.setBrandId(Integer
.parseInt(getCellValue(brandIdHSSFCell)));
}elseif(i==1){
continue;
}elseif(i==2){
brandMobileInfo.setMobileShowFrom(Integer.parseInt(getCellValue(brandIdHSSFCell)));
}elseif(i==3){
brandMobileInfo.setMobileShowTo(Integer.parseInt(getCellValue(brandIdHSSFCell)));
}elseif(i==4){
brandMobileInfo.setSellMarkValue(getCellValue(brandIdHSSFCell));
}elseif(i==5){
brandMobileInfo.setWarehouse(getCellValue(brandIdHSSFCell));
}elseif(i==
在當(dāng)前處于編輯狀態(tài)的同一個(gè)工作簿中,建立數(shù)據(jù)的查找和引用關(guān)系后,當(dāng)數(shù)據(jù)源的表名發(fā)生改變,比如Sheet1重命名為Sheet100,則所有與Sheet1建立了數(shù)據(jù)引用關(guān)系的,自動(dòng)將Sheet1修改為Sheet100,不影響數(shù)據(jù)的正常引用。
如果數(shù)據(jù)源為其他工作簿的工作表,且表名發(fā)生了變化,當(dāng)打開(kāi)工作簿時(shí),Excel會(huì)自動(dòng)提示“更新數(shù)據(jù)”或“鏈接”,需要在“數(shù)據(jù)”選項(xiàng)下的“編輯鏈接“中,重新建立與改名后工作表的鏈接。
首先,新建并打開(kāi)一個(gè)excel表格,將自己需要建立曲線的數(shù)據(jù)輸入進(jìn)去
然后,在“插入”中選擇“折線圖”中的“所有圖表類(lèi)型”
在圖表中選擇“XY散點(diǎn)圖”中的“散點(diǎn)圖”
在出現(xiàn)的圖表中選擇其中一點(diǎn),右擊并選擇添加趨勢(shì)線
在出現(xiàn)的的“設(shè)置趨勢(shì)線格式”界面中,選擇自己需要的趨勢(shì)線類(lèi)型,比如“線性”,設(shè)置自定義趨勢(shì)線名稱(chēng),勾選“顯示公式”和“顯示R平方值”選項(xiàng),完成之后點(diǎn)擊“關(guān)閉”
可以得到趨勢(shì)線及方程,并可以對(duì)圖表坐標(biāo)軸等格式進(jìn)行更改,以符合自己的要求
在不規(guī)則合并單元格內(nèi)怎樣快速填充序號(hào)?
1首先我們來(lái)看兩個(gè)工作表,第一個(gè)工作表,可以看到前面合并的單元格個(gè)數(shù)都是相同的,我們直接用鼠標(biāo)向下拖就可以簡(jiǎn)單的填充上序號(hào)一列。但是第二個(gè)工作表,可以看到合并的單元格個(gè)數(shù)不相同,是不規(guī)則的,這個(gè)時(shí)候如果直接用鼠標(biāo)向下拖的話,是不能實(shí)現(xiàn)的,會(huì)提示合并單元格個(gè)數(shù)不相同,不能做這個(gè)操作。
2這種情況下怎么辦呢。直接輸入?10個(gè)以?xún)?nèi)是可以的,10個(gè)以上那就不現(xiàn)實(shí)了。我們?cè)谶M(jìn)行講解怎么實(shí)現(xiàn)之前,先講解要用到的一個(gè)函數(shù)counta,counta函數(shù)的用法就是統(tǒng)計(jì)區(qū)域內(nèi)非空單元格的個(gè)數(shù)。下面我們講一下counta的基本用法。我們需要使用counta函數(shù)計(jì)算出下圖標(biāo)注區(qū)域的非空單元格數(shù)量。
3根據(jù)單元格區(qū)域,輸入函數(shù)公式=counta(H2:K5),完成以后點(diǎn)回車(chē)即可得出結(jié)果。大家可以數(shù)數(shù)對(duì)不對(duì)o(* ̄︶ ̄*)o
4基本用法明白以后,我們就來(lái)看下我們?cè)鯓釉诓灰?guī)則合并單元格這里應(yīng)用。我們可以根據(jù)序號(hào)后面一列做為參考,來(lái)計(jì)算后面一類(lèi)的非空單元格個(gè)數(shù)。
5但是這樣還不夠,我們?cè)谳斎雲(yún)^(qū)域的時(shí)候,可以看到前面是起始單元格,后面是要計(jì)算的最后一個(gè)單元格。那么我們?cè)谶@就要想辦法修改一下來(lái)實(shí)現(xiàn)我們需要的功能。我們把起始單元格加上絕對(duì)引用,后面的單元格是依次向下變化的。在第一個(gè)合并單元格內(nèi)輸入函數(shù)公式=COUNTA($B$2:B2)
6我們完成第一個(gè)合并單元格內(nèi)序號(hào)的填充以后,向下拉就會(huì)發(fā)現(xiàn),跟最開(kāi)始直接用鼠標(biāo)向下拖時(shí)提示的是一樣的。
7這個(gè)時(shí)候我們就還需要一個(gè)組合鍵ctrl+回車(chē)enter鍵,實(shí)現(xiàn)一個(gè)功能強(qiáng)制復(fù)制。所以下面我們就結(jié)合強(qiáng)制復(fù)制組合鍵加counta函數(shù)來(lái)實(shí)現(xiàn)序號(hào)的填充。首先選中要填充序號(hào)的整個(gè)區(qū)域。
8然后保持整個(gè)區(qū)域選中的狀態(tài),輸入公式=COUNTA($B$2:B2),公式輸入完成以后,直接按ctrl+回車(chē)鍵組合。好了返回到單元格就可以看到序號(hào)填充完成了。
因?yàn)閺?fù)制的單元格中有些可能是運(yùn)用了公式所得的結(jié)果,所以普通粘貼可能會(huì)導(dǎo)致有些數(shù)據(jù)顯示不出來(lái),你可以選擇“選擇性粘貼”,數(shù)據(jù)應(yīng)該就不會(huì)顯示不了了,步驟如下:
1.選中需復(fù)制的單元格,點(diǎn)擊鼠標(biāo)右鍵,選擇“復(fù)制”
2.再選中需粘貼的單元格,還是點(diǎn)擊鼠標(biāo)右鍵,選擇“選擇性粘貼”
3.在彈出的窗口中,選擇“數(shù)值”,然后按“確認(rèn)”就可以了。
聲明: 本站一切資源均搜集于互聯(lián)網(wǎng)及網(wǎng)友分享,如果侵犯到你的權(quán)益,及時(shí)聯(lián)系我們刪除該資源
本文分類(lèi):本地推廣
瀏覽次數(shù):1024次瀏覽
發(fā)布日期:2023-06-27 18:30:03