A. 如何提高poi讀寫excel文件(同一文件)的效率
我的代碼
//導入普通客戶信息
publicStringimportExcle(){
TEmployeeemployee=(TEmployee)request.getSession().getAttribute(
"employee");
TCustomerInfoc=newTCustomerInfo();
//聲明數據流
InputStreamis=null;
if(employee!=null){
inthang=0;
intlie=0;
if(excel!=null){
try{
//解析excel2007版本文件
is=newFileInputStream(excel);
XSSFWorkbookwork=newXSSFWorkbook(is);
XSSFSheetsheet=work.getSheetAt(0);
introws=sheet.getPhysicalNumberOfRows();
//循環表的行,從第二行開始
for(inti=1;i<rows;i++){
hang=i+1;
c=newTCustomerInfo();
XSSFRowrow=sheet.getRow(i);
if(row==null){//判斷是否為空
continue;
}
//讀取該行的每一列
for(intj=0;j<row.getPhysicalNumberOfCells();j++){
XSSFCellcell=row.getCell(j);
if(cell==null){
continue;
}
if(cell.toString()==null
||"".equals(cell.toString())){
continue;
}
Stringv=Util.getXssfCellValue(cell);
switch(j){//通過列數來判斷對應插如的欄位
case0:
c.setCompanyName(v);
break;
case1:
c.setLinkName(v);
break;
case2:
c.setTell(v);
break;
case3:
c.setTelephone(v);
break;
case4:
c.setPosition(v);
break;
case5:
c.setEmail(v);
break;
case6:
c.setCompanyType(v);
break;
case7:
c.setCustomerType(v);
break;
case8:
c.setCompanyDetail(v);
break;
}
c.setCreateMan(employee.getName());
c.setCreateDate(newDate());
}
customerInfoBiz.addCustomer(c);
}
request.setAttribute("message","導入成功(=^_^=)");
}catch(Exceptione){
System.out.println("進入---解析excel2003版本文件--錯誤拋出");
try{
//解析excel2003版本文件
is=newFileInputStream(excel);
HSSFWorkbookwork=newHSSFWorkbook(is);
HSSFSheetsheet=work.getSheetAt(0);
if(sheet!=null){
introws=sheet.getPhysicalNumberOfRows();
//循環表的行,從第二行開始
for(inti=1;i<rows;i++){
hang=i+1;
c=newTCustomerInfo();
HSSFRowrow=sheet.getRow(i);
if(row==null){//判斷是否為空
continue;
}
//循環表格的列
for(shortj=0;j<row
.getPhysicalNumberOfCells();j++){
HSSFCellcell=row.getCell(j);
if(cell==null){
continue;
}
if(cell.toString()==null||"".equals(cell.toString())){
continue;
}
Stringv=Util.getHssfCellValue(cell);
switch(j){//通過列數來判斷對應插如的欄位
case0:
c.setCompanyName(v);
break;
case1:
c.setLinkName(v);
break;
case2:
c.setTell(v);
break;
case3:
c.setTelephone(v);
break;
case4:
c.setPosition(v);
break;
case5:
c.setEmail(v);
break;
case6:
c.setCompanyType(v);
break;
case7:
c.setCustomerType(v);
break;
case8:
c.setCompanyDetail(v);
break;
}
c.setCreateMan(v);
c.setCreateDate(newDate());
}
customerInfoBiz.addCustomer(c);
}
request.setAttribute("message","導入成功(=^_^=)");
}
}catch(Exceptione1){
request.setAttribute("message","第"+hang+"行,第"
+lie+"列開始導入失敗,請注意導入格式!!");
e1.printStackTrace();
}
}
}
}else{
request.setAttribute("message","登錄超時,請重新登錄!!");
}
//查詢時對象中含有值對查詢有誤
if(customer!=null){
customer=null;
}
returncustomerList();
}
B. poi解析excel2003和2007有沒有辦法是用同樣的方法實現
Poi解析2003時使用的是HSSFCell,而2007的則是
XSSFCell,是完全不同的兩套API
必須先要判斷excel的類型,不過 HSSFWorkbook 和 XSSFWorkbook 實現的介面都漏核散是一樣的Workbook,直接在實氏正例化介面的時候有點區別其他時候沒有任何差異。
比如,剛剛獲取excle文件流,先判斷excel格式確定用03還是07處理類實例化Workbook介面。
view sourceprint?
01.Workbook workbook = null;
02.if(Constants.ImportExport.EXCEL.equals(fileExtension))
03.{
04.workbook = new HSSFWorkbook(fin);
05.}
06.else
07.{
08.workbook = new XSSFWorkbook(fin);
09.}
獲取workbook 後,後續處理Sheet、Row、Cell 統統用介面實現,不用關注返氏03,07差異性。也就是根本不會涉及到 XSSFCell、HSSFCell這些類。
相關類或介面:
view sourceprint?
1.import org.apache.poi.ss.usermodel.Workbook;
2.import org.apache.poi.hssf.usermodel.HSSFWorkbook;
3.import org.apache.poi.xssf.usermodel.XSSFWorkbook;
4.
5.import org.apache.poi.ss.usermodel.Sheet;
6.import org.apache.poi.ss.usermodel.Row;
7.import org.apache.poi.ss.usermodel.Cell;
C. java使用poi解析或處理excel的時候,如何防止數字變成科學計數法的
思路為:為了防止數字變成科學計數法方式表示,在源文件以及java代碼中都用文本的方式去生成和襲察解析excel,具體如下:
1.生成Excel時,設置單元格格式為STRING,即:
//關鍵代碼
HSSFCellcell=newHSSFCell();
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
2.同理,解析察脊的時候,首先要保證源excel文件中該單元格格式是文本類型的,然後在java代碼里用STRING類型去解敗禪滲析:
//關鍵代碼
Stringvalue=cell.getStringCellValue();
D. java poi根據列頭解析excel
這個需要你自己寫方法. 遍歷你毀伏模的表頭行每廳森個單元格的數據
對比你傳的參數 匹配時 返回 該單元格的列號. 然後再用不同的row去get得到的纖緩列號
E. java 用POI處理比較大的word和excel文檔。
java的主要有兩種方法
1、使用POI,這樣的包,直接的是根據office文件的相應規則,進行解析封裝
2、使用jcob這樣的,通過調用office的dll文件,操作
第一種優點:
不需要在環境上安裝office,純java環境,開發文檔較全,使用方便
缺點:
對於office的某些功能,特性兼容不是很全面,但一般的內容也可以滿足
第二種優點:
對於office文件的兼容性良好,和使用word,excel的操作基本上是一樣的
缺點:
由於是通過java調用office來完成,所以需要在環境上安裝office,文檔較少
F. poi解析excel表頭不在一行
原因是POI導轎手純入Excel文件時,讀取的數據少了一行。
如果是使用 XSSFSheet 對象來獲取行數的話,那獲取閉咐行數的方法應該是:
1.XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
2.XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);
3.int row = xssfSheet.getPhysicalNumberOfRows();
而不是使用int rows = xssfSheet.getLastRowNum();來獲薯蠢得行數。