java读取Excel指定sheet页或全部sheet页数据(含2003和2007版本)

java读取Excel指定sheet页或全部sheet页数据(含2003和2007版本)

在http://download.csdn.net/detail/u010792467/8072015下载所需要的包

如果需要excel2003和excel2007文件可以去

http://download.csdn.net/detail/u010792467/8072009下载


<span style="font-size:18px;">package Excel;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
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 ImportExeclMain {
	// 错误信息
	private String errorInfo;
	// 错误信息
	private static int readSheet = 0;
	private static boolean readSheetNum = false;

	public static void main(String[] args) throws Exception {
		// readSheetNum = true 开启自定义读取sheet页 默认false(读取全部sheet页)
		readSheetNum = false;
		// readSheet默认为0(读取第一页) 值为2时读取第二页
		//当readSheetNum = false时  readSheet无作用
		readSheet = 1;
		ImportExeclMain poi = new ImportExeclMain();
		// 2003
//		 List<List<String>> list = poi.readExcel("D:\\excel\\EXCEL2003测试.xls");
		// 2007
		List<List<String>> list = poi.readExcel("D:\\EXCEL2007测试.xlsx");

		if (list != null) {

			for (int i = 0; i < list.size(); i++) {

				System.out.print("第" + (i) + "行");

				List<String> listCell = list.get(i);

				for (String s : listCell) {
					System.out.print(" " + s);
				}
				System.out.println();

			}

		}

	}

	// 验证excel文件
	public boolean validateExcel(String filePath) {
		// 检查文件名是否为空或者是否是Excel格式的文件

		if (filePath == null
				|| !(is2003Excel(filePath) || is2007Excel(filePath))) {

			errorInfo = "文件名不是excel格式";

			return false;
		}
		// 检查文件是否存在

		File file = new File(filePath);

		if (file == null || !file.exists()) {

			errorInfo = "excel文件不存在";

			return false;

		}

		return true;

	}

	// 根据文件名读取excel文件

	public List<List<String>> readExcel(String filePath) {

		List<List<String>> dataList = new ArrayList<List<String>>();

		InputStream is = null;

		try {

			// 验证文件是否合法

			if (!validateExcel(filePath)) {

				System.out.println(errorInfo);

				return null;

			}

			// 判断文件的类型,是2003还是2007

			boolean is2003Excel = true;

			if (is2007Excel(filePath)) {

				is2003Excel = false;
			}

			// 调用本类提供的根据流读取的方法

			File file = new File(filePath);

			is = new FileInputStream(file);

			dataList = readFile(is, is2003Excel);

			is.close();

		} catch (Exception ex) {

			ex.printStackTrace();

		} finally {

			if (is != null) {

				try {

					is.close();

				} catch (IOException e) {

					is = null;

					e.printStackTrace();

				}

			}

		}

		// 返回最后读取的结果

		return dataList;

	}

	// 根据流读取Excel文件

	public List<List<String>> readFile(InputStream inputStream,
			boolean is2003Excel) {

		List<List<String>> dataLists = null;

		try {

			// 根据版本选择创建Workbook的方式

			Workbook wb = null;

			if (is2003Excel) {
				wb = new HSSFWorkbook(inputStream);
			} else {
				wb = new XSSFWorkbook(inputStream);
			}
			// sheet循环
			int sheetNum = sheetCirculation(wb);
			List<List<String>> dataList = new ArrayList<List<String>>();
			if (readSheetNum) {
				dataLists = read(dataList, wb, readSheet);
			} else {
				for (int i = 0; i < sheetNum; i++) {
					// Sheet sheet = wb.getSheetAt(i);
					// 显示sheet名称
					// System.out.println(sheet.getSheetName());
					dataLists = read(dataList, wb, i);
				}
			}

		} catch (IOException e) {

			e.printStackTrace();

		}

		return dataLists;

	}

	// 读取数据

	private List<List<String>> read(List<List<String>> dataList, Workbook wb,
			int sheets) {
		// 总行数
		int totalRows = 0;
		// 总列数
		int totalCells = 0;

		// 第一个shell页
		Sheet sheet = wb.getSheetAt(sheets);

		// Excel的行数

		totalRows = sheet.getPhysicalNumberOfRows();

		// Excel的列数

		if (totalRows >= 1 && sheet.getRow(0) != null) {

			totalCells = sheet.getRow(0).getPhysicalNumberOfCells();

		}
		// 遍历Excel的行
		for (int r = 0; r < totalRows; r++) {

			Row row = sheet.getRow(r);

			if (row == null) {

				continue;

			}

			List<String> rowLst = new ArrayList<String>();

			// 遍历Excel的列
			for (int c = 0; c < totalCells; c++) {

				Cell cell = row.getCell(c);

				String cellValue = "";

				if (null != cell) {
					// 以下是判断数据的类型
					switch (cell.getCellType()) {
					case HSSFCell.CELL_TYPE_NUMERIC: // 数字
						cellValue = cell.getNumericCellValue() + "";
						break;

					case HSSFCell.CELL_TYPE_STRING: // 字符串
						cellValue = cell.getStringCellValue();
						break;

					case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
						cellValue = cell.getBooleanCellValue() + "";
						break;

					case HSSFCell.CELL_TYPE_FORMULA: // 公式
						cellValue = cell.getCellFormula() + "";
						break;

					case HSSFCell.CELL_TYPE_BLANK: // 空值
						cellValue = "";
						break;

					case HSSFCell.CELL_TYPE_ERROR: // 故障
						cellValue = "非法字符";
						break;

					default:
						cellValue = "未知类型";
						break;
					}
				}

				rowLst.add(cellValue);

			}
			// 保存第r行的第c列

			dataList.add(rowLst);

		}
		return dataList;

	}

	private int sheetCirculation(Workbook wb) {
		int sheetCount = -1;
		sheetCount = wb.getNumberOfSheets();
		return sheetCount;
	}

	// 是否是2003的excel,返回true是2003

	public static boolean is2003Excel(String filePath) {

		return filePath.matches("^.+\\.(?i)(xls)$");

	}

	// 是否是2007的excel,返回true是2007
	public static boolean is2007Excel(String filePath) {

		return filePath.matches("^.+\\.(?i)(xlsx)$");

	}

	// 构造方法
	public ImportExeclMain() {
	}

	// 得到错误信息
	public String getErrorInfo() {
		return errorInfo;
	}
}
</span>

