POI 兼容导入Excel

本文详细解析了Excel参数的定义及其自定义类型转换的过程,包括参数的属性、自定义列头类型和数据映射方式。通过实例展示了如何实现不同类型数据的正确读取与写入,为复杂数据处理提供了有效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值