1. 程式人生 > >使用JAVA讀取和寫入EXCEL檔案

使用JAVA讀取和寫入EXCEL檔案

首先要下載 poi包和jxl包

讀取部分:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;


/**============================================================
 * 版權: 
 * 包: 
 * 修改記錄:
 * 日期                               作者                               內容
 * =============================================================
 * 2014-12-25       shirenchuang        
 * ============================================================*/

/**
 * @author shirenchuang
 *
 */
public class ReadExecl {

    /*private String fileUrl;
   
    public ReadExecl(String fileUrl) {
        // TODO Auto-generated constructor stub
        this.fileUrl = fileUrl;
    }*/
   // File file = new File(fileUrl);
    
    /**

     * 讀取Excel的內容,第一維陣列儲存的是一行中格列的值,二維陣列儲存的是多少個行

     * @param file 讀取資料的源Excel

     * @param ignoreRows 讀取資料忽略的行數,比喻行頭不需要讀入 忽略的行數為1

     * @return 讀出的Excel中資料的內容

     * @throws FileNotFoundException

     * @throws IOException

     */
    
    public static List<String[][]> getData(File file,int ignoreRows) throws IOException{
        //返回所有工作表的資料
        List<String[][]> result = new ArrayList<String[][]>();
        BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
        POIFSFileSystem  fs = new POIFSFileSystem(in);
        HSSFWorkbook wb = new HSSFWorkbook(fs);
        HSSFCell cell = null;
        wb.getNumberOfSheets();
        //多個工作表
        for(int i=0;i<wb.getNumberOfSheets();i++){
            //得到工作表
            HSSFSheet hf = wb.getSheetAt(i);
            //一個工作表的資料   擠得加上1  比如execl加上第一行的列名 總共66  但是getLastRowNum()是65 把列明也算上
            String[][] rowResult = new String[hf.getLastRowNum()+1][7];
            //每個工作表的多行
            for(int rownumber = ignoreRows; rownumber<=hf.getLastRowNum();rownumber++){
                
                
                //得到的row的行數不確定的   如果那一行後面有空格  有可能會忽略空格列
                HSSFRow row = hf.getRow(rownumber);
                if (row == null) {
                    continue;
                }
                //一行的資料
                String[] colResult = new String[row.getLastCellNum()];
                //得到一行的多個列
                /**
                 * 這裡有個問題  就是row.getLastCellNum()有個情況得到的不準確  
                 * 例子:EXECL總共7列資料   但是實際上最後幾列有的為空,它會預設把空的列不計入列值;
                 * 導致的錯誤就是你呼叫寫入方法的時候會有用的列值  會出錯;
                 * 
                 */
                for(short colnumber = 0;colnumber<row.getLastCellNum();colnumber++){
                        String value="";
                    cell=row.getCell(colnumber);
                    //將cell裝換型別
                    if(cell!=null){
                        cell.setEncoding(HSSFCell.ENCODING_UTF_16);
                        switch(cell.getCellType()){
                        case HSSFCell.CELL_TYPE_STRING:
                            value = cell.getStringCellValue();
                            break;
                        case HSSFCell.CELL_TYPE_NUMERIC:
                            if (HSSFDateUtil.isCellDateFormatted(cell)) {

                                Date date = cell.getDateCellValue();

                                if (date != null) {

                                    value = new SimpleDateFormat("yyyy-MM-dd")

                                           .format(date);

                                } else {

                                    value = "";

                                }

                             } else {

                                value = new DecimalFormat("0").format(cell

                                       .getNumericCellValue());

                             }

                             break;
                        case HSSFCell.CELL_TYPE_FORMULA:
                         // 匯入時如果為公式生成的資料則無值

                            if (!cell.getStringCellValue().equals("")) {

                               value = cell.getStringCellValue();

                            } else {

                               value = cell.getNumericCellValue() + "";

                            }

                            break;
                      
                        case HSSFCell.CELL_TYPE_BLANK:

                            break;

                        case HSSFCell.CELL_TYPE_ERROR:

                            value = "";

                            break;

                        case HSSFCell.CELL_TYPE_BOOLEAN:

                            value = (cell.getBooleanCellValue() == true ? "Y"

                                   : "N");

                            break;

                        default:

                            value = "";
                        }//switch
                        
                    }//if
                    if (colnumber == 0 && value.trim().equals("")) {
                       // break;
                     }
                    
                    colResult[colnumber]=rightTrim(value);
                }//for()列
                rowResult[rownumber]=colResult;
            }//for() 行
            if(rowResult!=null)
            result.add(rowResult);
        }//for工作表
        in.close();
        
        return result;
    }
    
    
    /**

     * 去掉字串右邊的空格

     * @param str 要處理的字串

     * @return 處理後的字串

     */

