Java之使用POI教你玩轉(zhuǎn)Excel導入與導出_第1頁
Java之使用POI教你玩轉(zhuǎn)Excel導入與導出_第2頁
Java之使用POI教你玩轉(zhuǎn)Excel導入與導出_第3頁
Java之使用POI教你玩轉(zhuǎn)Excel導入與導出_第4頁
Java之使用POI教你玩轉(zhuǎn)Excel導入與導出_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第Java之使用POI教你玩轉(zhuǎn)Excel導入與導出目錄POI簡介POI依賴文件POI常用類數(shù)據(jù)導出設(shè)置樣式數(shù)據(jù)導入在平時開發(fā)項目時對數(shù)據(jù)的處理肯定是少不了的。對于數(shù)據(jù)處理也是很多程序員比較頭疼的問題,就比如項目中的數(shù)據(jù)是如何添加進去呢?一條一條的錄入?好像又有點不太友好,數(shù)據(jù)多了效率太低了,最關(guān)鍵的是甲方爸爸肯定不會滿意的。

這時我們可以使用POI來操作Excel表格,可以通過POI來把Excel中的數(shù)據(jù)批量導入到數(shù)據(jù)庫中,從而簡化操作,提高效率。反之我們還可以通過POI把數(shù)據(jù)庫中的數(shù)據(jù)導出到Excel表格中。

POI簡介

ApachePOI是Apache軟件基金會的開放源碼函式庫,POI提供API給Java程序?qū)icrosoftOffice格式檔案讀和寫的功能。

POI依賴文件

dependency

groupIdorg.apache.poi/groupId

artifactIdpoi/artifactId

version3.17/version

/dependency

POI常用類

類名說明HSSFWorkbookExcel的文件對象HSSFSheetExcel的表單HSSFRowExcel的行HSSFCellExcel的格子單元HSSFFontExcel字體HSSFDataFormat格子單元的日期格式HSSFHeaderExcel文檔Sheet的頁眉HSSFFooterExcel文檔Sheet的頁腳樣式:HSSFCellStylecell樣式輔助操作包括:HSSFDateUtil日期HSSFPrintSetup打印HSSFErrorConstants錯誤信息表

數(shù)據(jù)導出

首先,理解一下一個Excel的文件的組織形式,一個Excel文件對應(yīng)于一個workbook(HSSFWorkbook),一個workbook可以有多個sheet(HSSFSheet)表單組成,一個sheet是由多個row(HSSFRow)行組成,一個row是由多個cell(HSSFCell)單元格組成。

所以對應(yīng)的操作步驟如下:

用HSSFWorkbook打開或者創(chuàng)建Excel文件對象。用HSSFWorkbook對象返回或者創(chuàng)建Sheet對象。用Sheet對象返回行對象,用行對象得到Cell對象。對Cell對象讀寫。

下面來看一下數(shù)據(jù)導出功能

前臺頁面只需要給出一個跳轉(zhuǎn)到后臺導出方法的鏈接即可。

button導出/button

后臺對應(yīng)導出的方法,代碼如下:

@RequestMapping(value="/export")

@ResponseBody

