apache---poi讀取和建立excel檔案

happyAliceYu發表於2017-07-21

在專案中遇到需要對excel表進行操作,所以加以整理方便以後使用。


POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。

   Apache POI 是用Java編寫的免費開源的跨平臺的 Java API,Apache POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。POI為“Poor Obfuscation Implementation”的首字母縮寫,意為“可憐的模糊實現”。

   POI可以操作的文件格式有excel,word,powerpoint等,在此介紹POI操作excel的步驟,關於POI操作其他文件的步驟,大家可以參考其他資料。

首先需要去apache poi的官網上下載poi開發包。

一:匯出excel表:

1、首先準備一些poi的jar包

\

2.下面粘一個自己寫的例項

@RequestMapping("/getDetailExcel")  

public void getALlDetail(HttpServletRequest req,HttpServletResponse resp){
       List<DetailRecord> resultList = recordService.getDetail();  //待匯出excel的資料列表

    // 建立Excel文件(宣告一個工作簿)    
       HSSFWorkbook hwb = new HSSFWorkbook();  

    int CountColumnNum =6; //xls.size();       //定義excel表的總列數       
      // sheet 對應一個工作頁,並加以命名    
      HSSFSheet sheet = hwb.createSheet("歷史查詢統計表");   
 //生成一個樣式(可有可無)

 HSSFCellStyle style = wb.createCellStyle();
 
   //樣式字型居中
  style.setAlignment(HSSFCellStyle.ALIGN_CENTER)


//建立第一行(也可以稱為表頭)
  HSSFRowfirstrow= sheet.createRow(0);
//給表頭第一行一次建立單元格
    HSSFCell[] firstcell = new HSSFCell[CountColumnNum];    

//下面是給該表頭每列的標識(名字)

  String[] names = new String[CountColumnNum];    
    names[0] = "序號";  
    names[1] = "企業名稱";        
    names[2] = "納稅人識別號";    
    names[3] = "查詢時間";  
    names[4] = "報告編號";
    names[5] = "歷史報告";
  
   for (int j = 0; j < CountColumnNum; j++) {    
       firstcell[j] = firstrow.createCell(j);    
       firstcell[j].setCellValue(new HSSFRichTextString(names[j]));    
   }

//對待匯出的資料進行遍歷並向表裡新增資料
   for (int i = 0; i <resultList.size(); i++) {   

     DetailRecord record = new DetailRecord();
     record = resultList.get(i);
    // 建立一行    
     HSSFRow row = sheet.createRow(i+1); //其中i+1是從表頭下面一行開始新增資料
     //開始在每一行開始填充資料

  for(int col=0;i<CountColumnNum;col++){
       HSSFCell id = row.createCell(0);   
       id.setCellValue(record.getId()); 
   
        HSSFCell name = row.createCell(1);   
       name.setCellValue(record.getQymc());    
   
        HSSFCell yxsmc = row.createCell(2);    
        yxsmc.setCellValue(record.getJgdm());    
             
        HSSFCell kcm = row.createCell(3); 
        kcm.setCellValue(record.getSeltime());
            
        HSSFCell sd = row.createCell(4);    
        sd.setCellValue(record.getBgbh());
           
        HSSFCell address = row.createCell(5);    
        address.setCellValue(record.getAddress());
   } sheet.autoSizeColumn((short)0); //調整第一列寬度
sheet.setColumnWidth(1, qymcSize*2*200);  //對於中文欄位,要進行特殊調整
// sheet.autoSizeColumn((short)1); //調整第二列寬度
sheet.autoSizeColumn((short)2); //調整第三列寬度
sheet.autoSizeColumn((short)3); //調整第四列寬度

   sheet.autoSizeColumn((short)4); //調整第四列寬度     
   // 建立檔案輸出流,準備輸出電子表格(以下載的形式,如果想要下載到本地的盤,則在建立檔案時將路徑改變即可)    
  try{  
     String filename = "歷史查詢明細表.xls";        //設定下載時客戶端Excel的名稱
     filename = ExcelUtil.encodeFilename(filename, req); 

   //設定響應頭,瀏覽器就知道以什麼檔案格式進行下載  
     resp.setContentType("application/vnd.ms-excel");   
     resp.setHeader("Content-disposition", "attachment;filename=" + filename);   
     OutputStream ouputStream = resp.getOutputStream();   
     hwb.write(ouputStream); 
     ouputStream.close();   
     System.out.println("資料庫匯出成功");    
  }catch(Exception e){  
     e.printStackTrace();
  }    
}

3.合併單元格及自適應寬度調整:

POI是apache提供的一個讀寫Excel文件的開源元件,在操作excel時常要合併單元格,合併單元格的方法是:

sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 2));

自適應列寬度(適合於英文字元欄位):

sheet.autoSizeColumn(1); 

sheet.autoSizeColumn(1, true);

這兩種方式都是自適應列寬度,但是注意這個方法在後邊的版本才提供,poi的版本不要太老。 注意:第一個方法在合併單元格的的單元格並不好使,必須用第二個方法(很適合於解決中文欄位)

sheet.setColumnWidth(m, “列名”.getBytes().length*2*256);

這個方法是計算字串的長度,以便設定列寬,該方法在解決中文的問題上比較好,前面兩種方法對中文不好好用。。。。

還有在自適應寬度的時候,有時候遇到單元格是公式單元格,自適應不起作用,那是因為單元格存的是公式,並不是真正的資料,解決方法:

HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet.getWorkbook());

 

CellValue cell71Val = evaluator.evaluate(cell71);

cell71.setCellValue(cell71Val.getNumberValue());

將格式化後的資料再次set進去,就是真正的值了。


二:把excel表匯出:


相關文章