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

这篇文章的代码是我封装的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类的属性值(数量能够不一样,但拼写和大写和小写必须一致)

时间: 2024-12-04 21:27:42

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

Elasticsearch Java API (二): index创建删除 cluster管理

Elasticsearch Java API (二): index创建删除 cluster管理  elastic官网有权威的java api 英文的 需要耐心看 这里整理下基本操作 创建maven工程添加依赖 <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.2.2</ver

NW.JS File System 文件夹的操作( 创建, 删除, 读取 )

<script type="text/javascript"> /* * 引入File System 模块 */ var fs = require("fs"); /* * 创建文件夹的方法 * mkdir(path, callback(){}) * path: 文件夹所在路径 * callback("错误信息 <成功返回null>"): 回调函数 */ fs.mkdir('./test', function(err){ i

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

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

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

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

java使用POI实现excel文件的读取,兼容后缀名xls和xlsx

需要用的jar包如下: 如果是maven管理的项目,添加依赖如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </depen

Java生成和操作Excel文件

JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表.因为它是使用Java编写的,所以我们在Web应用中可以通过JSP.Servlet来调用API实现对Excel数据表的访问. 下载: 官方网站 http://www.andykhan.com/jexcelapi/ 下载最新版本(本人下的是jexcelapi_2_6

JAVA读、写EXCEL文件

采用jxl.jar包,网上下载,百度一下到出都是.希望可以帮助到大家. 接下来直接贴代码: <span style="font-size:18px;">public List getValue(String fileName){ String str=ExcelOparations.readExcel(fileName).trim(); String[] str4n= str.split("\n"); List list1 = new ArrayList

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

JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表.因为它是使用Java编写的,所以我们在Web应用中可以通过JSP.Servlet来调用API实现对Excel数据表的访问. 下载: 官方网站 http://www.andykhan.com/jexcelapi/ 下载最新版本(本人下的是jexcelapi_2_6

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

在平常应用程序中,对office和pdf文档进行读取数据是比较常见的功能,尤其在很多web应用程序中.所以今天我们就简单来看一下Java对word.excel.pdf文件的读取.本篇博客只是讲解简单应用.如果想深入了解原理.请读者自行研究一些相关源码. 首先我们来认识一下读取相关文档的jar包: 1. 引用POI包读取word文档内容 poi.jar 下载地址 http://apache.freelamp.com/poi/release/bin/poi-bin-3.6-20091214.zip 

Java生成和操作Excel文件 - 残星 - 博客园 (2)

body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI",Tahoma,Helvetica,Sans-Serif,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5;