关于Java使用POI对Excel2003和2007的导入和导出

Excel2003和2007的区别,除了不仅在外观上,还有相关的功能上也都得到很大改善,因为机制的问题(或许后缀问题把),在文件解析上,也与之前有很大区别

,对于我这代码君来说,还是直接上代码,比较直观

1:引用相关POI.jar包,


            org.apache.poi
            poi
            3.9
        
        
            org.apache.poi
            poi-scratchpad
            3.9
        
        
            org.apache.poi
            poi-ooxml
            3.9
        
        
            org.apache.xmlbeans
            xmlbeans
            2.3.0
        


2:判断该文件是2003文件还是2007以上文件(原理通过文件后缀)

import java.math.BigDecimal;
import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.Cell;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.xyy.common.util.DateUtil;
import com.xyy.common.util.StringUtil;

/**
 * Excel辅助工具类
 * @ClassName: ExcelCommonUtil 
 * @author wangqinghua
 * @date 2017-3-21 上午11:07:46
 */
public class ExcelCommonUtil {
	private static Logger LOGGER = LoggerFactory.getLogger(ExcelCommonUtil.class);
	/**
	 * 判断是否为老版本的excel
	 * @Title: isExcel2003
	 * @param filePath   *.xls
	 * @return
	 * boolean
	 * @author wangqinghua 
	 * @date 2017-3-21 上午11:05:19
	 */
	public static boolean isExcel2003(String filePath){
        return StringUtil.isNotEmpty(filePath) && filePath.matches("^.+\\.(?i)(xls)$");
    }
	
	/**
	 * 判断是否为新版本的excel
	 * @Title: isExcel2007
	 * @param filePath   *.xlsx
	 * @return
	 * boolean
	 * @author wangqinghua 
	 * @date 2017-3-21 上午11:05:43
	 */
    public static boolean isExcel2007(String filePath){
        return StringUtil.isNotEmpty(filePath) && filePath.matches("^.+\\.(?i)(xlsx)$");
    }
	
	/**
	 * 根据单元格获取内容
	 * @Title: getCellFormatValue
	 * @param cell
	 * @return
	 * String
	 * @author wangqinghua 
	 * @date 2017-3-10 下午10:19:04
	 */
	public static String getCellFormatValue(Cell cell) {
		String result="";
		switch (cell.getCellType()) {
        case HSSFCell.CELL_TYPE_STRING:
        	result = cell.getRichStringCellValue().getString();
            break;
        case HSSFCell.CELL_TYPE_NUMERIC:
        	if(HSSFDateUtil.isCellDateFormatted(cell)){  
                Date date = cell.getDateCellValue(); 
                result =  DateUtil.date2String(date, "yyyy-MM-dd");
	        }else{  
	        	result = String.valueOf(new BigDecimal(cell.getNumericCellValue()));  
	        }
            break;
        case HSSFCell.CELL_TYPE_FORMULA:
        	result = String.valueOf(cell.getNumericCellValue());
            break;
        default:
        	result = "";
            break;
        }
		return result;
    }
}
3:文件判断完毕,根据POI对应的接口获取文件流,以及相关单元格值,组成对应的结果集package com.xyy.common.excel;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
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.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.xyy.common.util.DateUtil;
import com.xyy.common.util.StringUtil;
/**
 * 导出数据表格的工具类
 * @ClassName: UtilOrganizeExcelData 
 * @author wangqinghua
 * @date 2016-2-23 下午11:08:43
 */ 
