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
java用POI操作excel——随便写一下,最基础的东西的更多相关文章
- java里poi操作excel的工具类(兼容各版本)
转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...
- java使用POI操作excel文件,实现批量导出,和导入
一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...
- Java POI操作Excel注意点
excel的行索引和列索引都是从0开始,而行号和列号都是从1开始 POI·操作excel基本上都是使用索引 XSSFRow对象的 row.getLastCellNum() 方法返回的是当前行最后有效列 ...
- (一)JAVA使用POI操作excel
1,Poi 简介 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能 PO ...
- Java使用 POI 操作Excel
Java中常见的用来操作 Excel 的方式有2种:JXL和POI.JXL只能对 Excel进行操作,且只支持到 Excel 95-2000的版本.而POI是Apache 的开源项目,由Java编写的 ...
- JAVA的POI操作Excel
1.1Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组 ...
- Java使用POI操作Excel文件
1.简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式文件读和写的功能. 2.依赖的jar包 <!-- ex ...
- 14、java实现poi操作excel,包括读和写日期格式,并且设置字体样式
1.首先大家来看导出的结果 下边就是导出的代码了 protected void testExcel() throws IOException{ String path=getServletContex ...
- Java 使用POI操作EXCEL及测试框架搭建、测试开发的一些想法
无论是UI自动化测试还是接口自动化测试都需要进行数据驱动,一般很常见的一种方式就是用excel来管理数据,那么就涉及到一些代码对EXCEL的操作,之前我们介绍过用CSV来处理EXCEL,但是它的功能还 ...
随机推荐
- rest_framework目录
一 REST API规范 二 rest framework框架的基本使用
- zk开机自动启动脚本
[Unit] Description=Zookeeper service After=network.target [Service] User=www Group=www SyslogIdentif ...
- directive
var myModule = angular.module(...); myModule.directive('directiveName', function factory(injectables ...
- centos7配置网易yum源
部分参考centos6: https://blog.csdn.net/jinzhencs/article/details/53673999 下载yum: https://www.cnblogs.co ...
- PyCharm 服务器激活地址
http://www.cnblogs.com/littlehb/p/7784517.html
- vim 批量替换使用说明
基本语法: :[addr]s/源字符串/目的字符串/[option] 全局替换命令: :%s/源字符串/目的字符串/g [addr] 表示检索范围,省略时表示当前行. "1,20" ...
- React props
class WebSite extends React.Component { constructor() { super(); this.state = { name: "菜鸟教程&quo ...
- MM-分割评估
SAP MM分割评估 https://blog.csdn.net/kangliujie/article/details/76681333 SAP MM批次管理分割评估 https://blog.csd ...
- list<T>升序、降序
List<test> list = new List<test> (); var result = list.OrderByDescending(p => p.we).T ...
- mysql--构造数据、导入导出
一.mysql造数据脚本 DELIMITER $$ DROP PROCEDURE IF EXISTS `test3`$$ CREATE /*[DEFINER = { user | CU ...