`

POI操作Excel文件

 
阅读更多

1. ExcelBean.java

package com.wyy.snail.core.util;

import java.util.ArrayList;
import java.util.List;
/**
 * Excel数据bean
 * @author penghy
 * @date 2014-02-24
 */
public class ExcelBean<T> {

	private String excelName; //Excel文件名称
	
	private String sheetName; //sheet名称
	
	private List<Column> columns; //excel列名称

	private List<T> rowDatas; //excel数据

	
	
    public String getExcelName() {
		return excelName;
	}

	public void setExcelName(String excelName) {
		this.excelName = excelName;
	}

	public String getSheetName() {
		return sheetName;
	}

	public void setSheetName(String sheetName) {
		this.sheetName = sheetName;
	}

	public List<Column> getColumns() {
		if(columns == null){
			columns = new ArrayList<Column>();
		}
		return columns;
	}

	public void setColumns(List<Column> columns) {
		this.columns = columns;
	}
	
	public void addColumn(Column column){
		if(columns == null){
			columns = new ArrayList<Column>();
		}
		columns.add(column);
	}
	
	public void addColumn(String name, String explain){
		Column column = new Column(name, explain);
		this.addColumn(column);
	}
	
	public List<T> getRowDatas() {
		return rowDatas;
	}


	public void setRowDatas(List<T> rowDatas) {
		this.rowDatas = rowDatas;
	}
	
}

class Column{
	String name; //列名称
	String explain; //列对应的解释
	
	public Column(String name, String explain) {
		this.name = name;
		this.explain = explain;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getExplain() {
		return explain;
	}
	public void setExplain(String explain) {
		this.explain = explain;
	}
	
	
}

 

2. ExcelUtils.java

package com.wyy.snail.core.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
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.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils;
import com.snail.base.utils.DateUtils;

/**
 * Excel操作工具类, 需要依赖以下jar
 *     
    <dependency>
       <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-scratchpad</artifactId>
        <version>3.9</version>
        <type>jar</type>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml-schemas</artifactId>
        <version>3.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.9</version>
    </dependency>
 * @author penghy
 * @date 2014-02-24
 */
public abstract class ExcelUtils {

	private static final int HEADER_DATA_INDEX = 0;
	
	private static final int ROW_DATA_INDEX = 1;
	
	private static final String DEFAULT_EXCEL_NAME = "workbook.xls";
	
	private static final String DEFAULT_SHEET_NAME = "sheet1";
	
	/**
	 * 读取Excel内容,兼容excel2003,excele2007版本
	 * @param filePath
	 * @return
	 */
	public static List<Map<Integer,String>> readExcel(String filePath){
		FileInputStream in = null;
		try {
			in = new FileInputStream(new File(filePath));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		Workbook wb = createWorkbook(in);
		return readExcel(wb);
	}
	
	
	/**
	 * 读取Excel内容,兼容excel2003,excele2007版本
	 * @param in
	 * @param isExcel2003
	 * @return
	 */
	public static List<Map<Integer,String>> readExcel(InputStream in){
		Workbook wb = createWorkbook(in);
		return readExcel(wb);
	}
	
	/**
	 * 读取Excel内容
	 * @param wb
	 * @return
	 */
	public static List<Map<Integer,String>> readExcel(Workbook wb){
		List<Map<Integer,String>> dataList = new ArrayList<Map<Integer,String>>();  
		Sheet sheet = wb.getSheetAt(0); 
		int rows = sheet.getPhysicalNumberOfRows();
		for(int rowIndex=0; rowIndex< rows; rowIndex++){
			Row row = sheet.getRow(rowIndex);
			int cells = row.getPhysicalNumberOfCells();
			Map<Integer,String> cellMap = new HashMap<Integer,String>(cells);
			for(int cellIndex=0; cellIndex<cells; cellIndex++){
				Cell cell = row.getCell(cellIndex);
				cellMap.put(cellIndex, getStringCellValue(cell));
			}
			dataList.add(cellMap);
		}
		
		return dataList;
	}
	
	
	/**
     * 获取单元格数据内容为字符串类型的数据 
     * @param cell Excel单元格
     * @return String 单元格数据内容
     */
    private static String getStringCellValue(Cell cell) {
        String strCell = "";
        switch (cell.getCellType()) {
        case HSSFCell.CELL_TYPE_STRING:
            strCell = cell.getStringCellValue();
            break;
        case HSSFCell.CELL_TYPE_NUMERIC:
        	if (HSSFDateUtil.isCellDateFormatted(cell)) {    
                SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                Date dt = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());   
                strCell = dateformat.format(dt); 
            }else{ 
            	DecimalFormat df = new DecimalFormat("0");    
                strCell = df.format(cell.getNumericCellValue()); 
            }
        	break;
        case HSSFCell.CELL_TYPE_BOOLEAN:
            strCell = String.valueOf(cell.getBooleanCellValue());
            break;
        case HSSFCell.CELL_TYPE_BLANK:
            strCell = "";
            break;
        default:
            strCell = "";
            break;
        }
        return strCell;
    }
	
	/**
	 * 创建Workbook
	 * @param in
	 * @param isExcel2003
	 * @return
	 */
	public static Workbook createWorkbook(InputStream in){
		if(in == null){
			throw new IllegalArgumentException("File InputStream is null, please check!");
		}
		Workbook wb = null;
		try {
			wb = WorkbookFactory.create(in);
		} catch (InvalidFormatException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
		return wb;
	}
	
	
	/**
	 * 创建excel
	 * @param excelBean
	 * @return InputStream
	 */
	public static <T> InputStream createExcel(ExcelBean<T> excelBean){
		 //创建excel工作簿 
         Workbook wb = new HSSFWorkbook(); 
         //创建第一个sheet
         Sheet sheet = wb.createSheet(StringUtils.hasText(excelBean.getSheetName())
        		                      ? excelBean.getSheetName() : DEFAULT_SHEET_NAME); 
         
         //设置excel header标题
         setHeaderData(sheet, excelBean.getColumns());
        
         //设置excel内容数据
         setRowData(sheet, excelBean);
         
         //转化excel文件到输入流
         InputStream is = null;
         ByteArrayOutputStream os = new ByteArrayOutputStream();
 		 try {
 			 wb.write(os);
 	 		 is = new ByteArrayInputStream(os.toByteArray());
 		 } catch (IOException e) {
 			e.printStackTrace();
 		 } finally{
 			try {
				os.close();
			} catch (IOException e) {
				e.printStackTrace();
			} 
 		 }
 		 
	 	 return is;
	}
	
	/**
	 * 创建并且下载excel
	 * @param excelBean
	 * @param response
	 */
	public static <T> void createAndDowloadExcel(ExcelBean<T> excelBean, HttpServletResponse response){
		 BufferedInputStream bis = null;
		 BufferedOutputStream bos = null; 
         try {  
             bis = new BufferedInputStream(createExcel(excelBean));  
             bos = new BufferedOutputStream(response.getOutputStream());// 取得输出流  
             response.reset();// 清空输出流  
             String filename = StringUtils.hasText(excelBean.getExcelName()) ? 
            		 excelBean.getExcelName()+".xls" : DEFAULT_EXCEL_NAME;
             response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));// 设定输出文件头  
             response.setContentType("application/x-download");  
             byte[] buffer = new byte[8192];  
             int len = 0;  
             while ((len = bis.read(buffer, 0, buffer.length)) != -1) {  
                 bos.write(buffer, 0, len);  
             }   
         }catch (IOException e) {  
            e.printStackTrace();
         }finally{
        	 try {
				bis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
        	 try {
				bos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
         }
	}
	
	/**
	 * 设置excel header
	 * @param sheet
	 * @param columns
	 */
	private static void setHeaderData(Sheet sheet, List<Column> columns){
         //设置excel的header
         Row row = sheet.createRow(HEADER_DATA_INDEX); 
         for(int i=0; i< columns.size(); i++){
       	    Column column = columns.get(i);
       	    row.createCell(i).setCellValue(column.getExplain());
         }
	}
	
	/**
	 * 设置excel内容
	 * @param sheet
	 * @param excelBean
	 */
	private static <T> void setRowData(Sheet sheet, ExcelBean<T> excelBean){
		int rowIndex = ROW_DATA_INDEX;
		List<T> rowDatas = excelBean.getRowDatas();
		for(T obj : rowDatas)
		{
			 Row row = sheet.createRow(rowIndex++); 
			 //输出excel内容
			 List<Column> columns = excelBean.getColumns();
	         for(int i=0; i< columns.size(); i++)
	         {
	       	    Column column = columns.get(i);
	       	    Object value = getFieldValue(column.getName(),obj);
	       	    Cell cell = row.createCell(i);
	       	    setCellValue(cell, value);
	         }
		}
	}
	
	/**
	 * 获取属性名称对应的值
	 * @param fieldName
	 * @param obj
	 * @return
	 */
	private static <T> Object getFieldValue(String fieldName, T obj){
		Field field = ReflectionUtils.findField(obj.getClass(), fieldName);
		if(field == null){
			return null;
		}
		field.setAccessible(true);
		return ReflectionUtils.getField(field, obj);
	}
	
	/**
	 * 设置cell的内容
	 * @param cell
	 * @param value
	 */
	private static void setCellValue(Cell cell, Object value){
		if(value == null){
			cell.setCellValue("");
			return;
		}
		Class<?> cls = value.getClass();
		if(cls.equals(Byte.class) || cls.equals(Short.class) 
				|| cls.equals(Integer.class) || cls.equals(Long.class) 
				|| cls.equals(Float.class) || cls.equals(Double.class)){
			cell.setCellValue(Double.parseDouble(value.toString()));
		}else if(cls.equals(Boolean.class)){
			cell.setCellValue(Boolean.parseBoolean(value.toString()));
		}else if(cls.equals(Date.class)){
			cell.setCellValue(DateUtils.getDatetimeToString((Date)value));
		}else if(cls.equals(Calendar.class)){
			cell.setCellValue(DateUtils.getDatetimeToString(((Calendar)value).getTime()));
		}else{
			cell.setCellValue(value.toString());
		}
	}

    public static void main(String[] args){
    	//从excel读取数据
    	List<Map<Integer,String>> list = readExcel("d:/test.xlsx");
    	for(Map<Integer,String> m : list){
    		System.out.println(m.get(0)+" "+m.get(1)+","+m.get(2));
    	}
    	
    	
    }
}

 

分享到:
评论

相关推荐

    POI操作EXCEL文件

    - `java的POI操作Excel文件.doc`:这可能是另一个教程,讲解如何使用POI进行Excel文件的创建、修改和保存操作。 - `poi的常用api_收藏.pdf`:这份资料可能收集了POI库中常用的API方法,并提供了一些示例代码供参考...

    poi操作Excel文件jar包

    "poi操作Excel文件jar包"指的是包含Apache POI库的Java归档(JAR)文件,可以集成到Java项目中以实现Excel文件的处理功能。 1. **Apache POI 简介** Apache POI 是Apache软件基金会的一个顶级项目,最初由Markus ...

    java的POI操作Excel文件.doc

    ### Java的POI操作Excel文件知识点详解 #### 一、POI简介与应用场景 Apache POI 是一个开源项目,由 Apache 软件基金会维护,主要用于处理 Microsoft Office 格式的文件,尤其是 Excel 和 Word 文件。POI 提供了一...

    java的POI操作Excel文件.docx

    【标题】:Java的POI操作Excel文件 【描述】:在企业级开发中,有时我们需要处理Excel文件,例如根据客户需求生成报表或者读取数据。Java的POI库提供了这样的功能,它允许开发者在Java环境中操作Microsoft Office的...

    Apache poi 操作 excel 文件压缩包

    5. **poi-examples**: 包含了使用Apache POI API的示例代码,可以帮助开发者理解如何实际操作Excel文件。 6. **poi-excelant**: 提供了用于构建和执行Ant任务的工具,这些任务与Excel操作有关,例如创建或处理Excel...

    java的POI操作Excel文件.pdf

    在Java环境中,使用POI操作Excel文件的好处在于其跨平台性和代码的可移植性。与.NET框架相比,J2EE提供了更广泛的应用场景和更好的开放性。通过POI,开发者可以在服务器端生成Excel报表,避免了在客户端处理敏感数据...

    poi操作excel文件的源代码

    poi操作excel文件的源代码 主要包括4个函数 1、poiWrite 向excel文件写入“姓名”两个字 2、poiWriteCopy 读取一个指定文件内容,写入另一个文件; 3、poiCopy2 读取指定路径文件,指定sheet,指定行、指定单元格...

    使用POI操作Excel文件(写)

    以上就是使用Apache POI进行Excel文件写操作的基本步骤。通过组合这些基本操作,你可以创建复杂的Excel文件,包括多行、多列、公式、图表等。在实际项目中,你可能还需要考虑性能优化,比如使用SXSSFWorkbook(基于...

    POI操作EXCEL文件的简单封装

    封装POI操作Excel的过程通常包括以下几个步骤: 1. 引入依赖:在Java项目中,你需要添加Apache POI的依赖库。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```xml &lt;groupId&gt;org.apache.poi ...

    POI导出Excel文件

    总结起来,Apache POI为Java开发者提供了一种强大且灵活的方式来处理Excel文件,无论是通过Servlet从服务器生成文件,还是在本地通过main方法创建文件。理解如何使用POI库可以帮助你更好地集成Excel功能到你的Java...

    poi excel poi excel poi excel

    为了使用 POI 操作 Excel 文件,首先需要准备以下环境: 1. **JDK 版本**:至少需要 JDK 1.4 或更高版本。 2. **POI 库**:下载 POI 库,可以从 Apache 官方网站获取:...

    使用POI操作Excel文件(读)

    总结来说,Apache POI为Java开发者提供了一个强大且灵活的工具,用于操作Excel文件。无论是在数据导入、数据分析,还是报表生成等场景,都能发挥其作用。通过熟练掌握POI,你可以轻松地处理各种Excel相关的任务,...

Global site tag (gtag.js) - Google Analytics