POI 简单读取excel和写入excel

1 POI读取excel

ApachePOI组件是Java操作Microsoft Office办公套件的强大API,其中对WordExcelPowperPoint都有支持,当然使用较多的还是Excel,因为WordPowerPoint用程序动态操作的应用较少。那么本文就结合POI来介绍一下操作Excel的方法。 
    Office 2007
的文件结构完全不同于2003,所以对于两个版本的Office组件,POI有不同的处理API,分开使用即可。首先来说几个Excel的基本概念。对于一个Excel文件,这称为一个工作簿(Workbook),打开Excel之后,在下方会有sheet1/2/3这样的选项卡,点击可以切换到不同的sheet中,这个sheet称作工作表。每个工作表就是我们编辑的区域,这是一张二维表,阿拉伯数字控制行数,从1开始,而程序中还是0,类似数组和集合。字母控制列数,从A开始,Z以后是两个字母控制。对于每一行,我们称为Row,列就是Column,行列可以确定唯一的一个元素,那么就是单元格,称为Cell 

下面从读取Excel开始,首先建立一个Excel 2003以下版本的xls文件。设定几列来看。来存储学生信息的Excel表如下: 

姓名 性别 年龄
张三 20
李四 23
王五 22

 

这里的姓名,性别和班级是文本值,而年龄和成绩是数字值,这在设计对象和处理时要注意区分。那么可以如下设计这个对象:

创建student

package poi_test;

/**

 * 学生类

 * @author Administrator

 *

 */

publicclass student {

    private String name;//姓名

    private String sex;//性别

    privateintage;//年龄

   

    public student(){

      

    }

    public student(String name, String sex, int age){

       this.name=name;

       this.sex=sex;

       this.age=age;

    }

    public String getName() {

       returnname;

    }

    publicvoid setName(String name) {

       this.name = name;

    }

    public String getSex() {

       returnsex;

    }

    publicvoid setSex(String sex) {

       this.sex = sex;

    }

    publicint getAge() {

       returnage;

    }

    publicvoid setAge(int age) {

       this.age = age;

    }

   

    public String getInfo(){

       return"student info:"+name+" "+sex+"  "+age;

    }

   

   

 

}

 

以下读取excel

package poi_test;

 

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;

 

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

 

/**

 * 读取excel

 * @author Administrator

 *

 */

 

