小詹小詹

java用POI操作excel——随便写一下,最基础的东西

前两天部门实施在做一个东西,需要把客户放在Excel中的数据导入到Oracle数据库中,我就想着直接写一个模板,必要的时候改一下实体类应该可以解放实施同事的双手,不过在实际写的过程中,还是碰到很多问题,最需要解决的应该是数据类型的问题。

首先说一下和POI相关的导入和导出,这也是在实际应用中用的最多的部分,如果后续有时间话,我会把包括jdbc操作Oracle的代码也贴上来,以后用的时候直接来博客园复制一下。

Excel有两种格式,.xls(07版本以前)和.xlsx(07及之后的版本),在对不同格式的Excel进行操作的时候,写的代码也不同。

先来介绍一下关于这个最基础的内容,就是全部内容都给固定值,这样应该好理解一些,在代码中有详细的注释

  1 package com.bd.excel;
  2 
  3 import java.io.File;
  4 import java.io.FileInputStream;
  5 import java.io.FileNotFoundException;
  6 import java.io.FileOutputStream;
  7 import java.io.IOException;
  8 
  9 import org.apache.poi.hssf.usermodel.HSSFCell;
 10 import org.apache.poi.hssf.usermodel.HSSFRow;
 11 import org.apache.poi.hssf.usermodel.HSSFSheet;
 12 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 13 import org.apache.poi.ss.usermodel.Cell;
 14 import org.apache.poi.ss.usermodel.Row;
 15 import org.apache.poi.ss.usermodel.Sheet;
 16 import org.apache.poi.ss.usermodel.Workbook;
 17 import org.apache.poi.xssf.usermodel.XSSFCell;
 18 import org.apache.poi.xssf.usermodel.XSSFRow;
 19 import org.apache.poi.xssf.usermodel.XSSFSheet;
 20 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 21 
 22 
 23 
 24 
 25 
 26 /*
 27  * Excel导入和导出的工具类
 28  * 
 29  * */
 30 public class ReadExcel {
 31     
 32     
 33     //main方法测试
 34     public static void main(String[] args) throws Exception {
 35         //writeExcel07();
 36         //readExcle07();
 37         //readExcel03and07();
 38         writeExcel07();
 39     }
 40     
 41     
 42     /*
 43      * 读取excel的方法, 07之前的版本,文件类型为.xls
 44      *               07及07之后的版本,文件类型为.xlsx
 45      *               
 46      * */
 47       public static void writeExcel03() throws Exception{
 48           
 49          /* 
 50           * 
 51           * 
 52           * 这是最基本的创建excel的方法,所有的值都给的固定值。
 53           * 
 54           */
 55           //创建新excel文档,07版本之前均可以这么写
 56           HSSFWorkbook workbook = new HSSFWorkbook();
 57           //新建工作表
 58           HSSFSheet sheet = workbook.createSheet("test");
 59           //新建行
 60           HSSFRow row = sheet.createRow(0);
 61           //取第一行第一列
 62           HSSFCell cell = row.createCell(0);
 63           //给第一行第一列赋值
 64           cell.setCellValue("我是谁?");
 65           //将新建的工作表保存到硬盘中
 66           FileOutputStream fos = new FileOutputStream(new File("E:\\testExcel.xls"));
 67           workbook.write(fos);
 68           fos.close();
 69           
 70           
 71           
 72       }
 73       
 74       
 75       public static void readExcle03() throws Exception{
 76           
 77           /*
 78            * 最简单的读取excel的方法,给的值是固定的,可以取出对应表格中任何一个位置的值
 79            * 07之前的版本都可以这么写
 80            * */
 81           
 82           //创建输入流
 83           FileInputStream fis = new FileInputStream(new File("E:\\testExcel.xls"));
 84           //通过构造函数传参
 85           HSSFWorkbook workbook = new HSSFWorkbook(fis);
 86           //获取工作表
 87           HSSFSheet sheet = workbook.getSheetAt(0);
 88           //获取行,方法为getRow()
 89           HSSFRow row = sheet.getRow(0);
 90           //获取单元格,方法为row.getCell()
 91           HSSFCell cell = row.getCell(0);
 92           //获取单元格中的值
 93           String cellvalue = cell.getStringCellValue();
 94           System.out.println(cellvalue);
 95           fis.close();
 96       }
 97       /*
 98        * 在实际应用中,在读取文件的时候,我们不一定确定读取的excel的具体版本,所以,在输入和输出的语句需要添加判断来让其适应不同的版本
 99        * 
100        * */
101       public static void readExcel03and07() throws Exception{
102           //读取文件的路径
103           String filepath = "E:\\testExcel.xls";
104           //判断文件的格式,
105           if(filepath.matches("^.+\\.(?i)((xls)|(xlsx))$")){
106               FileInputStream fis = new FileInputStream(filepath);
107               boolean is03Excel = filepath.matches("^.+\\.(?i)((xls)|(xlsx))$")?true:false;
108               Workbook workbook = is03Excel ? new HSSFWorkbook(fis):new XSSFWorkbook(fis);
109               Sheet sheet = workbook.getSheetAt(0);
110               Row row = sheet.getRow(0);
111               Cell cell = row.getCell(0);
112               System.out.println("第一行第一列的数据是:"+cell.getStringCellValue());
113               
114           }
115       }
116       
117       /*
118        * 创建07及以后excel的写法
119        * 
120        * */
121       public static void writeExcel07() throws Exception{
122           
123           /*
124            * 创建07之后的版本使用的工厂类为XSSFWorkbook
125            * 
126            * */
127           //创建新表格文件
128           XSSFWorkbook workbook = new XSSFWorkbook();
129           //创建新表单
130           XSSFSheet sheet = workbook.createSheet("test07");
131           //创建sheet表单中的行
132           XSSFRow row = sheet.createRow(0);
133           //选取行中对应的列
134           XSSFCell cell = row.createCell(0);
135           //给对应的列中赋值
136           cell.setCellValue("test");
137           //输出创建的文件,存储到硬盘中
138           FileOutputStream fos = new FileOutputStream(new File("E:\\test07.xlsx"));
139           //workbook的write方法调用,不能忘啊
140           workbook.write(fos);
141           fos.close();
142       }
143 }

