前两天部门实施在做一个东西,需要把客户放在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. intellij idea 相关设置

    IDEA这么高端的工具之前只是断断续续使用了一下,因为项目的开发都是在eclipse上,每次学习IDEA的使用都得上网搜索半天,今天自己整理一下,方便以后查阅. IDEA版本15.0.4 字体 界面字 ...

  2. Python的闭包和装饰器

    什么是闭包 python中函数名是一个特殊的变量,它可以作为另一个函数的返回值,而闭包就是一个函数返回另一个函数后,其内部的局部变量还被另一个函数引用. 闭包的作用就是让一个变量能够常驻内存. def ...

  3. Linux下Docker快速部署LAMP

    文章目录 拿来即用 获取LAMP LAMP版本 icoty1/lamp:v1.1.0制作过程 获取ubuntu基础镜像 安装依赖 mysql apache/php phpmyadmin 使apache ...

  4. 关于全局变量,static,define和const

        其实按照现在主流的观点,应该尽量少用全局变量和define,尽量多用临时变量,并且用const替换值define,用短小精悍的函数替换函数define.     对这些我倒是也没有什么意见,只 ...

  5. Boost - 从Coroutine2 到Fiber

    Boost - 从Coroutine2 到Fiber 协程引子 我开始一直搞不懂协程是什么,网上搜一搜,(尤其是Golang的goroutine)感觉从概念上听起来有点像线程池,尤其是类似Java的E ...

  6. highcharts的用法

    <script type="text/javascript" src="../js/highcharts.js"></script>&l ...

  7. Java初学者应该注意的学习问题

    作为初学者,在刚开始学习的时候,一定会走很多弯路.但其实很多弯路是不必走的,会浪费很多时间,导致学习效率大打折扣.今天小编给大家讲述一下,作为一个Java初学者,在开始学习的时候应该注意的问题,应该从 ...

  8. java学习--自定义类的实例的大小比较和排序

    我们知道Object类有一个equals方法,用于比较两个对象是否相等 我们只要在自定义类中重写了equals方法(若不重写就是比较两个实例的地址,相当于==)就可以用来比较该类的两个实例是否相等 问 ...

  9. web中ios移动端软键盘收起后,页面内容留白不下滑

    微信里面打开web页面,在ios软键盘收起时,页面键盘位置的内容留白,如下图 这个问题纠结了很久,然后请教了老大(威哥),看到页面老大给出的方案就是代码改变滚动条的位置. 这里就监听键盘收起的事件,来 ...

  10. Redis物理文件结构

    Redis物理文件结构  对于数据库,个人习惯先从物理结构文件入手,整体上看一下有哪些文件,都是什么作用.类似于MySQL,数据文件和配置文件是Redis最基本也是做主要的两个物理文件之一,相比MyS ...