public class UtilOrganizeExcelData {
	private static Logger LOGGER = LoggerFactory.getLogger(ExcelCommonUtil.class);
	/**
	 * @param titleCn 中文标题名
	 * @param colsCn 中文列名
	 * @param dataFileds 数据域名称
	 * @param styles 数据的格式 0:顺序号 1:文本 2:应用参数  3:金额(实际金额带小数点) 4:金额
	 * @param alignStyles 对齐方式 ALIGN_LEFT = 1;ALIGN_CENTER = 2;ALIGN_RIGHT = 3;
	 * @param widths 列的宽度 默认为4000
	 * @param dataList 数据List
	 * @param appParams 应用参数对应的字段
	 * @param fileName 下载文件名称
	 * @return
	 */
	public static boolean listToExcel(HttpServletRequest request, String titleCn, String colsCn, String dataFileds, String styles, String alignStyles, String widths, List dataList,String appParams,String fileName)
	{	
		String titleName;
		String closName;
		
		String excelSplitChar=",";//域分割符号
		String excelRowSplitChar=";";//行分割符号
		//目前先处理中文的标题和中文的列名
		titleName = titleCn;
		closName = colsCn;
		
		//---结束处理--------------		
		
        //---------------------------------------------------
		String columnFiledName[] = StringUtil.splitStringToString(dataFileds,excelSplitChar);//context中的变量名
		String columnStyles[] = StringUtil.splitStringToString(styles,excelSplitChar);//数据类型
		String columnAlignStyles[] = StringUtil.splitStringToString(alignStyles,excelSplitChar);//对齐方式
		String columnWidths[] = StringUtil.splitStringToString(widths,excelSplitChar);//宽度
		String columnAppParams[] = StringUtil.splitStringToString(appParams,excelSplitChar);//参数名
		
		
		int columnNum = columnFiledName.length;// 列数
		/**
		 * closName的格式如下 "序号,项目,年初余额,收入,-,支出,-,期末余额;|,|,|,本月,本年累计,本月,本年累计,|"
		 * 可以多行,行与行之间用“;”隔开
		 * “|”表示改列别合并了,不处理
		 */
		String columnRowName[] = StringUtil.splitStringToString(closName,excelRowSplitChar);	
		String columnName[][] = new String[columnRowName.length][columnNum];
		for(int i = 0; i < columnRowName.length; i++){
			columnName[i] = StringUtil.splitStringToString(columnRowName[i], excelSplitChar);
		}
		
		//创建一个工作表
		HSSFWorkbook wb = new HSSFWorkbook();
		
		//设置字体位置
		HSSFCellStyle style1_LEFT = wb.createCellStyle();//普通_左
		HSSFCellStyle style1_CENTER = wb.createCellStyle();//普通_中
		HSSFCellStyle style1_RIGHT = wb.createCellStyle();//普通_右
		HSSFCellStyle style2 = wb.createCellStyle();//表头
		HSSFCellStyle style3 = wb.createCellStyle();//标题

		HSSFCellStyle styleTemp = null;
		// 设置字体
		HSSFFont font1 = wb.createFont();
		HSSFFont font2 = wb.createFont();
		HSSFFont font3 = wb.createFont();
		
		font1.setFontHeightInPoints((short) 11);    //字体大小
		font1.setFontName("宋体");
		style1_LEFT.setFont(font1);
		style1_CENTER.setFont(font1);
		style1_RIGHT.setFont(font1);
		
		font2.setFontHeightInPoints((short) 11);
		font2.setFontName("宋体");
		font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  //粗体
		style2.setFont(font2);
		
		font3.setFontHeightInPoints((short) 15);
		font3.setFontName("宋体");
		font3.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		style3.setFont(font3);
		
		//设置格式
		style1_LEFT.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 水平左
		style1_LEFT.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直举重
		style1_LEFT.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下边框
		style1_LEFT.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
		style1_LEFT.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
		style1_LEFT.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
		style1_LEFT.setWrapText(true);// 自动换行
		
		style1_CENTER.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中
		style1_CENTER.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直举重
		style1_CENTER.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下边框
		style1_CENTER.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
		style1_CENTER.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
		style1_CENTER.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
		style1_CENTER.setWrapText(true);// 自动换行
		
		style1_RIGHT.setAlignment(HSSFCellStyle.ALIGN_RIGHT);// 水平居右
		style1_RIGHT.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直举重
		style1_RIGHT.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下边框
		style1_RIGHT.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
		style1_RIGHT.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
		style1_RIGHT.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
		style1_RIGHT.setWrapText(true);// 自动换行
		
		style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中
		style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直举重
		style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);// 下边框
		style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框
		style2.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框
		style2.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框
		style2.setWrapText(true);// 自动换行
		
		style3.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 水平居中
		style3.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 垂直举重
		style3.setWrapText(true);// 自动换行
		/*******以下开始填充数据************/
		short rownum = 0;// 行序号
		HSSFSheet sheet = null;// 创建表单
		HSSFRow row = null;// 行
		HSSFCell cell = null;// 单元格
		
