当前位置: 移动技术网 > IT编程>开发语言>Java > java常用工具类之Excel操作类及依赖包下载

java常用工具类之Excel操作类及依赖包下载

2019年07月22日  | 移动技术网IT编程  | 我要评论

腾冲到大理,另类音乐,十步射一人

依赖包下载:

excel工具类excelutil.java源码:

package com.itjh.javautil;

import java.io.file;
import java.io.fileinputstream;
import java.io.filenotfoundexception;
import java.io.fileoutputstream;
import java.io.ioexception;
import java.io.outputstream;
import java.text.decimalformat;
import java.util.linkedlist;
import java.util.list;

import javax.servlet.http.httpservletresponse;

import org.apache.poi.hssf.usermodel.hssfcell;
import org.apache.poi.hssf.usermodel.hssfrichtextstring;
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.openxml4j.exceptions.invalidformatexception;
import org.apache.poi.ss.usermodel.cell;
import org.apache.poi.ss.usermodel.dateutil;
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.ss.usermodel.workbookfactory;

/**
 * 封装对excel的操作,包括本地读写excel和流中输出excel,支持office 2007。<br/>
 * 依赖于poi-3.9-20121203.jar,poi-ooxml-3.9-20121203.jar,poi-ooxml-schemas-3.9-
 * 20121203.jar,dom4j-1.6.1.jar<br/>
 * 有参构造函数参数为excel的全路径<br/>
 * 
 * @author 宋立君
 * @date 2014年07月03日
 */
public class excelutil {

	// excel文件路径
	private string path = "";

	// 写入excel时,是否自动扩展列宽度来符合内容。
	private boolean autocolumnwidth = false;

	/**
	 * 无参构造函数 默认
	 */
	public excelutil() {
	}

	/**
	 * 有参构造函数
	 * 
	 * @param path
	 *   excel路径
	 */
	public excelutil(string path) {
		this.path = path;
	}

	/**
	 * 读取某个工作簿上的所有单元格的值。
	 * 
	 * @param sheetorder
	 *   工作簿序号,从0开始。
	 * @return list<object[]> 所有单元格的值。
	 * @throws ioexception
	 *    加载excel文件io异常。
	 * @throws filenotfoundexception
	 *    excel文件没有找到异常。
	 * @throws invalidformatexception
	 * @author 宋立君
	 * @date 2014年07月03日
	 */
	public list<object[]> read(int sheetorder) throws filenotfoundexception,
			ioexception, invalidformatexception {
		fileinputstream fis = new fileinputstream(path);
		workbook workbook = workbookfactory.create(fis);
		if (fis != null) {
			fis.close();
		}
		sheet sheet = workbook.getsheetat(sheetorder);
		// 用来记录excel值
		list<object[]> valuelist = new linkedlist<object[]>();
		// 循环遍历每一行、每一列。
		for (row row : sheet) {
			// 每一行
			object[] rowobject = null;
			for (cell cell : row) {
				// cell.getcelltype是获得cell里面保存的值的type
				switch (cell.getcelltype()) {
				case cell.cell_type_boolean:
					// 得到boolean对象的方法
					rowobject = collectionutil.addobjecttoarray(rowobject,
							cell.getbooleancellvalue());
					break;
				case cell.cell_type_numeric:
					// 先看是否是日期格式
					if (dateutil.iscelldateformatted(cell)) {
						// 读取日期格式
						rowobject = collectionutil.addobjecttoarray(rowobject,
								cell.getdatecellvalue());
					} else {
						decimalformat df = new decimalformat();
						// 单元格的值,替换掉,
						string value = df.format(cell.getnumericcellvalue())
								.replace(",", "");
						// 读取数字
						rowobject = collectionutil.addobjecttoarray(rowobject,
								value);
					}
					break;
				case cell.cell_type_formula:
					// 读取公式
					rowobject = collectionutil.addobjecttoarray(rowobject,
							cell.getcellformula());
					break;
				case cell.cell_type_string:
					// 读取string
					rowobject = collectionutil.addobjecttoarray(rowobject, cell
							.getrichstringcellvalue().tostring());
					break;
				}
			}
			// 将这行添加到list。
			valuelist.add(rowobject);
		}
		return valuelist;
	}