publicvoidexport(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{

//查詢數(shù)據(jù)庫中的數(shù)據(jù)

ListStaffstaffList=staffService.findAll();

//創(chuàng)建excel的文檔對象

HSSFWorkbookworkbook=newHSSFWorkbook();

//創(chuàng)建員工信息工作薄,表單

HSSFSheetsheet=workbook.createSheet("員工信息");

//在sheet里創(chuàng)建第一行,參數(shù)為行索引(excel的行),從0開始

HSSFRowrow1=sheet.createRow(0);

//創(chuàng)建單元格excel的單元格,參數(shù)為列索引,從0開始

HSSFCellcell=row1.createCell(0);

//設(shè)置單元格內(nèi)容,標題第一行(可以不設(shè)置,根據(jù)項目需求)

cell.setCellValue("員工信息");

//合并單元格CellRangeAddress構(gòu)造參數(shù)依次表示起始行,截至行,起始列,截至列,一行標題合并單元格

sheet.addMergedRegion(newCellRangeAddress(0,0,0,3));

//設(shè)置列名(每列的小標題)

String[]fieldnames={"姓名","部門","年齡","工號"};

//在sheet里創(chuàng)建第二行,第一行設(shè)置了標題

HSSFRowrow2=sheet.createRow(1);

for(inti=0;ifieldnames.length;i++){

row2.createCell(i).setCellValue(fieldnames[i]);//設(shè)置列名

//填充導出的數(shù)據(jù)到Excel中

for(inti=0;istaffList.size();i++){

HSSFRowrows=sheet.createRow(i+2);

HSSFCellcellName=rows.createCell(0);

cellName.setCellValue(staffList.get(i).getName());

HSSFCellcell1Dept=rows.createCell(1);

cell1Dept.setCellValue(staffList.get(i).getDept());

HSSFCellcell1Age=rows.createCell(2);

cell1Age.setCellValue(staffList.get(i).getAge());

HSSFCellcell1Number=rows.createCell(3);

cell1Number.setCellValue(staffList.get(i).getNumber());

//輸出Excel文件

OutputStreamoutput=response.getOutputStream();

response.reset();

//filename可以設(shè)置Excel文件的名稱

response.setHeader("Content-disposition","attachment;filename=staff.xls");

response.setContentType("application/msexcel");

workbook.write(output);

output.close();

注釋怎么清楚,就不用多解釋了吧,(#^.^#)。

導出結(jié)果如下:

設(shè)置樣式

上面導出的內(nèi)容大家也看到了,就是最原始的樣式。其實在導出時我們也可以對其Excel設(shè)置相應(yīng)的樣式。

1、合并單元格

使用HSSFSheet類中的addMergedRegion(CellRangeAddressregion)方法,上面導出也用到過。

參數(shù)CellRangeAddress表示合并的區(qū)域,方法如下:

publicCellRangeAddress(intfirstRow,intlastRow,intfirstCol,intlastCol)

其中參數(shù)依次表示起始行,截至行,起始列,截至列。有興趣的小伙伴可以點進封裝類中看一下。

2、設(shè)置單元格的大小

HSSFSheetsheet=workbook.createSheet("員工信息");//創(chuàng)建工作表(Sheet)

HSSFRowrow=sheet.createRow(1);

HSSFCellcell=row.createCell(1);

cell.setCellValue("張三");

sheet.setColumnWidth(1,256*50);//設(shè)置第一列的寬度,為50個字符寬度

row.setHeightInPoints(50);//設(shè)置一行的高度

setColumnWidth方法和setHeightInPoints方法適合這是部分的樣式,如果需要設(shè)置全部樣式,可以使用HSSFSheet.setDefaultColumnWidth和HSSFSheet.setDefaultRowHeightInPoints方法設(shè)置默認的列寬和行高。

3、設(shè)置單元格樣式

單元格樣式是通過HSSFCellStyle類來設(shè)置的,所以我們需要先得到HSSFCellStyle類

HSSFCellStylestyle=workbook.createCellStyle()

3.1、設(shè)置水平對齊方式

style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中

水平對齊相關(guān)參數(shù)

如果是左側(cè)對齊就是HSSFCellStyle.ALIGN_FILL。如果是居中對齊就是HSSFCellStyle.ALIGN_CENTER。如果是右側(cè)對齊就是HSSFCellStyle.ALIGN_RIGHT。如果是跨列舉中就是HSSFCellStyle.ALIGN_CENTER_SELECTION。如果是兩端對齊就是HSSFCellStyle.ALIGN_JUSTIFY。

3.2、設(shè)置垂直對齊方式

style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中

垂直對齊相關(guān)參數(shù)

如果是靠上就是HSSFCellStyle.VERTICAL_TOP。如果是居中就是HSSFCellStyle.VERTICAL_CENTER。如果是靠下就是HSSFCellStyle.VERTICAL_BOTTOM。如果是兩端對齊就是HSSFCellStyle.VERTICAL_JUSTIFY。

3.3、設(shè)置邊框

style.setBorderTop(HSSFCellStyle.BORDER_DOTTED);//上邊框

style.setBorderBottom(HSSFCellStyle.BORDER_THICK);//下邊框

style.setBorderLeft(HSSFCellStyle.BORDER_DOUBLE);//左邊框

style.setBorderRight(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);//右邊框

style.setTopBorderColor(HSSFColor.RED.index);//上邊框顏色

style.setBottomBorderColor(HSSFColor.BLUE.index);//下邊框顏色

style.setLeftBorderColor(HSSFColor.GREEN.index);//左邊框顏色

style.setRightBorderColor(HSSFColor.PINK.index);//右邊框顏色

3.4、應(yīng)用樣式

//用在某一個單元格中

cell.setCellStyle(cellStyle);

//用在一行中,設(shè)置一行的樣式

row.setRowStyle(cellStyle);

4、設(shè)置字體樣式

字體樣式是通過HSSFFont類來設(shè)置的,所以我們需要先得到HSSFFont類

HSSFFontfont=workbook.createFont()

設(shè)置樣式

font.setFontName("華文行楷");//設(shè)置字體名稱

font.setFontHeightInPoints((short)28);//設(shè)置字號

font.setColor(HSSFColor.RED.index);//設(shè)置字體顏色

font.setUnderline(FontFormatting.U_SINGLE);//設(shè)置下劃線

font.setTypeOffset(FontFormatting.SS_SUPER);//設(shè)置上標下標

font.setStrikeout(true);//設(shè)置刪除線

下劃線選項值:

單下劃線FontFormatting.U_SINGLE雙下劃線FontFormatting.U_DOUBLE會計用單下劃線FontFormatting.U_SINGLE_ACCOUNTING會計用雙下劃線FontFormatting.U_DOUBLE_ACCOUNTING無下劃線FontFormatting.U_NONE

上標下標選項值:

上標FontFormatting.SS_SUPER下標FontFormatting.SS_SUB普通,默認值FontFormatting.SS_NONE

應(yīng)用樣式

//字體也是單元格格式的一部分,所以從屬于HSSFCellStyle

//將字體對象賦值給單元格樣式對象

style.setFont(font);

//將單元格樣式應(yīng)用于單元格

cell.setCellStyle(cellStyle);

數(shù)據(jù)導入

導入數(shù)據(jù)時,頁面需要給出一個選擇文件的標簽,頁面就不多說了,只要有一個上傳的標簽即可。

這是用layui寫的一個簡單的頁面,代碼如下:

styletype="text/css"

#updateFile{

margin:20px0px20px50px;

/style

formid="importForm"method="post"

div

buttontype="button"name="file"id="updateFile"選擇文件/button

/div

div

div

inputid="upload"value="導入"/

ahref="staff/exportmoban"rel="externalnofollow"下載模板/a

/div

/div

/form

scripttype="text/javascript"

layui.use(['form','upload'],function(){

varupload=layui.upload;

upload.render({

elem:'#updateFile',

url:'staff/excelimport',

auto:false,

accept:'file',

exts:'xls|excel|xlsx',

bindAction:'#upload',

done:function(res){//導出成功后回調(diào)

/script

其中下載模板和導出數(shù)據(jù)基本一樣,只需要創(chuàng)建一個Excel給出一條樣式數(shù)據(jù)即可,代碼如下:

@RequestMapping(value="exportmoban")

@ResponseBody

publicvoidexportmoban(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{

//創(chuàng)建excel的文檔對象

HSSFWorkbookworkbook=newHSSFWorkbook();

//創(chuàng)建員工信息工作薄,表單

HSSFSheetsheet=workbook.createSheet("員工信息");

//在sheet里創(chuàng)建第一行,參數(shù)為行索引(excel的行),從0開始

HSSFRowrow1=sheet.createRow(0);

//創(chuàng)建單元格excel的單元格,參數(shù)為列索引,從0開始

HSSFCellcell=row1.createCell(0);

//設(shè)置單元格內(nèi)容,標題第一行(可以不設(shè)置,根據(jù)項目需求)

cell.setCellValue("員工信息");

//合并單元格CellRangeAddress構(gòu)造參數(shù)依次表示起始行,截至行,起始列,截至列,一行標題合并單元格

sheet.addMergedRegion(newCellRangeAddress(0,0,0,3));

//設(shè)置列名(每列的小標題)

String[]fieldnames={"姓名","部門","年齡","工號"};

//在sheet里創(chuàng)建第二行,第一行設(shè)置了標題

HSSFRowrow2=sheet.createRow(1);

for(inti=0;ifieldnames.length;i++){

row2.createCell(i).setCellValue(fieldnames[i]);//設(shè)置列名

//模板數(shù)據(jù)

HSSFRowrow3=sheet.createRow(2);

row3.createCell(0).setCellValue("王五");

row3.createCell(1).setCellValue("軟件部");

row3.createCell(2).setCellValue(“18“);

row3.createCell(3).setCellValue("003");

//輸出Excel文件

OutputStreamoutput=response.getOutputStream();

response.reset();

//filename可以設(shè)置Excel文件的名稱

response.setHeader("Content-disposition","attachment;filename=staff.xls");

response.setContentType("application/msexcel");

workbook.write(output);

output.close();

}

模板下載如圖。

導入數(shù)據(jù),我們只需要選擇一個有數(shù)據(jù)的Excel表格(數(shù)據(jù)格式需要和模板中格式一樣),點擊導入即可。

后臺對應(yīng)導入數(shù)據(jù)的excelimport方法,代碼如下:

@RequestMapping(value="/excelimport")

@ResponseBody

publicbooleanexcelimport(MultipartFilefile){

//實例化工具類

ImportExcelexcelReader=newImportExcel();

try{

InputStreamis=file.getInputStream();

//導入excel

excelReader.readExcelContent(is);

MapInteger,Stringmap=excelReader.readExcelContent(is);

//遍歷數(shù)據(jù)保存

//因為第一行和第二行是標題,所以從2開始

for(inti=2;i=map.size()+1;i++){

String[]scoreArray=map.get(i).split("-");

if(scoreArray.length0){

Stringname=scoreArray[0];

Stringdept=scoreArray[1];

Integerage=Integer.parseInt(scoreArray[2]);

Stringnumber=scoreArray[3];

Staffstaff=newStaff();

staff.setName(name);

staff.setDept(dept);

staff.setAge(age);

staff.setNumber(number);

//保存

staffService.save(staff);

returntrue;

}catch(Exceptione){

e.printStackTrace();

returnfalse;

}

注:如果對數(shù)據(jù)需要做一些效驗的話可以放在for循環(huán)中處理,這里只是寫一個小案例,沒有添加任何效驗,根據(jù)項目需求自己添加。

其中ImportExcel類是一個處理導入的Excel數(shù)據(jù)的封裝類。代碼如下:

importorg.apache.poi.hssf.usermodel.*;

importorg.apache.poi.poifs.filesystem.POIFSFileSystem;

importjava.io.FileInputStream;

importjava.io.FileNotFoundException;

importjava.io.IOException;

importjava.io.InputStream;

importjava.text.SimpleDateFormat;

importjava.util.Date;

importjava.util.HashMap;

importjava.util.Map;

publicclassImportExcel{

privatePOIFSFileSystemfs;

privateHSSFWorkbookwb;

privateHSSFSheetsheet;

privateHSSFRowrow;

*讀取Excel表格表頭的內(nèi)容

*@paramis

*@returnString表頭內(nèi)容的數(shù)組

publicString[]readExcelTitle(InputStreamis){

try{

fs=newPOIFSFileSystem(is);

wb=newHSSFWorkbook(fs);

}catch(IOExceptione){

e.printStackTrace();

sheet=wb.getSheetAt(0);

//得到首行的row

row=sheet.getRow(0);

//標題總列數(shù)

intcolNum=row.getPhysicalNumberOfCells();

String[]title=newString[colNum];

for(inti=0;icolNum;i++){

title[i]=getCellFormatValue(row.getCell((short)i));

returntitle;

*讀取Excel數(shù)據(jù)內(nèi)容

*@paramis

*@returnMap包含單元格數(shù)據(jù)內(nèi)容的Map對象

publicMapInteger,StringreadExcelContent(InputStreamis){

MapInteger,Stringcontent=newHashMapInteger,String

Stringstr="";

try{

fs=newPOIFSFileSystem(is);

wb=newHSSFWorkbook(fs);

}catch(IOExceptione){

//e.printStackTrace();

sheet=wb.getSheetAt(0);

//得到總行數(shù)

introwNum=sheet.getLastRowNum();

//由于第0行和第一行已經(jīng)合并了在這里索引從2開始

row=sheet.getRow(2);

intcolNum=row.getPhysicalNumberOfCells();

//正文內(nèi)容應(yīng)該從第二行開始,第一行為表頭的標題

for(inti=2;i=rowNum;i++){

row=sheet.getRow(i);

intj=0;

while(jcolNum){

str+=getCellFormatValue(row.getCell((short)j)).trim()+"-";

j++;

content.put(i,str);

str="";

returncontent;

*獲取單元格數(shù)據(jù)內(nèi)容為字符串類型的數(shù)據(jù)

*@paramcellExcel單元格

*@returnString單元格數(shù)據(jù)內(nèi)容

privateStringgetStringCellValue(HSSFCellcell){

StringstrCell="";

switch(cell.getCellType()){

caseHSSFCell.CELL_TYPE_STRING:

strCell=cell.getStringCellValue();

break;

caseHSSFCell.CELL_TYPE_NUMERIC:

strCell=String.valueOf(cell.getNumericCellValue());

break;

caseHSSFCell.CELL_TYPE_BOOLEAN:

strCell=String.valueOf(cell.getBooleanCellValue());

break;

caseHSSFCell.CELL_TYPE_BLANK:

strCell="";

break;

default:

strCell="";

break;

if(strCell.equals("")||strCell==null){

return"";

if(cell==null){

return"";

returnstrCell;

*獲取單元格數(shù)據(jù)內(nèi)容為日期類型的數(shù)據(jù)

*@paramcell

*Excel單元格

*@returnString單元格數(shù)據(jù)內(nèi)容

privateStringgetDateCellValue(HSSFCellcell){

Stringresult="";

try{

intcellType=cell.getCellType();

if(cellType==HSSFCell.CELL_TYPE_NUMERIC){

Datedate=cell.getDateCellValue();

result=(date.getYear()+1900)+"-"+(date.getMonth(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論