`
JavaSam
  • 浏览: 951823 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

POI读取excel适配07和03版本

 
阅读更多
03版读取


import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ReadExcel03 {

    /**
     * 读取excel
     * @param is
     * @return
     * @throws FileNotFoundException
     * @throws IOException
     */
	public static  List<List<String>> readExcel(InputStream is)throws FileNotFoundException, IOException {
		// 构造 HSSFWorkbook 对象,传入参数为excel文件的io流
		HSSFWorkbook wb = new HSSFWorkbook(is);
		// 读取第一个sheet的内容
		HSSFSheet sheet = wb.getSheetAt(0);
		// 获取所有行的迭代对象
		Iterator<Row> rowIter = sheet.rowIterator();
		// 获取合并单元格对象的相关信息
		List<ExcelMergedRegionBean> mergedRegionMapList = new CopyOnWriteArrayList<ExcelMergedRegionBean>(getMergedRegionMapList(sheet));
		List<List<String>> contentList = new ArrayList<List<String>>();
		// 迭代所有行
		while (rowIter.hasNext()) {
			List<String> cellList = new ArrayList<String>();
			// 获取每一行
			Row row = rowIter.next();
			// 获取该行的列迭代对象
			Iterator<Cell> cellIter = row.cellIterator();
			// 迭代该行的每一列
			while (cellIter.hasNext()) {
				// 获取该行的每一列
				Cell cell = cellIter.next();
				// 获取该单元格的值
				String content = getActualCellValue(sheet, mergedRegionMapList,cell);
				cellList.add(content);

			}
			contentList.add(cellList);
		}
		return contentList;
	}
	/**
	 * 获取单元格真实的值
	 * @param sheet
	 * @param mergedRegionMapList
	 * @param myCell
	 * @return
	 */
	public static String getActualCellValue(HSSFSheet sheet,List<ExcelMergedRegionBean> mergedRegionMapList, Cell myCell) {

		Cell actualCell = myCell;

		// 迭代合并单元格对象,判断myCell该对象是否属于合并单元格
		for (ExcelMergedRegionBean mb : mergedRegionMapList) {

			if (myCell.getRowIndex() > mb.getLastRow()) {

				mergedRegionMapList.remove(mb);

			}

			// 判断myCell该对象是否属于合并单元格,如果是的话,则直接退出循环
			if (myCell.getColumnIndex() <= mb.getLastCell()
					&& myCell.getColumnIndex() >= mb.getFirstCell()
					&& myCell.getRowIndex() <= mb.getLastRow()
					&& myCell.getRowIndex() >= mb.getFirstRow()) {

				Row row = sheet.getRow(mb.getFirstRow());

				Cell cell = row.getCell(mb.getFirstCell());

				actualCell = cell;

				break;

			}

		}

		// 返回该单元对应的真实值
		return getCellValue(actualCell);

	}
	
	/**
	 * 处理合并的列
	 * @param sheet
	 * @return
	 */
	public static List<ExcelMergedRegionBean> getMergedRegionMapList(HSSFSheet sheet) {
		List<ExcelMergedRegionBean> mergedRegionMapList = new ArrayList<ExcelMergedRegionBean>();
		// 获得一个 sheet 中合并单元格的数量
		int sheetmergerCount = sheet.getNumMergedRegions();
		// 便利合并单元格
		for (int i = 0; i < sheetmergerCount; i++) {
			// 获得合并单元格
			CellRangeAddress ca = sheet.getMergedRegion(i);
			// 获得合并单元格的起始行, 结束行, 起始列, 结束列
			int firstC = ca.getFirstColumn();
			int lastC = ca.getLastColumn();
			int firstR = ca.getFirstRow();
			int lastR = ca.getLastRow();
			ExcelMergedRegionBean mb = new ExcelMergedRegionBean();
			mb.setFirstRow(firstR);
			mb.setLastRow(lastR);
			mb.setFirstCell(firstC);
			mb.setLastCell(lastC);
			mergedRegionMapList.add(mb);

		}

		// 排序,便于后面循环删除
		Collections.sort(mergedRegionMapList);
		return mergedRegionMapList;

	}
	/**
	 * 获得单元格的值
	 * @param cell
	 * @return
	 */
	public static String getCellValue(Cell cell) {
		String cellValue = "";
		if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
			cellValue = rPadZeroUtil(String.valueOf(cell.getNumericCellValue()));
		} else if (cell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {
			cellValue = String.valueOf(cell.getBooleanCellValue());
		} else if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
			cellValue = cell.getStringCellValue();
		} else if (cell.getCellType() == HSSFCell.CELL_TYPE_FORMULA) {
			cellValue = String.valueOf(cell.getCellFormula());
		}
		return cellValue;
	}
	
	public static String rPadZeroUtil(String value) {
		if (value != null && !"".equals(value)) {
			if (value.endsWith(".0")) {
				return value.substring(0, value.indexOf(".0"));
			}
		}
		return value;
	}
}


07版读取



import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadExcel07 {

	/**
	 * 读取excel
	 * @param is
	 * @return
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public static  List<List<String>> readExcel(InputStream is)throws FileNotFoundException, IOException {
		// 构造 XSSFWorkbook 对象,传入参数为excel文件的io流
		XSSFWorkbook wb = new XSSFWorkbook(is);
		// 读取第一个sheet的内容
		XSSFSheet sheet = wb.getSheetAt(0);
		// 获取所有行的迭代对象
		Iterator<Row> rowIter = sheet.rowIterator();
		// 获取合并单元格对象的相关信息
		List<ExcelMergedRegionBean> mergedRegionMapList = new CopyOnWriteArrayList<ExcelMergedRegionBean>(getMergedRegionMapList(sheet));
		List<List<String>> contentList = new ArrayList<List<String>>();
		// 迭代所有行
		while (rowIter.hasNext()) {
			List<String> cellList = new ArrayList<String>();
			// 获取每一行
			Row row = rowIter.next();
			// 获取该行的列迭代对象
			Iterator<Cell> cellIter = row.cellIterator();
			// 迭代该行的每一列
			while (cellIter.hasNext()) {
				// 获取该行的每一列
				Cell cell = cellIter.next();
				// 获取该单元格的值
				String content = getActualCellValue(sheet, mergedRegionMapList,cell);
				cellList.add(content);

			}
			contentList.add(cellList);
		}
		return contentList;
	}

	/**
	 * 获取单元格真实的值
	 * @param sheet
	 * @param mergedRegionMapList
	 * @param myCell
	 * @return
	 */
	public static String getActualCellValue(XSSFSheet sheet,List<ExcelMergedRegionBean> mergedRegionMapList, Cell myCell) {
		Cell actualCell = myCell;
		// 迭代合并单元格对象,判断myCell该对象是否属于合并单元格
		for (ExcelMergedRegionBean mb : mergedRegionMapList) {
			if (myCell.getRowIndex() > mb.getLastRow()) {
				mergedRegionMapList.remove(mb);
			}

			// 判断myCell该对象是否属于合并单元格,如果是的话,则直接退出循环
			if (myCell.getColumnIndex() <= mb.getLastCell()
					&& myCell.getColumnIndex() >= mb.getFirstCell()
					&& myCell.getRowIndex() <= mb.getLastRow()
					&& myCell.getRowIndex() >= mb.getFirstRow()) {

				Row row = sheet.getRow(mb.getFirstRow());
				Cell cell = row.getCell(mb.getFirstCell());
				actualCell = cell;
				break;

			}

		}
		// 返回该单元对应的真实值
		return getCellValue(actualCell);

	}

	/**
	 * 处理有合并的列
	 * @param sheet
	 * @return
	 */
	public static List<ExcelMergedRegionBean> getMergedRegionMapList(XSSFSheet sheet) {

		List<ExcelMergedRegionBean> mergedRegionMapList = new ArrayList<ExcelMergedRegionBean>();
		// 获得一个 sheet 中合并单元格的数量
		int sheetmergerCount = sheet.getNumMergedRegions();
		// 便利合并单元格
		for (int i = 0; i < sheetmergerCount; i++) {
			// 获得合并单元格
			CellRangeAddress ca = sheet.getMergedRegion(i);
			// 获得合并单元格的起始行, 结束行, 起始列, 结束列
			int firstC = ca.getFirstColumn();//第一列
			int lastC = ca.getLastColumn();//最后一列
			int firstR = ca.getFirstRow();//第一行
			int lastR = ca.getLastRow();//第二行
			ExcelMergedRegionBean mb = new ExcelMergedRegionBean();
			mb.setFirstRow(firstR);
			mb.setLastRow(lastR);
			mb.setFirstCell(firstC);
			mb.setLastCell(lastC);
			mergedRegionMapList.add(mb);
		}

		// 排序,便于后面循环删除
		Collections.sort(mergedRegionMapList);
		return mergedRegionMapList;

	}

	/**
	 * 获得单元格的值
	 * @param cell
	 * @return
	 */
	public static String getCellValue(Cell cell) {
		String cellValue = "";
		if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) 
			cellValue = String.valueOf(cell.getNumericCellValue());
		 else if (cell.getCellType() == XSSFCell.CELL_TYPE_BOOLEAN) 
			cellValue = String.valueOf(cell.getBooleanCellValue());
		else if (cell.getCellType() == XSSFCell.CELL_TYPE_STRING) 
			cellValue = cell.getStringCellValue();
		else if (cell.getCellType() == XSSFCell.CELL_TYPE_FORMULA) 
			cellValue = String.valueOf(cell.getCellFormula());
		
		return cellValue;
	}
}


适配器


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * 读取excel适配器
 * @author Administrator
 *
 */
public class ReadExcelAdapter {

	private ReadExcelAdapter(){}
	/**
	 * 适配方法:可读取03版本和07版本的excel
	 * @return
	 */
	public static List<List<String>> readExcel(String filePath){
		InputStream is = null;
		try {
			is = new FileInputStream(filePath);
			return ReadExcel03.readExcel(is);
		} catch (Exception e) {
			try {
				is = new FileInputStream(filePath);
				return ReadExcel07.readExcel(is);
			} catch (FileNotFoundException e1) {
				e1.printStackTrace();
			} catch (IOException e3) {
				e3.printStackTrace();
			}
		}
		return null;
	}
}
测试类



import java.util.List;

public class ReadExcelTest {
	public static void main(String[] args) throws Exception {

		long startTime = System.currentTimeMillis();

		List<List<String>> result =  ReadExcelAdapter.readExcel("C:/test.xlsx");
        System.out.println(result);
        
		System.out.println("use time:"+ (System.currentTimeMillis() - startTime));
	}
}

 

0
2
分享到:
评论

相关推荐

    poi3.9读写excel兼容03和07版本

    "poi3.9读写excel兼容03和07版本"这个标题指的是使用Apache POI 3.9版本的API,能够兼容两种不同格式的Excel文件:.xls(Excel 2003及更早版本)和.xlsx(Excel 2007及更高版本)。 在描述中提到的"完美修订版本...

    java excel操作 poi-3.17 可用于jdk1.70

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 HSSF - 提供读写Microsoft Excel格式档案的功能。 XSSF - 提供读写Microsoft Excel OOXML格式档案...

    POI操作EXCEL,支持office2003,2007,2010,2013(详)

    这个“POI操作EXCEL,支持office2003,2007,2010,2013(详)”的主题涵盖了一系列知识点,旨在帮助开发者熟练地使用Apache POI处理不同版本的Excel文件。 首先,我们来看Excel的两种主要文件格式:`.xls`(Excel 97-...

    SpringBoot使用poi实现Excel导入与导出

    Apache POI是一个流行的API,它允许程序员创建、修改和显示Microsoft Office格式的文件,其中包括Excel(.xls和.xlsx)文件。在这个场景下,我们使用的POI版本是3.17,一个稳定且广泛使用的版本。 首先,我们需要在...

    ExcelUtils源码包,将依赖的POI2.5.1升级为高版本的POI

    然而,POI 2.5.1版本相对较老,不支持处理Excel 2007及以上版本创建的高版本Excel文件(XLSX格式),这限制了其在现代开发环境中的应用。 Apache POI是一个强大的库,不断更新以适应新的Office文件格式。为了能够...

    POI 完美生成带文字水印的excle,可以完美打印

    Apache POI是一个开源项目,它提供了API来读取、写入和修改Microsoft Office格式的文件,包括Excel、Word和PowerPoint。对于Excel,Apache POI支持HSSF(处理旧的BIFF格式,即.XLS)和XSSF(处理新的XML格式,即....

    自定义easyExcel226

    Apache POI是Java语言中用于读写Microsoft Office格式文件的库,而EasyExcel是阿里巴巴开源的一款轻量级、高效的Excel处理工具,它简化了对Excel数据的读写操作。 在原版`easyExcel`的基础上,开发者进行了以下主要...

    poi-scratchpad-3.12-20150511和poi-3.12-20150511包

    这两个库共同提供了对Excel文件的全面支持。 3. **POI-SXSSF**: SXSSF是提供内存优化的Excel处理API,特别适合处理大型工作簿,因为它可以将大部分数据写入磁盘,而不是全部保留在内存中。 4. **POI-SS**: 这是...

    android代码直接在poi框架写入图表曲线excel

    Apache POI提供了HSSF(Horizontally SpreadSheet Format)和XSSF(XML Spreadsheet Format)两个组件,分别用于处理.xls(老版本Excel)和.xlsx(新版本Excel)文件。XSSF支持更丰富的功能,包括创建图表。在创建...

    java poi 获取excel中的图片(包含wps中嵌入单元格图片)

    在Java编程中,Apache POI库是一个非常流行的API,用于读写Microsoft Office格式的文件,包括Excel。...通过理解上述概念,你可以构建或扩展自己的工具,以满足对各种Excel和WPS文件的图片提取需求。

    poi3.9 依赖的jar包

    版本3.9是POI的一个稳定版本,发布于2013年,它包含了对Office文件格式处理的多项改进和修复。 Apache POI 3.9的依赖jar包通常包括以下几个核心组件: 1. **poi-3.9.jar**:这是Apache POI的核心库,包含了处理...

    java 导入Excel 文件,支持xls、xlsx、csv格式

    综上所述,Java导入Excel文件涉及的关键技术包括Apache POI库的使用,对HSSF和XSSF的理解,以及对CSV文件处理的技巧。通过熟练掌握这些知识,你可以编写出高效且健壮的文件导入程序,满足各种需求。

    大数据Excel通过POI导入数据库通用设计方案

    1. **读取Excel**:使用Apache POI库解析Excel文件,获取标题行和数据行。 2. **验证规则**:根据数据导入规则检查Excel数据的合法性。 3. **数据转换**:将Excel数据转换为符合数据库表结构的对象。 4. **处理重复...

    Springboot+Security+webSocket+POI+VUE.rar

    在这个项目中,POI可能用于处理数据导入导出,例如,从Excel文件中读取员工信息,或者将系统数据导出为Excel报告,方便数据分析和存储。 Vue.js是一个流行的前端JavaScript框架,以其简单易用、高性能和灵活的组件...

    Android_POI_TO_PPT

    总之,"Android_POI_TO_PPT"项目旨在帮助开发者在Android应用中实现PPT文件的读取和转换,尽管目前只支持旧版PPT,但其核心思想和实现方法对处理PPTX同样具有参考价值。如果你对此感兴趣,可以通过提供邮箱或QQ联系...

    Android使用读取Excel文件.pdf

    在Android应用开发中,有时需要处理来自用户的Excel文件...总之,Android应用可以通过引入第三方库,如Apache POI,实现对Excel文件的读取和创建。在使用过程中,注意兼容性、性能和安全性问题,以提供良好的用户体验。

    Java对Excel数据导入导出工具类(含Exel单元格样式设置)

    在这个案例中,我们使用的是jxl库,这是一个轻量级的库,适用于Java平台,支持读取和写入Excel 97-2003格式的文件。 2. **jxl库介绍**: - jxl库提供了一系列API,使得开发者可以方便地创建、修改和读取Excel文件...

    导入导出Excel方法,很详细

    总结来说,导入导出Excel是数据处理的重要环节,涉及到对Excel文件的操作,包括读取、写入和格式设置。选择合适的库,创建有效的模板,以及使用预先封装好的工具类,都能帮助我们高效地完成这项任务。在实际项目中,...

    安卓Excelwordppt文档读写相关-安卓读取Excel文件获取表格数据.zip

    在描述中提到,程序可能需要自行调整才能运行,这可能是因为每个应用的环境和需求不同,可能需要对代码进行适配,例如处理不同的文件路径、文件格式或特定的数据解析逻辑。此外,“部分代码功能进行参考学习”提示...

    应用源码之安卓读取Excel文件获取表格数据.zip

    首先,让我们了解一下Android系统对Excel文件的支持。Android本身并不直接支持读取Microsoft Excel文件,因此我们需要借助第三方库,如Apache POI。Apache POI是一个用于处理Microsoft Office格式文件的Java API,...

Global site tag (gtag.js) - Google Analytics