作者:儱剑阿攵
转载请注明链接:http://blog.csdn.net/awenluck/article/details/40396529

### 回答1: 可以使用Java中的Apache POI库来解析Excel多个sheet。使用POI库可以获取Excel文件中的所有sheet,然后逐个解析每个sheet中的数据。需要注意每个sheet在POI库中都是一个单独的对象,需要逐个处理每个对象。 ### 回答2: Java是一种面向对象的编程语言,因此我们可以使用Java语言中的各种类和方法来解析Excel文件中的多个工作表(sheet)。解析Excel文件的多个工作表有多种实现方式,但我们一般使用Apache POI这个开源的Java API来进行操作。 使用Apache POI解析Excel文件有两种方式:一种是使用HSSF方式处理Excel文件(版本为97-2007),另一种是使用XSSF方式处理Excel文件(版本2007及以上)。HSSF(Horrible Spreadsheet Format)是针对Excel文件的二进制(.xls)格式解析而设计的,而XSSF(XML Spreadsheet Format)则是针对Excel文件的XML(.xlsx)格式解析而设计的。 在使用POI解析多个工作表的过程中,一般使用Workbook这个类来打开Excel文件,然后使用Sheet这个类来读取每个工作表中的数据。以下是解析Excel文件中多个工作表的基本步骤: 1.使用Workbook open方法打开Excel文件,如下: FileInputStream fis = new FileInputStream(new File("路径/文件名")); Workbook workbook = WorkbookFactory.create(fis); 2.使用Workbook getSheet方法获取指定的工作表,如下: Sheet sheet = workbook.getSheetAt(sheetIndex); //sheetIndex为工作表的编号,从0开始 3.使用Sheet getLastRowNum方法获取该工作表的最后一行的行号,如下: int lastRowNum = sheet.getLastRowNum(); 4.使用Sheet getRow方法获取某一行的数据,如下: Row row = sheet.getRow(rowIndex); //rowIndex为行的编号,从0开始 5.使用Row getCell方法获取某一列的数据,如下: Cell cell = row.getCell(cellIndex); //cellIndex为列的编号,从0开始 6.最后,遍历工作表的每一行和每一列来获取相应的数据。 上述就是解析Excel文件中多个工作表的基本步骤。需要注意的是,Apache POI不支持所有的Excel文件特性,例如一些复杂的图表和宏,因此在进行解析时需要对Excel文件进行预处理。此外,需要根据具体的需求选择不同的方式来处理Excel文件,例如使用HSSF还是XSSF等。 ### 回答3: Java解析Excel多个sheet是指通过Java代码实现对Excel文件中多个Sheet表格的读取和解析,可以使得用户更加便捷地查询、分析和处理Excel数据,提高数据处理效率。下面我们来了解一下如何实现Java解析Excel多个sheet。 首先,我们需要使用Java中的开源库——Apache POI来读取Excel文件。Apache POI提供了丰富的API,方便用户读取和操作Excel文件。具体步骤如下: 1. 引入Apache POI库: 在项目中引入Apache POI库,可以从官网http://poi.apache.org/下载最新版本的POI库,也可以使用Maven等工具进行引入。 2. 创建Excel工作簿对象: 通过Java代码创建一个Excel工作簿对象,该对象可以打开和操作Excel文件,例如: Workbook workbook = WorkbookFactory.create(new File("excel_file.xlsx")); 3. 获取Sheet名称列表: 通过工作簿对象获取Excel文件中所有Sheet的名称列表,例如: int sheetCount = workbook.getNumberOfSheets(); for (int i = 0; i < sheetCount; i++) { String sheetName = workbook.getSheetName(i); // do something } 4. 获取Sheet对象并读取数据: 通过Sheet名称获取Sheet对象,并使用Cell和Row对象来读取Excel数据Sheet sheet = workbook.getSheet(sheetName); Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { Row row = rowIterator.next(); Iterator<Cell> cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); // do something } } 通过以上步骤,我们可以完成对Excel文件中多个Sheet表格的读取和解析,可根据具体业务场景实现相应的处理逻辑。 当然,POI库还提供了许多高级功能,如合并单元格、筛选数据、写入Excel等功能,用户可以根据自己的需求进行选择使用。以上就是Java解析Excel多个sheet的基本操作过程,希望对你有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值