     public static String rightTrim(String str) {

       if (str == null) {

           return "";

       }

       int length = str.length();

       for (int i = length - 1; i >= 0; i--) {

           if (str.charAt(i) != 0x20) {

              break;

           }

           length--;

       }

       return str.substring(0, length);

    }
    
}

寫入部分
import java.io.File;
import java.io.IOException;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;



/**============================================================
 * 版權: 元亨通訊 版權所有 (c) 2002 - 2012
 * 包: 
 * 修改記錄:
 * 日期                               作者                               內容
 * =============================================================
 * 2014-12-25       shirenchuang        
 * ============================================================*/

/**
 * @author shirenchuang
 *
 */
public class WriterExecl {
    private static String writeUrl ="";
    public String getWriteUrl() {
        return writeUrl;
    }


    public void setWriteUrl(String writeUrl) {
        this.writeUrl = writeUrl;
    }


    public WriterExecl(String writeUrl ) {
        // TODO Auto-generated constructor stub
        this.writeUrl= writeUrl;
    }
    
    
    /** 
     *  
     * 這是單純的寫EXCEL表格 
     * **/  
    public static void writeEx(int row,String[][] data){  
        
        WritableWorkbook wwb = null;     
        Label label = null;     
        String file =writeUrl;  
        try {     
            // 建立可寫入的工作簿物件     
           
            wwb = Workbook.createWorkbook(new File(file));     
            if (wwb != null) {     
                // 在工作簿裡建立可寫入的工作表,第一個引數為工作表名,第二個引數為該工作表的所在位置   
                WritableSheet ws = wwb.createSheet("test", 0);     
                if (ws != null) {     
                    /* 新增表結構 */    
                    // 行     
                    for (int i=0;i<row;i++) {     
                        // 列     
                        for (int j=0;j<data[i].length;j++) {     
                            // Label構造器中有三個引數,第一個為列,第二個為行,第三個則為單元格填充的內容  
                            
                            label = new Label(j, i,data[i][j] );     
                            // 將被寫入資料的單元格新增到工作表     
                            ws.addCell(label);     
                        }     
                    }     
                    // 從記憶體中寫入到檔案     
                    wwb.write();     
                }     
                System.out.println("路徑為:" + file + "的工作簿寫入資料成功!");     
            }     
        } catch (Exception e) {     
            System.out.println(e.getMessage());     
        } finally {     
            try {   
                wwb.close();  
            } catch (WriteException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }     
        }     
    }  
}

主方法:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;




public class main {

    public static void main(String[] args) throws IOException{
        ReadExecl re = new ReadExecl();
        File file = new File("C:/Users/Administrator/Desktop/test.xls");
        WriterExecl we = new WriterExecl("C:/Users/Administrator/Desktop/衢州使用者表.xls");
        List<String[][]> result = new ArrayList<String[][]>();
        //不忽略行 從0開始
        result =  re.getData(file, 0);
        //有多少行
        int row = result.get(0).length;

         //寫入  傳入引數row   不傳column  column是不確定的
        we.writeEx(row,result.get(0));
       
    }
}