jxl導出Excel工具類

jopen 9年前發布 | 6K 次閱讀 Java


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

/**

  • 注意:此工具類只支持解析excel2003,不支持解析高版本的excel,如果解析高版本excel會報如下錯誤:
  • jxl.read.biff.BiffException: Unable to recognize OLE stream
  • 解決方案:將高版本excel文件另存為Excel97-2003工作薄,然后再解析.
  • jxl較poi的好處是跨平臺,因為是用純java編寫,poi雖然功能比jxl強大,但是是基于windows系統的.
  • @author IluckySi
  • @since 20141215 */
    public class JxlUtil {

    private String filePath;

    public String getPath() {

     return filePath;  
    

    }
    public void setPath(String filePath) {

     this.filePath = filePath;  
    

    }

    /**

    • 解析excel文件.
    • @return Map<String, List<List<String>>> */
      public Map<String, List<List<String>>> parse() {
      File file = new File(filePath);
      if(!file.exists() || !file.getName().endsWith(".xls")) {

       try {  
           throw new Exception("要解析的路徑有問題: " + filePath);  
       } catch (Exception e) {  
           e.printStackTrace();  
       }  
      

      }
      Map<String, List<List<String>>> listListMap = new HashMap<String, List<List<String>>>();
      Workbook workBook = null;
      FileInputStream fis = null;
      try {

       fis = new FileInputStream(file);  
       workBook = Workbook.getWorkbook(fis);  
       Sheet[] sheetArray = workBook.getSheets();  
       for(int i = 0; sheetArray != null && i < sheetArray.length; i++) {  
           Sheet sheet = sheetArray[i];  
           List<List<String>> listList = parseSheet(sheet);  
           if(listList != null && listList.size() > 0) {  
               listListMap.put(sheet.getName(), listList);  
           }  
       }  
      

      } catch (BiffException e) {

       System.out.println("解析文件發生異常: " + e);  
      

      } catch (IOException e) {

       System.out.println("解析文件發生異常: " + e);  
      

      } finally {

       try {  
           if(workBook != null) {  
               workBook.close();  
               workBook = null;  
           }  
           if(fis != null) {  
               fis.close();  
               fis = null;  
           }  
       } catch (Exception e) {  
           System.out.println("關閉文件流發生異常: " + e);  
       }  
      

      }
      return listListMap;
      }

      /**

    • 解析sheet,需要注意的地方:合并單元格,
    • 例:如果A6-A12合并了單元格,那么解析excel時,解析類庫只認為A6有值.
    • @param sheet */
      private List<List<String>> parseSheet(Sheet sheet) {
      List<List<String>> listList = new ArrayList<List<String>>();
      int rowCount = sheet.getRows();
      for(int i = 1; i < rowCount; i++) {

       List<String> list = new ArrayList<String>();  
       Cell[] cellArray = sheet.getRow(i);  
       for(int j = 0; cellArray != null && j < cellArray.length; j++) {  
           list.add(cellArray[j].getContents());  
       }  
       listList.add(list);  
      

      }
      return listList;
      }

      /**

    • 將數據源寫入到excel中.
    • 注意:20150211加的寫入方法.
    • @param listListMap
    • @return */
      public boolean write(Map<String, List<List<String>>> listListMap) {
      File file = new File(filePath);
      boolean result = false;
      WritableWorkbook workBook = null;
      FileOutputStream fos = null;
      try {
       fos = new FileOutputStream(file);  
       workBook = Workbook.createWorkbook(fos);  
       int sheetNo = 0;  
       for(Entry<String, List<List<String>>> entry : listListMap.entrySet()) {  
           String key = entry.getKey();  
           List<List<String>> listList = entry.getValue();  
           WritableSheet sheet = workBook.createSheet(key, sheetNo++);  
           for(int i = 0; i < listList.size(); i++) {  
               List<String> list = listList.get(i);  
               for(int j = 0; j < list.size(); j++) {  
                   Label label = new Label(j, i, list.get(j));   
                   sheet.addCell(label);  
               }  
           }  
       }  
       workBook.write();  
       System.out.println("成功寫入文件");  
      
      } catch (Exception e) {
       System.out.println("寫入文件發生異常: " + e);  
      
      } finally {
       try {  
           if(workBook != null) {  
               workBook.close();  
           }   
           if(fos != null) {  
               fos.close();  
           }  
       } catch (IOException e) {  
           System.out.println("關閉文件流發生異常: " + e);  
       }  
      
      }
      return result;
      }
      } </pre>
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!