java处理Excel文件---excel文件的创建,删除,写入,读取

java

这篇文章的代码是我封装的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文件的创建,删除,写入,读取 的全部内容, 来源链接: utcz.com/z/392224.html

回到顶部