这篇文章的代码是我封装的excel处理类,包含推断excel是否存在,表格索引是否存在,创建excel文件,删除excel文件,往excel中写入信息,从excel中读取数据。

尤其在写入与读取两个方法中,我採用了java反射机制去实现,以object对象作为參数就可以。代码自己主动解析该实体类的属性与方法。代码重用性高。

代码另一些须要改进和扩展的地方。大家能够依据实际情况进行简单改动。

上代码,首先是我封装的这个类(採用的是POI包):

package module.system.common;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List; 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.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet; /**
* 从excel读取数据/往excel中写入 excel有表头。表头每列的内容相应实体类的属性
*
* @author nagsh
*
*/
public class ExcelManage {
private HSSFWorkbook workbook = null; /**
* 推断文件是否存在.
* @param fileDir 文件路径
* @return
*/
public boolean fileExist(String fileDir){
boolean flag = false;
File file = new File(fileDir);
flag = file.exists();
return flag;
}
/**
* 推断文件的sheet是否存在.
* @param fileDir 文件路径
* @param sheetName 表格索引名
* @return
*/
public boolean sheetExist(String fileDir,String sheetName){
boolean flag = false;
File file = new File(fileDir);
if(file.exists()){ //文件存在
//创建workbook
try {
workbook = new HSSFWorkbook(new FileInputStream(file));
//加入Worksheet(不加入sheet时生成的xls文件打开时会报错)
HSSFSheet sheet = workbook.getSheet(sheetName);
if(sheet!=null)
flag = true;
} catch (Exception e) {
e.printStackTrace();
} }else{ //文件不存在
flag = false;
} return flag;
}
/**
* 创建新excel.
* @param fileDir excel的路径
* @param sheetName 要创建的表格索引
* @param titleRow excel的第一行即表格头
*/
public void createExcel(String fileDir,String sheetName,String titleRow[]){
//创建workbook
workbook = new HSSFWorkbook();
//加入Worksheet(不加入sheet时生成的xls文件打开时会报错)
Sheet sheet1 = workbook.createSheet(sheetName);
//新建文件
FileOutputStream out = null;
try {
//加入表头
Row row = workbook.getSheet(sheetName).createRow(0); //创建第一行
for(int i = 0;i < titleRow.length;i++){
Cell cell = row.createCell(i);
cell.setCellValue(titleRow[i]);
} out = new FileOutputStream(fileDir);
workbook.write(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
/**
* 删除文件.
* @param fileDir 文件路径
*/
public boolean deleteExcel(String fileDir){
boolean flag = false;
File file = new File(fileDir);
// 推断文件夹或文件是否存在
if (!file.exists()) { // 不存在返回 false
return flag;
} else {
// 推断是否为文件
if (file.isFile()) { // 为文件时调用删除文件方法
file.delete();
flag = true;
}
}
return flag;
}
/**
* 往excel中写入(已存在的数据无法写入).
* @param fileDir 文件路径
* @param sheetName 表格索引
* @param object
*/
public void writeToExcel(String fileDir,String sheetName, Object object){
//创建workbook
File file = new File(fileDir);
try {
workbook = new HSSFWorkbook(new FileInputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//流
FileOutputStream out = null;
HSSFSheet sheet = workbook.getSheet(sheetName);
// 获取表格的总行数
int rowCount = sheet.getLastRowNum() + 1; // 须要加一
// 获取表头的列数
int columnCount = sheet.getRow(0).getLastCellNum();
try {
Row row = sheet.createRow(rowCount); //最新要加入的一行
//通过反射获得object的字段,相应表头插入
// 获取该对象的class对象
Class class_ = object.getClass();
// 获得表头行对象
HSSFRow titleRow = sheet.getRow(0);
if(titleRow!=null){
for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { //遍历表头
String title = titleRow.getCell(columnIndex).toString().trim().toString().trim();
String UTitle = Character.toUpperCase(title.charAt(0))+ title.substring(1, title.length()); // 使其首字母大写;
String methodName = "get"+UTitle;
Method method = class_.getDeclaredMethod(methodName); // 设置要运行的方法
String data = method.invoke(object).toString(); // 运行该get方法,即要插入的数据
Cell cell = row.createCell(columnIndex);
cell.setCellValue(data);
}
} out = new FileOutputStream(fileDir);
workbook.write(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 读取excel表中的数据.
*
* @param fileDir 文件路径
* @param sheetName 表格索引(EXCEL 是多表文档,所以须要输入表索引號。如sheet1)
* @param object object
*/
public List readFromExcel(String fileDir,String sheetName, Object object) {
//创建workbook
File file = new File(fileDir);
try {
workbook = new HSSFWorkbook(new FileInputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} List result = new ArrayList();
// 获取该对象的class对象
Class class_ = object.getClass();
// 获得该类的全部属性
Field[] fields = class_.getDeclaredFields(); // 读取excel数据
// 获得指定的excel表
HSSFSheet sheet = workbook.getSheet(sheetName);
// 获取表格的总行数
int rowCount = sheet.getLastRowNum() + 1; // 须要加一
System.out.println("rowCount:"+rowCount);
if (rowCount < 1) {
return result;
}
// 获取表头的列数
int columnCount = sheet.getRow(0).getLastCellNum();
// 读取表头信息,确定须要用的方法名---set方法
// 用于存储方法名
String[] methodNames = new String[columnCount]; // 表头列数即为须要的set方法个数
// 用于存储属性类型
String[] fieldTypes = new String[columnCount];
// 获得表头行对象
HSSFRow titleRow = sheet.getRow(0);
// 遍历
for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { // 遍历表头列
String data = titleRow.getCell(columnIndex).toString(); // 某一列的内容
String Udata = Character.toUpperCase(data.charAt(0))
+ data.substring(1, data.length()); // 使其首字母大写
methodNames[columnIndex] = "set" + Udata;
for (int i = 0; i < fields.length; i++) { // 遍历属性数组
if (data.equals(fields[i].getName())) { // 属性与表头相等
fieldTypes[columnIndex] = fields[i].getType().getName(); // 将属性类型放到数组中
}
}
}
// 逐行读取数据 从1開始 忽略表头
for (int rowIndex = 1; rowIndex < rowCount; rowIndex++) {
// 获得行对象
HSSFRow row = sheet.getRow(rowIndex);
if (row != null) {
Object obj = null;
// 实例化该泛型类的对象一个对象
try {
obj = class_.newInstance();
} catch (Exception e1) {
e1.printStackTrace();
} // 获得本行中各单元格中的数据
for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {
String data = row.getCell(columnIndex).toString();
// 获取要调用方法的方法名
String methodName = methodNames[columnIndex];
Method method = null;
try {
// 这部分可自己扩展
if (fieldTypes[columnIndex].equals("java.lang.String")) {
method = class_.getDeclaredMethod(methodName,
String.class); // 设置要运行的方法--set方法參数为String
method.invoke(obj, data); // 运行该方法
} else if (fieldTypes[columnIndex].equals("int")) {
method = class_.getDeclaredMethod(methodName,
int.class); // 设置要运行的方法--set方法參数为int
double data_double = Double.parseDouble(data);
int data_int = (int) data_double;
method.invoke(obj, data_int); // 运行该方法
}
} catch (Exception e) {
e.printStackTrace();
}
}
result.add(obj);
}
}
return result;
} public static void main(String[] args) {
ExcelManage em = new ExcelManage();
//推断文件是否存在
System.out.println(em.fileExist("E:/test2.xls"));
//创建文件
String title[] = {"id","name","password"};
em.createExcel("E:/test2.xls","sheet1",title);
//推断sheet是否存在
System.out.println(em.sheetExist("E:/test2.xls","sheet1"));
//写入到excel
User user = new User();
user.setId(5);
user.setName("qwer");
user.setPassword("zxcv");
User user3 = new User();
user3.setId(6);
user3.setName("qwerwww");
user3.setPassword("zxcvwww");
em.writeToExcel("E:/test2.xls","sheet1",user);
em.writeToExcel("E:/test2.xls","sheet1",user3);
//读取excel
User user2 = new User();
List list = em.readFromExcel("E:/test2.xls","sheet1", user2);
for (int i = 0; i < list.size(); i++) {
User newUser = (User) list.get(i);
System.out.println(newUser.getId() + " " + newUser.getName() + " "
+ newUser.getPassword());
}
//删除文件
//System.out.println(em.deleteExcel("E:/test2.xls"));
} }

以下是用于測试的一个bean类:

package module.system.common;

public class User {
private int id;
private String name;
private String password; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} }

注意:在创建excel时,须要传入一个包括表头信息的数组,该数组中的内容必须相应bean类的属性值(数量能够不一样,但拼写和大写和小写必须一致)

java处理Excel文件---excel文件的创建,删除,写入,读取的更多相关文章

  1. net8:简易的文件磁盘管理操作一(包括文件以及文件夹的编辑创建删除移动拷贝重命名等)

    原文发布时间为:2008-08-07 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  2. net8:简易的文件磁盘管理操作二(包括文件以及文件夹的编辑创建删除移动拷贝重命名等)

    原文发布时间为:2008-08-07 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  3. java:OutputStream和InputStream 输出输入流,FileOutputStream,FileInputStream写入读取流

    1.在java中stream代表一种数据流(源),javaio的底层数据元,---(想像成水龙头)2.任何有能力产生数据流(源)的javaio对象就可以看作是一个InputStream对象既然它能产生 ...

  4. Java生成和操作Excel文件(转载)

    Java生成和操作Excel文件   JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该A ...

  5. Java生成和操作Excel文件

    JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...

  6. Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

    Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...

  7. java 导出 excel 最佳实践,java 大文件 excel 避免OOM(内存溢出) excel 工具框架

    产品需求 产品经理需要导出一个页面的所有的信息到 EXCEL 文件. 需求分析 对于 excel 导出,是一个很常见的需求. 最常见的解决方案就是使用 poi 直接同步导出一个 excel 文件. 客 ...

  8. java操作office和pdf文件java读取word,excel和pdf文档内容

    在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应 ...

  9. java导入、导出Excel文件

    一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际 ...

  10. java通过poi编写excel文件

    public String writeExcel(List<MedicalWhiteList> MedicalWhiteList) { if(MedicalWhiteList == nul ...

随机推荐

  1. 宏碁宣布Liquid Jade智能机和Leap袖口

    据科技网站Android Community 4月29日覆盖,宏碁29公布的新智能机Liquid Jade而随着智能手镯部署Liquid Leap.尽管宏碁已经宣布了一项新的外部基本信息.但价格格和商 ...

  2. python战斗2:看到一个页面编码

    编程环境:虚拟linux (windows 下 cygwin) 识别网页编码. usage: python coding http://www.***.com 測试结果: watermark/2/te ...

  3. eclipse 于 Tomcat于 热部署 project

    eclipse在 Tomcat中热部署project 1.在eclipse中国安装一个tomcat插件:SysdeoEclipse Tomcat Launcher plugin(http://www. ...

  4. 谈论高并发(二十二)解决java.util.concurrent各种组件(四) 深入了解AQS(二)

    上一页介绍AQS其基本设计思路以及两个内部类Node和ConditionObject实现 聊聊高并发(二十一)解析java.util.concurrent各个组件(三) 深入理解AQS(一) 这篇说一 ...

  5. Windows+Atlassian-Jira-6.0.4+MySql5.0安装破解汉化

     Windows+Atlassian-Jira-6.0.4+MySql5.0安装破解汉化 一:整理的安装程序 例如以下图: 文件太大.上传不到csdn上.有须要的联系. 新增的百度云盘下载:链接: ...

  6. DP:树DP

    The more, The Better Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  7. Windows 7下一个:该应用程序不能正常启动(0xc0150002)

             在新系统中正确安装QQ2010无法执行,同一时候安装的TM2009也无法执行. 相同显示为"应用程序无法正常启动(0xc0150002). 请单击"确定" ...

  8. Echache整合Spring缓存实例讲解(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要介绍了EhCache,并通过整合Spring给出了一个使用实例. 一.EhCac ...

  9. 【SICP读书笔记(四)】练习2.27 --- 表序列reverse的扩展:树结构的deep-reverse

    题目要求是,修改练习2.18所做的reverse过程,得到一个deep-reverse过程.它以一个表为参数,返回另一个表作为值,结果表中的元素反转过来,其中的子树也反转. 例如: (define x ...

  10. 【ThinkingInC++】53、构造函数,析构函数,全局变量

    /** * 图书:[ThinkingInC++] * 特征:构造函数,析构函数,全局变量 * 时刻:2014年9一个月17日本18:07:43 * 笔者:cutter_point */ #includ ...