publicclass readExcel {

    privatestatic String xls2003="C:\\student.xls";

    privatestatic String xls2007="C:\\student.xlsx";

   

   

    privatestatic List<student> readfromexcel2003(String filePath){

       File excelFile = null;//excel文件对象

       InputStream is = null;//输入流

       String cellStr = null;//单元格的值

       List<student> studentlist = new ArrayList<student>();

       student student = null;

       try{

           excelFile = new File(filePath);

           is = new FileInputStream(excelFile);

           HSSFWorkbook workbook2003 = new HSSFWorkbook(is);//创建excel文件对象

           HSSFSheet sheet = workbook2003.getSheetAt(0);//取出第一个工作表

           int rows = sheet.getLastRowNum();//一共有多少行

           for (int i = 1; i <= rows; i++) {

              //不处理表头所以从1开始

              student = new student();

              HSSFRow row = sheet.getRow(i);// 获取行信息

              if(row==null){

                  continue;

              }

              int cellnums = row.getLastCellNum();//没一行有多少列即多少单元格

              for (int j = 0; j < cellnums; j++) {

                  HSSFCell cell = row.getCell(j);

                  if(cell==null){

                     cellStr = "";

                  }elseif (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {// 对布尔值的处理 

                        cellStr = String.valueOf(cell.getBooleanCellValue()); 

                    } elseif (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {// 对数字值的处理 

                        cellStr = cell.getNumericCellValue() + ""; 

                    } else {

                     cellStr = cell.getStringCellValue();

                  }

                  if(j==0){

                     student.setName(cellStr);

                  }elseif(j==1){

                     student.setSex(cellStr);

                  }else{

                     student.setAge(new Double(cellStr).intValue());

                  }

              }

              studentlist.add(student);

             

           }

       }catch (IOException e) {

           // TODO: handle exception

           e.printStackTrace();

       }finally{

           if(is!=null){

              try{

                  is.close();

              }catch(IOException e){

                  e.printStackTrace();

              }

           }

          

       }

       return studentlist;

    }

   

    publicstaticvoid main(String[] args) {

      

       long start = System.currentTimeMillis(); 

        List<student> list = readfromexcel2003(xls2003); 

        for (student stu : list) { 

            System.out.println(stu.getInfo()); 

        } 

        long end = System.currentTimeMillis(); 

        System.out.println((end - start) + " ms done!"); 

    } 

 

}

 

 

 

 

 

 

2 POI写入excel数据

 

下面来做简单的文件写入,也就是准备输入写入Excel文件,为了演示,直接创建对象,而实际应用中数据可以是来自数据库的。写入文件就是文件解析的逆过程。但POI的组件不是从单元格开始创建文件的,还是从工作簿开始创建,进而创建工作表,行和单元格,最终将整个工作簿写入文件,完成操作。

package poi_test;

 

import java.io.File;

import java.io.FileOutputStream;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

 

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

 

publicclass writeExcel {

   

   

    privatestatic String xls2003="d:\\student.xls";

    privatestatic String xls2007="d:\\student.xlsx";

   

    privatestatic List<student> studentList = null; 

    privatestatic student[] students = new student[4]; 

   

    /**

     * 静态块初始化数据

     */ 

    static { 

        studentList = new ArrayList<student>(); 

        students[0] = new student("张三", "", 23); 

        students[1] = new student("李四", "", 20); 

        students[2] = new student("王五", "", 21); 

        students[3] = new student("赵六", "", 22); 

        studentList.addAll(Arrays.asList(students)); 

    }

    /**

     * 写入excel数据

     * @param filePath

     */

    publicstaticvoid writeExcel2003(String filePath) {

    // 先创建工作簿对象 

        HSSFWorkbook workbook2003 = new HSSFWorkbook(); 

        // 创建工作表对象并命名 

        HSSFSheet sheet = workbook2003.createSheet("学生信息统计表");

        sheet.setDefaultColumnWidth(30);//设置单元格宽度

        sheet.setDefaultRowHeightInPoints(40);//设置单元格默认高度

        HSSFRow row1 = sheet.createRow(0);

        row1.setHeight((short)300);

        HSSFCell nameCellone = row1.createCell(0); 

        nameCellone.setCellValue("姓名"); 

        HSSFCell sexCellone = row1.createCell(1); 

        sexCellone.setCellValue("性别"); 

        HSSFCell ageCellone = row1.createCell(2); 

        ageCellone.setCellValue("年龄");

        for (int i = 1; i <=studentList.size(); i++) {

        // 取出Student对象 

            student student = studentList.get(i-1); 

            // 创建行 

            HSSFRow row = sheet.createRow(i); 

            // 开始创建单元格并赋值 

            HSSFCell nameCell = row.createCell(0); 

            nameCell.setCellValue(student.getName()); 

            HSSFCell sexCell = row.createCell(1); 

            sexCell.setCellValue(student.getSex()); 

            HSSFCell ageCell = row.createCell(2); 

            ageCell.setCellValue(student.getAge()); 

        }

     // 生成文件 

        File file = new File(filePath); 

        FileOutputStream fos = null; 

        try { 

            fos = new FileOutputStream(file); 

            workbook2003.write(fos); 

        } catch (Exception e) { 

            e.printStackTrace(); 

        } finally { 

            if (fos != null) { 

                try { 

                    fos.close(); 

                } catch (Exception e) { 

                    e.printStackTrace(); 

                } 

            } 

        } 

    }

 

    /**

     * @param args

     */

    publicstaticvoid main(String[] args) {

       // TODO Auto-generated method stub

      

       long start = System.currentTimeMillis(); 

       writeExcel2003(xls2003); 

        long end = System.currentTimeMillis(); 

        System.out.println((end - start) + " ms done!"); 

 

    }

 

}

 

猜你喜欢

转载自cfj.iteye.com/blog/2205597