`

POI 兼容导入Excel

 
阅读更多

package ycl.learn.excel;

import java.io.OutputStream;
import java.util.List;
import java.util.Map;

import ycl.learn.excel.ExcelHeader.ColumnHeader;

public class ExcelParameter {

	private OutputStream outputStream;
	
	private String sheetName;
	
	private ColumnHeader[] chs;
	
	private List<Map<String, String>> dataMapList;
	
	private Boolean verstion2007;

	public ColumnHeader[] getChs() {
		return chs;
	}

	public void setChs(ColumnHeader[] chs) {
		this.chs = chs;
	}

	public List<Map<String, String>> getDataMapList() {
		return dataMapList;
	}

	public void setDataMapList(List<Map<String, String>> dataMapList) {
		this.dataMapList = dataMapList;
	}

	public OutputStream getOutputStream() {
		return outputStream;
	}

	public void setOutputStream(OutputStream outputStream) {
		this.outputStream = outputStream;
	}

	public String getSheetName() {
		return sheetName;
	}

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

	public Boolean getVerstion2007() {
		return verstion2007;
	}

	public void setVerstion2007(Boolean verstion2007) {
		this.verstion2007 = verstion2007;
	}
}



defination of the parameter

package ycl.learn.excel;

import ycl.learn.excel.ExcelTypeConvert.HeaderType;
 

public class ExcelHeader {
	    
	public interface ColumnHeader{
		public String getName(); 
		public HeaderType getHeaderType();
	}
	
	public enum UserHeader implements ColumnHeader{
		ACTION("ACTION",HeaderType.BOOLEAN),FIRST_NAME("FIRST NAME",HeaderType.DATE),LAST_NAME("LAST NAME",HeaderType.DOUBLE),E_MAIL("E-MAIL",HeaderType.STRING),PHONE("PHONE",HeaderType.STRING);
		
		private String name=null;
		private HeaderType ht = null;
		private UserHeader(String name,HeaderType ht){
			this.name = name;
			this.ht = ht;
		}
		public String getName(){
			return name;
		} 
		public HeaderType getHeaderType(){
			return ht;
		}
	} 
	
	public enum PhoneHeader  implements ColumnHeader{
		//ACTION("ACTION"),
		NAME("NAME",HeaderType.BOOLEAN),PHONE_NUMBER("PHONE NUMBER",HeaderType.BOOLEAN);
		private String name=null;
		private HeaderType ht = null;
		private PhoneHeader(String name,HeaderType ht){
			this.name = name;
			this.ht = ht;
		}
		public String getName(){
			return name;
		} 
		public HeaderType getHeaderType(){
			return ht;
		}
	}
   
	 
}



defination of the header, this is add TypeConvert.

package ycl.learn.excel;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;

public class ExcelTypeConvert {
	 
	public interface TypeConvert{
		public Object getConvertValue(String value);
	}
	
	public enum HeaderType implements TypeConvert{
		DOUBLE{
			public Object getConvertValue(String value) {
				Double ret = new Double(value);
				return ret;
			}
		}
		,DATE("yyyy-MM-DD"){
			public Object getConvertValue(String value) {
				Date date = null;
				try {
					SimpleDateFormat format = new SimpleDateFormat(this.getFormat());
					date = format.parse(value);
				} catch (ParseException e) {
				}
				return date;
			}
		}
		,STRING{
			public Object getConvertValue(String value) {
				return value;
			}
		}
		,BOOLEAN{
			public Object getConvertValue(String value) {
				Boolean bol = new Boolean(value);
				return bol;
			}
		}; 
		private String format;
		private HeaderType(){
			
		}
		private HeaderType(String format){
			this.format=format;
		}
		
		public String getFormat(){
			return format;
		}
		
		public abstract Object getConvertValue(String value);
	}
	

	/**
	 * be able to read as string value from a non-string type cell.
	 * Every cell value transform to string format.
	 * 
	 * @param cell
	 * @return
	 */
	public static String getStringCellValue(Cell cell) {
		if (cell == null) {
			return "";
		} else {
			Object ret = null;
			switch (cell.getCellType()) {
			case Cell.CELL_TYPE_FORMULA://formula
				switch (cell.getCachedFormulaResultType()) {
				case Cell.CELL_TYPE_STRING:
					ret = cell.getStringCellValue();
					break;
				case Cell.CELL_TYPE_NUMERIC:
					ret = new Double(cell.getNumericCellValue());
					break;
				default:
					ret = cell.getStringCellValue();
				}
				break;
			case Cell.CELL_TYPE_NUMERIC:
				if (DateUtil.isCellDateFormatted(cell)) {
					ret = cell.getDateCellValue();
				} else {
					ret = new Double(cell.getNumericCellValue());
				}
				break;
			case Cell.CELL_TYPE_STRING:
				ret = cell.getStringCellValue();
				break;
			case Cell.CELL_TYPE_BLANK:// blank
				ret = "";
				break;
			case Cell.CELL_TYPE_ERROR:
				ret = "";
				break;
			case Cell.CELL_TYPE_BOOLEAN:
				ret = new Boolean(cell.getBooleanCellValue());
				break;
			default:
				try {
					ret = cell.getStringCellValue();
				} catch (Exception e) {
					ret = "";
				}
			}
			return ret.toString().trim();
		}
	}
}



this is the type convert.

package ycl.learn.excel;

import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.BuiltinFormats;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
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.XSSFWorkbook;

import ycl.learn.excel.ExcelHeader.ColumnHeader;
import ycl.learn.excel.ExcelResult.ExcelErrorEnum;
import ycl.learn.excel.ExcelTypeConvert.HeaderType;

public class ExcelWriter {

	public static ExcelResult writerExcel(ExcelParameter parameter) {
		ExcelResult result = new ExcelResult();
		OutputStream os = parameter.getOutputStream();
		ColumnHeader[] chs = parameter.getChs();
		Boolean version2007 = parameter.getVerstion2007();
		String sheetName = parameter.getSheetName();
		List<Map<String, String>> dataMapList = parameter.getDataMapList();
		Workbook workbook = null;
		try {
			if (version2007)
				workbook = new XSSFWorkbook();
			else
				workbook = new HSSFWorkbook();
		} catch (Exception e) {
			result.addError(ExcelErrorEnum.SYSTEM_ERROR);
			return result;
		}
		Sheet sheet = workbook.createSheet(sheetName);
		result = writerSheet(sheet,chs,dataMapList,workbook);
		try {
			workbook.write(os);
		} catch (IOException e) {
			result.addError(ExcelErrorEnum.SYSTEM_ERROR);
			return result;
		}
		return result; 
	}

	private static ExcelResult writerSheet(Sheet sheet, ColumnHeader[] chs, List<Map<String, String>> dataMapList,Workbook workbook) {
		ExcelResult result = new ExcelResult();
		Row row = sheet.createRow(0);
		for(int i=0;i<chs.length;i++){
			Cell cell = row.createCell(i);
			cell.setCellValue(chs[i].getName());
		}
		
		for(int j=0;j<dataMapList.size();j++){
			row = sheet.createRow(j+1);
			for(int k=0;k<chs.length;k++){
				Cell dataCell = row.createCell(k);
				Map<String, String> dataMap = dataMapList.get(j);
				String value = dataMap.get(chs[k].getName());
				if(value == null){
					result.addError(ExcelErrorEnum.HEADER_NOT_MATCH);
				} 
				Object convertValue = chs[k].getHeaderType().getConvertValue(value); 
				if(chs[k].getHeaderType().equals(HeaderType.BOOLEAN)){
					Boolean realValue  = (Boolean)convertValue;
					dataCell.setCellValue(realValue); 
				}else if(chs[k].getHeaderType().equals(HeaderType.DATE)){
					Date realValue  = (Date)convertValue;  
					dataCell.setCellValue(realValue);
					dataCell.setCellType(Cell.CELL_TYPE_NUMERIC);
					CellStyle dataCellStyle = workbook.createCellStyle();
					dataCellStyle.setDataFormat((short) BuiltinFormats.getBuiltinFormat("m/d/yy"));
					dataCell.setCellStyle(dataCellStyle);
				}else if(chs[k].getHeaderType().equals(HeaderType.DOUBLE)){
					Double realValue = (Double)convertValue;
					dataCell.setCellValue(realValue);
					dataCell.setCellType(Cell.CELL_TYPE_NUMERIC);
					CellStyle dataCellStyle = workbook.createCellStyle();
					dataCellStyle.setDataFormat((short) BuiltinFormats.getBuiltinFormat("0.00"));
					dataCell.setCellStyle(dataCellStyle);
				}else if(chs[k].getHeaderType().equals(HeaderType.STRING)){
					dataCell.setCellValue((String)convertValue);
				}else{
					dataCell.setCellValue((String)convertValue);
				} 
			}
		}
		return result;
	}
}



so you can defination of the ColumnHeader with columnName,columnType.
auto export with String Type, and writer with the type of the user defination.

the real, we get data from excel use String type.
If you want to change type with user defination ,just use the typeConvert.
分享到:
评论

相关推荐

    Java poi导入导出EXCEL工具类(兼容各版本)

    概述:Java poi导入导出EXCEL工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见...

    poi导入excel 兼容2003-2007xls,xlsx.txt

    poi导入excel 兼容2003-2007兼容版本,测试可以成功;poi导入excel 兼容2003-2007兼容版本,测试可以成功;

    poi-3.9 使用poi技术处理Excel表导入、导出的包

    导入和导出Excel表是Apache POI的核心功能。下面,我们将深入探讨如何使用POI 3.9处理Excel的相关知识点: 1. **工作簿与工作表**: - **工作簿**:在POI中,工作簿(HSSFWorkbook 或 XSSFWorkbook)代表整个Excel...

    poi导入导出Excel通用工具类 兼容xls,xlsx

    总结,"poi导入导出Excel通用工具类 兼容xls,xlsx"这个工具实现了利用Apache POI库处理Excel文件的功能,涵盖了从旧版的.xls到新版的.xlsx格式,提供了方便的导入和导出接口,使得在Java开发中处理Excel数据变得...

    POI导入excel大数据处理,支持excel2003,2007

    标题提到的“POI导入excel大数据处理”是指利用Apache POI进行大量Excel数据的导入操作,同时它兼容Excel 2003(.xls格式)和2007以上版本(.xlsx格式)的文件。 POI库的主要优点包括: 1. **多格式支持**:不仅...

    POI批量导入导出

    在批量导入导出过程中,POI允许程序创建、修改和保存Excel文件,包括设置工作表、单元格的各种属性。例如,可以创建新的工作簿,添加工作表,设定单元格的值,设置单元格样式,甚至处理公式和图表。这使得Java应用...

    POI导入Excel表格数据小例子

    ### POI导入Excel表格数据小例子 #### 一、背景介绍 Apache POI 是一个用于读写 Microsoft Office 格式文件的 Java API,包括 Excel、Word 和 PowerPoint 等。本例通过 Apache POI 库将 Excel 文件中的数据导入到...

    POI实现excel导入导出

    导入Excel文件: 1. **创建Workbook对象**:这是处理Excel文件的基本单元。你可以使用`WorkbookFactory.create(InputStream)`或`WorkbookFactory.create(File)`来创建一个Workbook实例,取决于你是否有文件的物理...

    Springboot+Poi实现Excel的导入导出

    本项目结合了Spring Boot和POI,实现了Excel文件的导入与导出功能,这在数据管理、报表生成、数据分析等领域十分常见。 首先,我们要理解Spring Boot如何与MyBatis集成来处理数据库操作。MyBatis是一个轻量级的持久...

    ExtJS poi 导入excel

    标题 "ExtJS poi 导入excel" 涉及到两个主要技术:ExtJS 和 Apache POI,它们在Java环境中用于处理Excel数据。ExtJS 是一个JavaScript库,主要用于构建富客户端应用程序,而Apache POI是Java的一个开源项目,用于...

    使用poi导入导出excel的相关包.rar

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel、Word和...同时,要注意版本兼容性,因为不同版本的POI可能对新旧Excel格式的支持程度不同,以及对Java版本的要求也可能有所差异。

    通过POI统一读取Excel文件(兼容97-2003和2007+两种格式)

    这篇博客“通过POI统一读取Excel文件(兼容97-2003和2007+两种格式)”正是介绍了如何使用Apache POI库来处理不同版本的Excel文件。 Apache POI 提供了两个主要的API来处理Excel文件:HSSF(Horrible Spreadsheet ...

    poiEXcel导入导出操作架包

    8. **兼容性**:由于Apache POI是对Microsoft Office文件格式的开源实现,它能够很好地处理不同版本的Excel文件,提供了良好的向下兼容性。 9. **与其他库的结合**:在描述中提到可以与JXL混合使用,JXL是一个较早...

    POI导入导出excel jar

    标题中的“POI导入导出excel jar”是指Apache POI项目,这是一个开源的Java库,专门用于处理Microsoft Office格式的文件,尤其是Excel。在描述中提到的“只有两个包”,指的是可能提供的压缩文件包含了Apache POI的...

    poi批量导入导出示例

    - **版本兼容性**:不同版本的POI处理不同版本的Excel文件,确保使用的POI版本支持你的文件格式。 - **异常处理**:在读写过程中,应处理可能出现的IO异常和数据转换异常。 6. **示例代码片段** - 导入: ```...

    POI导入excel(模版式导入)

    - Excel文件的版本:确保使用与模版文件格式兼容的POI API,例如XLS文件使用HSSF,XLSX文件使用XSSF。 - 大文件处理:对于大文件,可能需要考虑分批读取或使用流式处理来避免内存溢出。 - 数据类型转换:Excel中...

    JXL、POI实现Excel导入导出

    以上就是关于使用JXL和Apache POI实现Excel导入导出的基本知识。根据实际需求,你可以结合这两个库的功能,灵活地处理各种Excel文件操作。在实际项目中,通常会根据性能、功能需求以及文件兼容性等因素选择适合的库...

    poi操作excel导入导出源码(兼容03、07版本).rar

    java使用poi操作excel导入导出源码,可以同时兼容03、07版本,所需jar包可以链接http://download.csdn.net/detail/yaohucaizi/5215864进行下载!

    poi3.1读写excel,wps et

    Apache POI是一个流行的开源库,专门用于处理Microsoft Office格式的文件,包括Excel(.xls和.xlsx)和Word(.doc和.docx)。在本场景中,我们关注的是使用POI 3.1版本来读取和写入Excel以及WPS的ET文件。POI 3.1是...

    Spring3 MVC + POI 实现 Excel与MySQL 的导入导出

    - 兼容性:考虑到不同的Excel版本,可能需要支持多种POI组件处理不同格式的文件。 综上所述,Spring3 MVC + POI 实现 Excel与MySQL 的导入导出是企业级应用中的常见技术组合,通过合理的设计和实现,可以有效地...

Global site tag (gtag.js) - Google Analytics