	/**
	 * 读取某个工作簿上的某个单元格的值。
	 * 
	 * @param sheetorder
	 *   工作簿序号,从0开始。
	 * @param colum
	 *   列数 从1开始
	 * @param row
	 *   行数 从1开始
	 * @return 单元格的值。
	 * @throws exception
	 *    加载excel异常。
	 * @author 宋立君
	 * @date 2014年07月03日
	 */
	public string read(int sheetorder, int colum, int row) throws exception {
		fileinputstream fis = new fileinputstream(path);
		workbook workbook = workbookfactory.create(fis);
		if (fis != null) {
			fis.close();
		}
		sheet sheet = workbook.getsheetat(sheetorder);
		row rows = sheet.getrow(row - 1);
		cell cell = rows.getcell(colum - 1);
		string content = cell.getstringcellvalue();
		return content;
	}

	/**
	 * 在指定的工作簿、行、列书写值。
	 * 
	 * @param sheetorder
	 *   工作簿序号,基于0.
	 * @param colum
	 *   列 基于1
	 * @param row
	 *   行 基于1
	 * @param content
	 *   将要被书写的内容。
	 * @throws exception
	 *    书写后保存异常。
	 * @author 宋立君
	 * @date 2014年07月03日
	 */
	public void write(int sheetorder, int colum, int row, string content)
			throws exception {
		fileinputstream fis = new fileinputstream(path);
		workbook workbook = workbookfactory.create(fis);
		if (fis != null) {
			fis.close();
		}
		sheet sheet = workbook.getsheetat(sheetorder);
		row rows = sheet.createrow(row - 1);
		cell cell = rows.createcell(colum - 1);
		cell.setcellvalue(content);
		fileoutputstream fileout = new fileoutputstream(path);
		workbook.write(fileout);
		fileout.close();

	}

	/**
	 * 得到一个工作区最后一条记录的序号,相当于这个工作簿共多少行数据。
	 * 
	 * @param sheetorder
	 *   工作区序号
	 * @return int 序号。
	 * @throws ioexception
	 *    根据excel路径加载excel异常。
	 * @throws invalidformatexception
	 * @author 宋立君
	 * @date 2014年07月03日
	 */
	public int getsheetlastrownum(int sheetorder) throws ioexception,
			invalidformatexception {
		fileinputstream fis = new fileinputstream(path);
		workbook workbook = workbookfactory.create(fis);
		if (fis != null) {
			fis.close();
		}
		sheet sheet = workbook.getsheetat(sheetorder);
		return sheet.getlastrownum();
	}

	/**
	 * 在磁盘生成一个含有内容的excel,路径为path属性
	 * 
	 * @param sheetname
	 *   导出的sheet名称
	 * @param fieldname
	 *   列名数组
	 * @param data
	 *   数据组
	 * @throws ioexception
	 * @author 宋立君
	 * @date 2014年07月03日
	 */
	public void makeexcel(string sheetname, string[] fieldname,
			list<object[]> data) throws ioexception {
		// 在内存中生成工作薄
		hssfworkbook workbook = makeworkbook(sheetname, fieldname, data);
		// 截取文件夹路径
		string filepath = path.substring(0, path.lastindexof("\\"));
		// 如果路径不存在,创建路径
		file file = new file(filepath);
		// system.out.println(path+"-----------"+file.exists());
		if (!file.exists())
			file.mkdirs();
		fileoutputstream fileout = new fileoutputstream(path);
		workbook.write(fileout);
		fileout.close();
	}