		//创建一个Sheet
		sheet = wb.createSheet("sheet");
		sheet.setDefaultColumnWidth(20);
		wb.setSheetName(0, "SHEET1");
		//为列设置宽度
		if(columnWidths != null && columnWidths.length == columnNum)
		{
			for (int j = 0; j  1)
						gap = " ";
					for(int k = 0;k < subColsFiledName.length;k++)
					{
						
						
						//如果从当前的循环kColl取不到值,则从context从去取值 add 2007-11-22
						String valueStr = "";
						 
						//如果是顺序号,则不需要获取数据域值
						if(!"0".equals(subColsStyles[k].trim()))
						{
							try
							{
								if(subColsFiledName[k].indexOf("#")!= -1){
									String speName[] = StringUtil.splitStringToString(subColsFiledName[k],"#");
									if(speName.length>0){
										for(int m=0;m< speName.length;m++){
											try{
												valueStr = valueStr + ((Object)ReflectionUtils.getFieldValue(kColl, speName[m])).toString();
											}catch(Exception ex){ 
												valueStr = valueStr + ((Object)ReflectionUtils.getFieldValue(kColl, speName[m])).toString();
											}
										}
									}
								}else{
									valueStr = ((Object)ReflectionUtils.getFieldValue(kColl, subColsFiledName[k])).toString();
								}
							}
							catch(Exception oe)
							{
								valueStr = ((Object)ReflectionUtils.getFieldValue(kColl, subColsFiledName[k])).toString();
							}	
						}
						//根据列的类型分别做处理
						// 0:顺序号 1:文本 2:应用参数  3:金额(实际金额) 4:金额(不处理)5:日期 6:时间
						//7:利率 8:错误信息
						//如果是5类型,则需要输入参数
				       	switch(Integer.parseInt(subColsStyles[k])){
					       	case 0: //顺序号
					       		contentTemp = contentTemp + String.valueOf(i+1) + gap;		    	   	
					    	   	break;
					       	case 1: //文本
					       		contentTemp =  contentTemp + valueStr + gap;
					    	   	break;
					       	case 3://金额
					       		contentTemp2 = valueStr;
					    	   	contentTemp = contentTemp + contentTemp2 + gap;
					    	   	break;
					    	case 4://金额
					       		contentTemp2 = valueStr;
					    	   	contentTemp = contentTemp + contentTemp2 + gap;
					    	   	break;
					    	case 5: //日期
					    		contentTemp2 = valueStr;
					       		contentTemp =  contentTemp + contentTemp2 + gap;
					    	   	break;
					    	case 6: //时间
					    		contentTemp2 = valueStr;
					       		contentTemp =  contentTemp + contentTemp2 + gap;
					    	   	break;
					    	case 7: //利率
					    		contentTemp2 = valueStr;
					       		contentTemp =  contentTemp + String.valueOf(Double.parseDouble(contentTemp2)/(double)10000000) + gap;
					    	   	break;
					       	case 9://金额 处理   xxxx.xx这中输入,输出x,xxx.xx
					       		if(valueStr!=null&&valueStr.startsWith("."))
					       			valueStr="0"+valueStr;
					       		contentTemp2 = valueStr;
					    	   	contentTemp = contentTemp + contentTemp2 + gap;
					    	   	break;
				       	}
					}
					row.setHeight((short) 400);
			       	cell = row.createCell(j);
				   	cell.setCellType(HSSFCell.CELL_TYPE_STRING);
					//设置样式
					switch(Integer.parseInt(columnAlignStyles[j])){
						case 1: //左
							styleTemp = style1_LEFT;
							break;
						case 2: //中
							styleTemp = style1_CENTER;
							break;
						case 3: //右
							styleTemp = style1_RIGHT;
							break;
					}
					cell.setCellStyle(styleTemp);
					cell.setCellValue(contentTemp);
			    }
				rownum++;
			}
		}catch(Exception ep){
			ep.printStackTrace();
			return false;
		}
		String fileNameStr = "";
		//处理文件名
		if(fileName.trim() == ""){
			fileName = "小药药数据下载";
		}
		fileNameStr = fileName +"_"+ DateUtil.date2String(new Date(), "yyyy-MM-dd")+".xls";
	    request.setAttribute("excelFileName", fileNameStr);
		request.setAttribute("excelWorkBook", wb);
		return true;
	}
	
	public static Map excelToList(InputStream inputStream,String fileName) {
        Map content = new HashMap();
        String str = "";
        Workbook wb = null;
        try {
        	if(ExcelCommonUtil.isExcel2003(fileName)){
        		wb = new HSSFWorkbook(inputStream);
        	}else if(ExcelCommonUtil.isExcel2007(fileName)){
        		wb = new XSSFWorkbook(inputStream);
        	}
        } catch (IOException e) {
            LOGGER.error("excel转换异常",e);
            return content;
        }
        Sheet sheet = wb.getSheetAt(0);
        // 得到总行数
        int rowNum = sheet.getLastRowNum();
        Row row = sheet.getRow(0);
        int colNum = row.getPhysicalNumberOfCells();
        // 正文内容应该从第二行开始,第一行为表头的标题
        for (int i = 1; i <= rowNum; i++) {
            row = sheet.getRow(i);
            int j = 0;
            while (j < colNum) {
                str += ExcelCommonUtil.getCellFormatValue(row.getCell(j)).trim() + "|";
                j++;
            }
            content.put(i+"", str);
            str = "";
        }
        return content;
    }
}

上述就是整个完成的导入代码,在导出excel的上面,需要用到一些关于实体的反射原理,在这就不复制了,需要的朋友可以@我

你可能感兴趣的:(JAVA)