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

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

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

Excel有两种格式,.xls(07版本以前)和.xlsx(07及之后的版本),在对不同格式的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.HSSFCell;
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.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导入和导出的工具类
*
* */
public class ReadExcel { //main方法测试
public static void main(String[] args) throws Exception {
//writeExcel07();
//readExcle07();
//readExcel03and07();
writeExcel07();
} /*
* 读取excel的方法, 07之前的版本,文件类型为.xls
* 07及07之后的版本,文件类型为.xlsx
*
* */
public static void writeExcel03() throws Exception{ /*
*
*
* 这是最基本的创建excel的方法,所有的值都给的固定值。
*
*/
//创建新excel文档,07版本之前均可以这么写
HSSFWorkbook workbook = new HSSFWorkbook();
//新建工作表
HSSFSheet sheet = workbook.createSheet("test");
//新建行
HSSFRow row = sheet.createRow(0);
//取第一行第一列
HSSFCell cell = row.createCell(0);
//给第一行第一列赋值
cell.setCellValue("我是谁?");
//将新建的工作表保存到硬盘中
FileOutputStream fos = new FileOutputStream(new File("E:\\testExcel.xls"));
workbook.write(fos);
fos.close(); } public static void readExcle03() throws Exception{ /*
* 最简单的读取excel的方法,给的值是固定的,可以取出对应表格中任何一个位置的值
* 07之前的版本都可以这么写
* */ //创建输入流
FileInputStream fis = new FileInputStream(new File("E:\\testExcel.xls"));
//通过构造函数传参
HSSFWorkbook workbook = new HSSFWorkbook(fis);
//获取工作表
HSSFSheet sheet = workbook.getSheetAt(0);
//获取行,方法为getRow()
HSSFRow row = sheet.getRow(0);
//获取单元格,方法为row.getCell()
HSSFCell cell = row.getCell(0);
//获取单元格中的值
String cellvalue = cell.getStringCellValue();
System.out.println(cellvalue);
fis.close();
}
/*
* 在实际应用中,在读取文件的时候,我们不一定确定读取的excel的具体版本,所以,在输入和输出的语句需要添加判断来让其适应不同的版本
*
* */
public static void readExcel03and07() throws Exception{
//读取文件的路径
String filepath = "E:\\testExcel.xls";
//判断文件的格式,
if(filepath.matches("^.+\\.(?i)((xls)|(xlsx))$")){
FileInputStream fis = new FileInputStream(filepath);
boolean is03Excel = filepath.matches("^.+\\.(?i)((xls)|(xlsx))$")?true:false;
Workbook workbook = is03Excel ? new HSSFWorkbook(fis):new XSSFWorkbook(fis);
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0);
Cell cell = row.getCell(0);
System.out.println("第一行第一列的数据是:"+cell.getStringCellValue()); }
} /*
* 创建07及以后excel的写法
*
* */
public static void writeExcel07() throws Exception{ /*
* 创建07之后的版本使用的工厂类为XSSFWorkbook
*
* */
//创建新表格文件
XSSFWorkbook workbook = new XSSFWorkbook();
//创建新表单
XSSFSheet sheet = workbook.createSheet("test07");
//创建sheet表单中的行
XSSFRow row = sheet.createRow(0);
//选取行中对应的列
XSSFCell cell = row.createCell(0);
//给对应的列中赋值
cell.setCellValue("test");
//输出创建的文件,存储到硬盘中
FileOutputStream fos = new FileOutputStream(new File("E:\\test07.xlsx"));
//workbook的write方法调用,不能忘啊
workbook.write(fos);
fos.close();
}
}

接下来给出动态的代码,没有结合实体类。其实就是“两个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

上一篇:实现一个最简单的VIM文本编辑器(可能有bug,随便写了一个)


下一篇:[锋利的JQ]-超链接提示效果