接下来给出动态的代码,没有结合实体类。其实就是“两个for循环可以干嘛”的答案,两个for循环可以遍历Excel表格啊

package com.bd.excel;

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

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


/*
 * 主要实现的功能:批量导入和导出excel文件中的内容
 * 相当于动态赋值,两个for循环可以干嘛:只要是二维形式的数据,两个for循环就可以读取获取进行赋值。
 * 
 * */
public class ImportAndOutput {
    
    //main方法测试
    public static void main(String[] args) throws Exception {
        //importdata();
        outputdate();
    }
    
    /*
     * importdata:给excel文档中导入数据的方法
     * 
     * */
      public static void importdata() throws Exception{
          //创建一个excel文档,由于不同格式的excel写法不同,这里统一采用xlsx格式,现在用的比较多,对应的版本为07及07之后的版本。
          
          //创建一个新的excel文本
          XSSFWorkbook workbook = new XSSFWorkbook();
          //创建一个sheet工作表:员工信息表,包含的属性:工号,姓名,性别
          XSSFSheet sheet = workbook.createSheet("员工表信息");
          //添加表头对应的信息,把对应的表头信息放到数组headinf中
          String[] headinf = {"工号","姓名","性别"};
          //把表头对应的信息放到表格对应位置
          for(int i = 0;i <headinf.length;i++){
              //读取表格中表头所在的行,即为第一行,下标为0
              XSSFRow row = sheet.createRow(0);
              //把数组中的元素依次放进去
              XSSFCell cell = row.createCell(i);
              System.out.println(headinf[i]);
              cell.setCellValue(headinf[i]);
          }
          /*
           * 开始给后面的表格赋值,双重for,正常情况下,可以把需要放进来的数据放在集合或者数组中,通过集合或数组的长度来获取数据的条数
           * 没有现成的数据,所以要随机生成,数据大小为50条
           * 
           * */
          for(int i = 0;i < 50;i++){
              //读取当前插入数据的行
              XSSFRow row = sheet.createRow(i+1);
              //给读取的行中的列进行赋值
              for(int j = 0;j < 3;j++){
                  //创建对应的列
                  XSSFCell cell = row.createCell(j);
                  //工号生成的规则要依次增加,给工号赋值,从1到50
                  if(j == 0){
                      cell.setCellValue(i+1);
                  }
                  //姓名的生成规则,50个人的名字一样的太多的话,不够美观,所以让其随机生成
                  if(j == 1){
                      int x = (int)(1+Math.random()*(10-1+1));
                      int m = (int)(1+Math.random()*(10-1+1));
                      String[] xing = {"赵","钱","孙","李","周","吴","郑","王","冯","陈"};
                      String[] ming = {"零","一","二","三","四","五","六","七","八","九"};
                      String name = xing[x-1]+ming[m-1];
                      cell.setCellValue(name);
                  }
                  //给性别赋值
                  if(j == 2){
                      int t = (int)(1+Math.random()*(10-1+1));
                      if(t%2 == 0){
                          cell.setCellValue("女");
                      }else{
                          cell.setCellValue("男");
                      }
                  }
              }
          }
          //赋值结束,将内容输出到硬盘中
          FileOutputStream fos = new FileOutputStream(new File("E:\\员工信息表.xlsx"));
          workbook.write(fos);
          fos.close();
          
      }
      
      //outputdata:读取excel表中的数据,读取的模板为刚才生成的excel表格
      public static void outputdate() throws Exception{
          
          //用FileInputStream读入需要读取的文件
          String filepath = "E:\\员工信息表.xlsx";
          File empinf = new File(filepath);
          FileInputStream fis = new FileInputStream(empinf);
          //判断读取的文件的格式
          boolean is03Excel = filepath.matches("^.+\\.(?i)(xls)$");
          //读取工作簿
          Workbook workbook = is03Excel?new HSSFWorkbook(fis):new XSSFWorkbook(fis);
          //读取工作表
          Sheet sheet = workbook.getSheetAt(0);
          //读取表格中的内容
          for(int i = 2;i < sheet.getPhysicalNumberOfRows();i++){
              //获取对应的行
              Row row = sheet.getRow(i);
              //取对应行中每一列的数据
              for(int j = 1;j < row.getPhysicalNumberOfCells();i++){
                  //取该行中的列
                  Cell cell = row.getCell(j);
                  //把对应的值取出来
                  String cellvalue = cell.getStringCellValue();
                  System.out.print(cellvalue);
              }
              System.out.println();
          }
          
         //在控制台输出结果
          //fis.close();
      }
}

这样以后用的话直接把代码拿过去,把相关内容删除,然后写入自己需要的就可以了。

最后,我觉得有必要分享一下需要的jar包,用的是3.17版本的,不是最稳定的3.15

链接地址:http://pan.baidu.com/s/1i4NWOtf     密码:tz7s

posted on 2017-10-26 15:37  小詹小詹  阅读(2536)  评论(0编辑  收藏  举报

导航