`

Poi对Excel写入和读取

    博客分类:
  • POI
阅读更多
官网上下载最新poi版本
http://poi.apache.org/download.html


// 测试工具
public class Test {
	public static void main(String[] args) throws Exception {

		
		FileUtil util = new ExcelHandleUtil();//创建文件工具对象FileUtil
		
		List<Object> studentList = new ArrayList<Object>();
		Student t = new Student();
		t.setId(1001);
		t.setName("luxi");
		t.setDiscript("dddddddddd");
		studentList.add(t);//创建写入对象集合
		util.exportFile(studentList,"F:\\2013wirte.xls","aaa");//调用方法
		util.parseFile(new File("F:\\2013wirte.xls"),0, new ReadExcelCallback());
	}
}




//实现类
package cn.magicbeans.java.excel;

import java.beans.PropertyDescriptor;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
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.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Font;
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.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelHandleUtil implements FileUtil{

	private boolean invalid = true;

	public void setInvalid(boolean invalid) {
		this.invalid = invalid;
	}

	/**
	 * 解析文件方法
	 * 
	 * @param file
	 *            文件流
	 * @param sheetNum
	 *            文件页
	 * @param callback
	 *            回调函数
	 */
	public void parseFile(File file, int sheetNum, OnExcelContentCallback callback) {
		String ExtensionName = getExtensionName(file.getPath().toString());
		if (ExtensionName.equalsIgnoreCase("xls")) {
			parse2003(file, sheetNum, callback);
		} else if (ExtensionName.equalsIgnoreCase("xlsx")) {
			parse2007(file, sheetNum, callback);
		}
	}
	
	/**
	 * 写入文件方法
	 * 
	 * @param list
	 *            对象集合
	 * @param path
	 *            存储路径
	 * @param sheetNum
	 *            文件页
	 */
	@Override
	public void exportFile(List<Object> list,String path, String sheetNum) throws Exception {
		String ExtensionName = getExtensionName(path);
		if (ExtensionName.equalsIgnoreCase("xls")) {
			exportExcel2003(list,path, sheetNum);
		} else if (ExtensionName.equalsIgnoreCase("xlsx")) {
			exportExcel2007(list,path, sheetNum);
		}
	}
	
	/**
	 * 写入2007版本文件
	 * @param list对象集合
	 * @param path存储路径
	 * @param sheetName页名
	 * @throws Exception
	 */
	public static void exportExcel2007(List<Object> list,String path,String sheetName) throws Exception { // 创建excel文件对象
		XSSFWorkbook wb = new XSSFWorkbook();
		// 创建一个张表
		XSSFSheet sheet = wb.createSheet(sheetName==null?"sheet1":sheetName);
		// 创建第一行
		XSSFRow row1 = sheet.createRow(0);
		Font font = createFonts(wb, Font.BOLDWEIGHT_NORMAL, "宋体", false,(short) 200);
		// 给第一行
		Field[] fields = list.get(0).getClass().getDeclaredFields();
		for(int j=0;j<fields.length;j++){
			Field field = fields[j];
			createXSSFCell(wb, row1, j, field.getName(), font);
		}
		
		// 表示第二行
		int l = 1;
		// 这里将学员的信心存入到表格中
		for (int i = 0; i < list.size(); i++) {
			// 创建二行
			XSSFRow rowData = sheet.createRow(l++);
			Object obj =list.get(i);
			for(int j=0;j<fields.length;j++){
				Field field = fields[j];
				PropertyDescriptor pd = new PropertyDescriptor(field.getName(),	obj.getClass());
				Method getMethod = pd.getReadMethod();// 获得get方法
				Object o = getMethod.invoke(obj);// 执行get方法返回一个Object
				createXSSFCell(wb, rowData, j, o.toString(), font);
			}
		}
		FileOutputStream os = new FileOutputStream(path);
		wb.write(os);
		os.close();
	}
	
	/**
	 * 写入2003版本文件
	 * @param list对象集合
	 * @param path存储路径
	 * @param sheetName页名
	 * @throws Exception
	 */
	public static void exportExcel2003(List<Object> list,String path,String sheetName) throws Exception { // 创建excel文件对象
		HSSFWorkbook wb = new HSSFWorkbook();
		// 创建一个张表
		Sheet sheet = wb.createSheet(sheetName==null?"sheet1":sheetName);
		// 创建第一行
		Row row1 = sheet.createRow(0);
		Font font = createFonts(wb, Font.BOLDWEIGHT_NORMAL, "宋体", false,(short) 200);
		// 给第一行
		Field[] fields = list.get(0).getClass().getDeclaredFields();
		for(int j=0;j<fields.length;j++){
			Field field = fields[j];
			createCell(wb, row1, j, field.getName(), font);
		}
		
		// 表示第二行
		int l = 1;
		// 这里将学员的信心存入到表格中
		for (int i = 0; i < list.size(); i++) {
			// 创建二行
			Row rowData = sheet.createRow(l++);
			Object obj =list.get(i);
			for(int j=0;j<fields.length;j++){
				Field field = fields[j];
				PropertyDescriptor pd = new PropertyDescriptor(field.getName(),	obj.getClass());
				Method getMethod = pd.getReadMethod();// 获得get方法
				Object o = getMethod.invoke(obj);// 执行get方法返回一个Object
				createCell(wb, rowData, j, o.toString(), font);
			}
		}
		FileOutputStream os = new FileOutputStream(path);
		wb.write(os);
		os.close();
	}

	/**
	 * 创建单元格并设置样式,值
	 * 
	 * @param wb
	 * @param row
	 * @param column
	 * @param
	 * @param
	 * @param value
	 */
	public static void createXSSFCell(XSSFWorkbook wb, XSSFRow row, int column,
			String value, Font font) {
		XSSFCell cell = row.createCell(column);
		cell.setCellValue(value);
		CellStyle cellStyle = wb.createCellStyle();
		cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
		cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_BOTTOM);
		cellStyle.setFont(font);
		cell.setCellStyle(cellStyle);
	}
	
	/**
	 * 创建单元格并设置样式,值
	 * 
	 * @param wb
	 * @param row
	 * @param column
	 * @param
	 * @param
	 * @param value
	 */
	public static void createCell(Workbook wb, Row row, int column,
			String value, Font font) {
		Cell cell = row.createCell(column);
		cell.setCellValue(value);
		CellStyle cellStyle = wb.createCellStyle();
		cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
		cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_BOTTOM);
		cellStyle.setFont(font);
		cell.setCellStyle(cellStyle);
	}

	/**
	 * 设置字体
	 * 
	 * @param wb
	 * @return
	 */
	public static Font createFonts(Workbook wb, short bold, String fontName,
			boolean isItalic, short hight) {
		Font font = wb.createFont();
		font.setFontName(fontName);
		font.setBoldweight(bold);
		font.setItalic(isItalic);
		font.setFontHeight(hight);
		return font;
	}

	
	/**
	 * 解析2007excle文件
	 * 
	 * @param file
	 *            文件流
	 * @param sheetNum
	 *            文件页
	 * @param callback
	 *            回调函数
	 */
	public void parse2007(File file, int sheetNum,
			OnExcelContentCallback callback) {
		if (file == null || !file.exists()) {
			if (callback != null) {
				callback.onStop();
			}
			return;
		}
		FileInputStream fis = null;
		if (callback != null) {
			callback.onStart();
		}
		try {
			fis = new FileInputStream(file);
			XSSFWorkbook xwb = new XSSFWorkbook(fis); // 构造 XSSFWorkbook
			XSSFSheet sheet = xwb.getSheetAt(sheetNum); // 读取第一章表格内容
			// 定义 row、cell
			XSSFRow row;
			// 循环输出表格中的从第二行开始内容
			for (int i = sheet.getFirstRowNum(); i <= sheet
					.getPhysicalNumberOfRows(); i++) {
				row = sheet.getRow(i);
				if (row != null) {
					for (int j = row.getFirstCellNum(); j <= row
							.getPhysicalNumberOfCells(); j++) {
						XSSFCell cell = row.getCell(j);
						if (cell != null) {
							String cellValue = null;
							if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) {
								if (DateUtil.isCellDateFormatted(cell)) {
									cellValue = new DataFormatter()
											.formatRawCellContents(
													cell.getNumericCellValue(),
													0, "yyyy-MM-dd HH:mm:ss");
								} else {
									cellValue = String.valueOf(cell
											.getNumericCellValue());
								}
							} else {
								cellValue = cell.toString();
							}

							if (callback != null) {
								callback.onContent(i, j, cellValue);
							}
						}
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		if (callback != null) {
			callback.onStop();
		}
	}

	/**
	 * 解析2003excle文件
	 * 
	 * @param file
	 *            文件流
	 * @param sheetNum
	 *            文件页
	 * @param callback
	 *            回调函数
	 */
	public void parse2003(File file, int sheetNum,
			OnExcelContentCallback callback) {
		// /解析Excel
		// 返回结果集
		if (file == null || !file.exists()) {
			if (callback != null) {
				callback.onStop();
			}
			return;
		}
		FileInputStream fis = null;
		try {
			fis = new FileInputStream(file);
			if (callback != null) {
				callback.onStart();
			}
			HSSFWorkbook wookbook = new HSSFWorkbook(fis); // 创建对Excel工作簿文件的引用
			HSSFSheet sheet = wookbook.getSheetAt(sheetNum); // 在Excel文档中,第一张工作表的缺省索引是0
			int rows = sheet.getPhysicalNumberOfRows(); // 获取到Excel文件中的所有行数;
			// 遍历行&shy;(第1行 表头) 准备Map里的key
			HSSFRow firstRow = sheet.getRow(0);
			int cells = firstRow.getPhysicalNumberOfCells();
			// 遍历行&shy;(从第二行开始)

			for (int i = 0; i < rows; i++) {
				// 读取左上端单元格(从第二行开始)
				HSSFRow row = sheet.getRow(i);
				// 行不为空
				if (row != null) {
					for (int num = 0; num <= cells; num++) {
						HSSFCell cell = row.getCell(num);
						if (!invalid) {
							return;
						}
						String content = null;
						if (null != cell) {
							content = getCellValue(cell);
						}
						if (callback != null) {
							callback.onContent(i, num, content);
						}
					}
				}
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				fis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		if (callback != null) {
			callback.onStop();
		}
	}

	public static String getCellValue(HSSFCell cell) {
		DecimalFormat df = new DecimalFormat("#.#####");
		String cellValue = null;
		if (cell == null)
			return null;
		switch (cell.getCellType()) {
		case HSSFCell.CELL_TYPE_NUMERIC:
			if (HSSFDateUtil.isCellDateFormatted(cell)) {
				SimpleDateFormat sdf = new SimpleDateFormat(
						"yyyy-MM-dd HH:mm:ss");
				cellValue = sdf.format(HSSFDateUtil.getJavaDate(cell
						.getNumericCellValue()));
				break;
			}
			cellValue = df.format(cell.getNumericCellValue());
			break;
		case HSSFCell.CELL_TYPE_STRING:
			cellValue = String.valueOf(cell.getStringCellValue());
			break;
		case HSSFCell.CELL_TYPE_FORMULA:
			cellValue = String.valueOf(cell.getCellFormula());
			break;
		case HSSFCell.CELL_TYPE_BLANK:
			cellValue = null;
			break;
		case HSSFCell.CELL_TYPE_BOOLEAN:
			cellValue = String.valueOf(cell.getBooleanCellValue());
			break;
		case HSSFCell.CELL_TYPE_ERROR:
			cellValue = String.valueOf(cell.getErrorCellValue());
			break;
		}
		if (cellValue != null && cellValue.trim().length() <= 0) {
			cellValue = null;
		}
		return cellValue;
	}

	/**
	 * 文件操作 获取文件扩展名
	 * 
	 * @Author: sunny
	 * @param filename
	 *            文件名称包含扩展名
	 * @return
	 */
	public static String getExtensionName(String filename) {
		if ((filename != null) && (filename.length() > 0)) {
			int dot = filename.lastIndexOf('.');
			if ((dot > -1) && (dot < (filename.length() - 1))) {
				return filename.substring(dot + 1);
			}
		}
		return filename;
	}

	
}

分享到:
评论

相关推荐

    利用POI读取excel写入到word

    要实现"利用POI读取excel写入到word",我们需要以下步骤: 1. **准备环境**:首先,确保你的项目已经引入了Apache POI的依赖。在给定的压缩包中,"poi - 副本"可能是包含POI库的JAR文件,你需要将其添加到你的项目...

    使用POI解析excel文件并写入数据库

    使用poi解析excel文件,并将数据写入到数据库 项目说明 这个项目实现的功能是读取excel文件中的数据,解析并写入数据库。 读取的excel文件位于项目目录下的 excel\0805.xlsx 使用IntelliJ IDEA开发此项目 使用MYSQL...

    Java用POI API实现对Excel表的读取与写入,包含对数据库的读写,亲测有效

    1、POI_EXCEL包下分别有两个类,一个是读取excel内容,一个是想excel写入内容 2、cn.itcast包下的所有包,是为了实现从excel写入到数据库中,和从数据库写入到excel中 注意事项: 1、需要导入maven工程 2、使用...

    使用poi读取、写入复杂excel工具类(包含样式)

    使用poi读取写入复杂excel内容包括样式,工具类

    POI生成Excel POI操作Excel POI读取Excel POI类库

    在这个场景中,我们关注的是如何使用POI来创建、读取和操作Excel文档。在Web项目中,这种功能通常用于数据导入导出,报表生成,或者任何需要与用户交换表格数据的场景。 **POI生成Excel** 生成Excel文件主要涉及...

    Android Excel文件写入和读取

    本文将详细介绍如何在Android中实现Excel文件的读取与写入。 首先,Android系统本身并不直接支持Excel文件的操作,因此我们需要引入第三方库来实现这一功能。常用的库有Apache POI,这是一个用于处理Microsoft ...

    POI读取EXCEL教程

    HPSF(POI OLE 2 Property Set Facility)是POI的一部分,用于读取和写入OLE 2复合文档的属性,包括Excel文件的元数据。这可以帮助获取如作者、创建日期等信息。 七、文档摘要信息 文档摘要信息通常包含在文档的元...

    java+poi+excel读取写入等操作所有jar(最新支持excel2013)Java实用源码整理learns

    Java POI库是Apache软件...总的来说,Java结合Apache POI库提供了强大的Excel处理能力,无论是读取、写入还是进行复杂的格式设置,都能轻松应对。这份源码整理资源对于Java开发者来说,是学习和工作中不可或缺的工具。

    POI实战-java开发excel.rar_Excel写入_JAVA 处理excel_POI_java 写入excel

    POI处理excel文件,主要包括Excel的读取、写入,各种数据格式处理、单元格合并、注释、下拉列表及单元格的边框、背景色、宽度调整等。

    poi读取Excel用到的jar包

    在Java编程环境中,Apache POI库是用于读取和写入Microsoft Office格式文件的强大工具,特别是Excel(.xlsx和.xls)文件。标题提到的“poi读取Excel用到的jar包”指的是在Java项目中使用POI库进行Excel操作所需引入...

    poi读取excel并输出到jsp页面

    在Java开发中,Apache POI库提供了API来读取、写入和操作Excel文件。读取Excel文件时,主要涉及到的工作包括打开工作簿、选择工作表、读取单元格数据等。例如,可以使用以下代码片段打开一个Excel文件: ```java ...

    poi读取excel文件

    在Java编程环境中,Apache POI库是一个非常重要的工具,它允许开发者读取、写入以及修改...总的来说,Apache POI是Java处理Excel文件的强大工具,通过合理利用提供的库和源码示例,可以有效地读取和操作Excel数据。

    操作Excel文件(读取和生成)jxl和poi

    JXL和Apache POI是两个广泛使用的库,分别提供了对Excel文件的读取和生成的支持。本篇文章将深入探讨这两个库的使用方法及其特点。 首先,JXL是一个Java API,主要用于读写Excel 97-2003格式的工作簿,即.xls文件。...

    利用POI解析excel并存入数据库demo

    Apache POI 是一个开源项目,专门用于处理 Microsoft Office 格式的文件,如 Word、Excel 和 PowerPoint。在这个"利用POI解析excel并存入数据库demo"中,我们将关注如何使用 POI 库来读取 Excel 文件,并将数据有效...

    poi excel 模板读取并导出带公式的excel文档

    利用Apache POI库能够实现这一功能,即可以通过Java程序操作Excel文件,包括读取、写入、以及处理Excel中的公式。 #### 二、关键技术点 1. **POI库简介**: - Apache POI是Apache软件基金会的Jakarta项目中的一个...

    解决poi读取excel2007出现内存溢出问题代码参

    以上就是关于如何使用Apache POI的SXSSF API解决读取Excel 2007文件时内存溢出问题的关键知识点。通过这种方式,我们可以处理大文件而不会过度消耗内存,从而提高程序的稳定性和效率。在实际项目中,需要根据具体...

    poi读写excel+poi总结

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel、Word和PowerPoint等。在本文中,我们将深入探讨如何使用POI进行Excel的读写操作,并进行总结。 1. POI基本概念 Apache POI 提供了...

    android POI 读取excel 精简jar

    它支持读取、写入和修改Excel文件,但不支持较新的.xlsx格式。由于它的轻量级特性,对于只需要处理.xls文件的Android应用来说,jxl.jar可能是一个不错的选择。 2. **aa-poi-3.10-min-0.1.5.jar**: 这个文件是Apache...

    导入poi jar包实现使用Beanshell读写Excel文件

    在JMeter测试框架中,我们可以结合使用POI库和BeanShell组件来读取和写入Excel数据,以实现更复杂的测试场景。以下是对这个主题的详细讲解: 首先,Apache POI是一个开源的Java API,它提供了读取、写入和修改MS ...

    poi 读取EXCEL所需要的JAR

    在Java环境中,如果你需要使用POI库来读取、写入或操作Excel文件,你需要确保你的项目中包含了正确的JAR文件。在这个场景中,你提到的几个JAR文件都是Apache POI的不同版本和组件: 1. **poi-3.8.jar**:这是Apache...

Global site tag (gtag.js) - Google Analytics