使用JAVA读取和写入EXCEL文件

下载地址http://download.csdn.net/detail/u010634066/8302683  下载直接用


首先要下载 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));
       
    }
}


猜你喜欢

转载自blog.csdn.net/u010634066/article/details/42170133