前两天部门实施在做一个东西,需要把客户放在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——随便写一下,最基础的东西的更多相关文章

  1. java里poi操作excel的工具类(兼容各版本)

    转: java里poi操作excel的工具类(兼容各版本) 下面是文件内具体内容,文件下载: import java.io.FileNotFoundException; import java.io. ...

  2. java使用POI操作excel文件,实现批量导出,和导入

    一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Exc ...

  3. Java POI操作Excel注意点

    excel的行索引和列索引都是从0开始,而行号和列号都是从1开始 POI·操作excel基本上都是使用索引 XSSFRow对象的 row.getLastCellNum() 方法返回的是当前行最后有效列 ...

  4. (一)JAVA使用POI操作excel

    1,Poi 简介 Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能 PO ...

  5. Java使用 POI 操作Excel

    Java中常见的用来操作 Excel 的方式有2种:JXL和POI.JXL只能对 Excel进行操作,且只支持到 Excel 95-2000的版本.而POI是Apache 的开源项目,由Java编写的 ...

  6. JAVA的POI操作Excel

    1.1Excel简介 一个excel文件就是一个工作簿workbook,一个工作簿中可以创建多张工作表sheet,而一个工作表中包含多个单元格Cell,这些单元格都是由列(Column)行(Row)组 ...

  7. Java使用POI操作Excel文件

    1.简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式文件读和写的功能. 2.依赖的jar包 <!-- ex ...

  8. 14、java实现poi操作excel,包括读和写日期格式,并且设置字体样式

    1.首先大家来看导出的结果 下边就是导出的代码了 protected void testExcel() throws IOException{ String path=getServletContex ...

  9. Java 使用POI操作EXCEL及测试框架搭建、测试开发的一些想法

    无论是UI自动化测试还是接口自动化测试都需要进行数据驱动,一般很常见的一种方式就是用excel来管理数据,那么就涉及到一些代码对EXCEL的操作,之前我们介绍过用CSV来处理EXCEL,但是它的功能还 ...

随机推荐

  1. rest_framework目录

    一  REST API规范 二  rest framework框架的基本使用

  2. zk开机自动启动脚本

    [Unit] Description=Zookeeper service After=network.target [Service] User=www Group=www SyslogIdentif ...

  3. directive

    var myModule = angular.module(...); myModule.directive('directiveName', function factory(injectables ...

  4. centos7配置网易yum源

    部分参考centos6: https://blog.csdn.net/jinzhencs/article/details/53673999 下载yum:  https://www.cnblogs.co ...

  5. PyCharm 服务器激活地址

    http://www.cnblogs.com/littlehb/p/7784517.html

  6. vim 批量替换使用说明

    基本语法: :[addr]s/源字符串/目的字符串/[option] 全局替换命令: :%s/源字符串/目的字符串/g [addr] 表示检索范围,省略时表示当前行. "1,20" ...

  7. React props

    class WebSite extends React.Component { constructor() { super(); this.state = { name: "菜鸟教程&quo ...

  8. MM-分割评估

    SAP MM分割评估 https://blog.csdn.net/kangliujie/article/details/76681333 SAP MM批次管理分割评估 https://blog.csd ...

  9. list<T>升序、降序

    List<test> list = new List<test> (); var result = list.OrderByDescending(p => p.we).T ...

  10. mysql--构造数据、导入导出

    一.mysql造数据脚本     DELIMITER $$ DROP PROCEDURE IF EXISTS `test3`$$ CREATE     /*[DEFINER = { user | CU ...