POI解析Excel表格

Apache POIApache软件基金会的开放源码函式库,POI提供APIJava程序对Microsoft Office格式档案读和写的功能。

这里实现poi解析Excel表格的例子,导入Excel

准备食材

第一道菜

在这里插入图片描述

第二道菜

在这里插入图片描述

下锅炸至两面金黄

package com.ftx.poi;

import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
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.xssf.usermodel.XSSFWorkbook;

public class ParseExcel {
/**
 * 解析文件的方法
 *@param inputStream文件输入流 ,要解析的Excel文件输入流
 *@param suffix 后缀名,xls或xlsx,代码决定使用什么方式解析Excel
 *@param startRow 从第几行开始读取数据
 *@return List<String[]> 集合中的一个元素对应一行解析的数据
 * 		元素为字符串数组类型,数组中的每一个元素对应一列数据
 * @throws IOException 
 */
	
	public List<String[]> parseExcel(InputStream inputStream,String suffix,int startRow) throws IOException{
		//定义Excel对象变量
		Workbook workbook=null;
		//判断后缀 决定使用的解析方式,决定如何创建具体的对象
		if("xls".equals(suffix)) {
			//2003版的解析方式
			workbook=new HSSFWorkbook(inputStream);
		}else if("xlsx".equals(suffix)) {
			//2007
			workbook=new XSSFWorkbook(inputStream);
		}else {
			//未知内容
			return null;
		}
		//获取工作表,Excel分为若干个表,sheet
		Sheet sheet = workbook.getSheetAt(0);//得到第一个表格sheet
		if(sheet==null) {
			return null;
		}
		//获取表格中最后一行的行号
		int lastRowNum = sheet.getLastRowNum();
		//最后一行的行号大于startRow
		if(lastRowNum<=startRow) {
			return null;
		}
		List<String[]> result=new ArrayList<String[]>();
		
		//定义行变量和单元格变量
		Row row=null;
		Cell cell=null;
		//循环读取
		for (int rowNum = startRow; rowNum <= lastRowNum; rowNum++) {
			row=sheet.getRow(rowNum);
			//获取当前行的第一列和最后一列的标记
			short firstCellNum = row.getFirstCellNum();
			short lastCellNum = row.getLastCellNum();
			if(lastCellNum!=0) {
				String[] rowArray=new String[lastCellNum];
				for(int cellNum=firstCellNum;cellNum<lastCellNum;cellNum++) {
					//拿到单元格的值
					cell=row.getCell(cellNum);
					//判断单元格是否有数据
					if(cell==null) {
						rowArray[cellNum]=null;
					}else {
						rowArray[cellNum]=parseCell(cell);
					}
				}
				result.add(rowArray);
			}
		}
		
		
		
		return result;
	}
	/**
	 * 解析单元格数据(返回字符串)
	 */

private String parseCell(Cell cell) {
	String cellStr=null;
	//判断单元格的类型
	switch (cell.getCellType()) {
	case STRING :
		//字符串类型单元格
		cellStr=cell.getRichStringCellValue().toString();
		break;
	case BLANK :
		//空数据
		cellStr="";
		break;
	case NUMERIC :
		//数字类型  包含日期、时间、数字
		//判断日期【年月日2016-12-20  | 时分10:20】类型
		if(HSSFDateUtil.isCellDateFormatted(cell)) {
			//判断具体类型,是日期还是时间
			SimpleDateFormat sdf=null;
			if(cell.getCellStyle().getDataFormat()==HSSFDataFormat.getBuiltinFormat("h:mm")) {
				//时间
				sdf=new SimpleDateFormat("HH:mm");
			}else {
				//日期
				sdf=new SimpleDateFormat("yyyy-MM-dd");
			}
			Date temp = cell.getDateCellValue();
			cellStr=sdf.format(temp);
		}else {
			//数字
			double temp=cell.getNumericCellValue();
			//数字格式化工具
			DecimalFormat format=new DecimalFormat();
			//查看单元格中的具体样式类型
			String formatStr=cell.getCellStyle().getDataFormatString();
			if(formatStr.equals("General")) {
				/**
				 * 定义格式化正则
				 * 保留一位小数 #.#
				 * 保留两位小数#.##
				 */
				format.applyPattern("#");
			}
			
			cellStr=format.format(temp);
		}
		break;
	default:
		cellStr="";
		
	}
	return cellStr;
}
	
}

吃一口嘎嘣脆

public class Test {

	public static void main(String[] args) throws IOException {
		ParseExcel parser=new ParseExcel();
		InputStream inputStream=new FileInputStream("D:\\工作内容\\poiTestTwo.xls");
		String suffix="xls";
		int startRow=1;
		List<String[]> result = parser.parseExcel(inputStream, suffix, startRow);
		for(String[] i:result) {
			//Arrays.toString("字符串数组")  打印字符串数组,直接打印字符串数组会打印出数组的地址
			System.out.println(Arrays.toString(i));
		}
	}

}

运行测试类,解析出了Excel表格的内容。
在这里插入图片描述
说明:上面的poi只能是解析03和07版本的Excel,如果不是这个版本的Excel的话需要另存为03或07版本然后再进行解析,否则会报错找不到对应的jar包。
在这里插入图片描述
现在只是把Excel表格的内容解析成了字符串数组的形式,如果导入到数据库的话还需要再对其字符串数组进行处理。

思路提示:实现在页面点击按钮导入Excel表格进行导入的功能,使用<input type="file" />表单提交,在controller中接收到的就是File对象,就不用像上面的测试类中写死的样子了。
根据suffix判断表格文件的版本(获取后缀参考图片上传)

 public String upload(@RequestParam(value = "pic") MultipartFile pic,@RequestParam Map param,Model model) throws ParseException {
    String fileName=pic.getOriginalFilename();//得到文件名
    String suffixName=fileName.substring(fileName.lastIndexOf("."));//得到后缀名
posted @ 2020-03-08 17:15  你樊不樊  阅读(139)  评论(0编辑  收藏  举报