	/**
	 * 在输出流中导出excel。
	 * 
	 * @param excelname
	 *   导出的excel名称 包括扩展名
	 * @param sheetname
	 *   导出的sheet名称
	 * @param fieldname
	 *   列名数组
	 * @param data
	 *   数据组
	 * @param response
	 *   response
	 * @throws ioexception
	 *    转换流时io错误
	 * @author 宋立君
	 * @date 2014年07月03日
	 */
	public void makestreamexcel(string excelname, string sheetname,
			string[] fieldname, list<object[]> data,
			httpservletresponse response) throws ioexception {
		outputstream os = null;
		response.reset(); // 清空输出流
		os = response.getoutputstream(); // 取得输出流
		response.setheader("content-disposition", "attachment; filename="
				+ new string(excelname.getbytes(), "iso-8859-1")); // 设定输出文件头
		response.setcontenttype("application/msexcel"); // 定义输出类型
		// 在内存中生成工作薄
		hssfworkbook workbook = makeworkbook(sheetname, fieldname, data);
		os.flush();
		workbook.write(os);
	}

	/**
	 * 根据条件,生成工作薄对象到内存。
	 * 
	 * @param sheetname
	 *   工作表对象名称
	 * @param fieldname
	 *   首列列名称
	 * @param data
	 *   数据
	 * @return hssfworkbook
	 * @author 宋立君
	 * @date 2014年07月03日
	 */
	private hssfworkbook makeworkbook(string sheetname, string[] fieldname,
			list<object[]> data) {
		// 用来记录最大列宽,自动调整列宽。
		integer collength[] = new integer[fieldname.length];

		// 产生工作薄对象
		hssfworkbook workbook = new hssfworkbook();
		// 产生工作表对象
		hssfsheet sheet = workbook.createsheet();
		// 为了工作表能支持中文,设置字符集为utf_16
		workbook.setsheetname(0, sheetname);
		// 产生一行
		hssfrow row = sheet.createrow(0);
		// 产生单元格
		hssfcell cell;
		// 写入各个字段的名称
		for (int i = 0; i < fieldname.length; i++) {
			// 创建第一行各个字段名称的单元格
			cell = row.createcell((short) i);
			// 设置单元格内容为字符串型
			cell.setcelltype(hssfcell.cell_type_string);
			// 为了能在单元格中输入中文,设置字符集为utf_16
			// cell.setencoding(hssfcell.encoding_utf_16);
			// 给单元格内容赋值
			cell.setcellvalue(new hssfrichtextstring(fieldname[i]));
			// 初始化列宽
			collength[i] = fieldname[i].getbytes().length;
		}
		// 临时单元格内容
		string tempcellcontent = "";
		// 写入各条记录,每条记录对应excel表中的一行
		for (int i = 0; i < data.size(); i++) {
			object[] tmp = data.get(i);
			// 生成一行
			row = sheet.createrow(i + 1);
			for (int j = 0; j < tmp.length; j++) {
				cell = row.createcell((short) j);
				// 设置单元格字符类型为string
				cell.setcelltype(hssfcell.cell_type_string);
				tempcellcontent = (tmp[j] == null) ? "" : tmp[j].tostring();
				cell.setcellvalue(new hssfrichtextstring(tempcellcontent));

				// 如果自动调整列宽度。
				if (autocolumnwidth) {
					if (j >= collength.length) { // 标题列数小于数据列数时。
						collength = collectionutil.addobjecttoarray(collength,
								tempcellcontent.getbytes().length);
					} else {
						// 如果这个内容的宽度大于之前最大的,就按照这个设置宽度。
						if (collength[j] < tempcellcontent.getbytes().length) {
							collength[j] = tempcellcontent.getbytes().length;
						}
					}
				}
			}
		}

		// 自动调整列宽度。
		if (autocolumnwidth) {
			// 调整列为这列文字对应的最大宽度。
			for (int i = 0; i < fieldname.length; i++) {
				sheet.setcolumnwidth(i, collength[i] * 2 * 256);
			}
		}
		return workbook;
	}

	/**
	 * 功能:设置写入excel时,是否自动扩展列宽度来符合内容,默认为false。
	 * 
	 * @author 宋立君
	 * @date 2014年07月03日
	 * @param autocolumnwidth
	 *   true或者false
	 */
	public void setautocolumnwidth(boolean autocolumnwidth) {
		this.autocolumnwidth = autocolumnwidth;
	}
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网