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