Java 利用POI读取Excel 代码示例

news/2024/7/21 5:52:46 标签: poi, excel, java

以下代码是在maven工程中编写,maven地址

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.15</version>
</dependency>

代码示例 可读取合并单元格的信息

java">public class PoiUtils {
	private static NumberFormat numberFormat = NumberFormat.getInstance();
	static {
		//关闭分组显示
		numberFormat.setGroupingUsed(false);
	}

	/**
	 * @Comments :读取Excel文件
	 * @param file 待读取的文件(通过前端上传的文件信息)
	 * @param heads 表头对应的值,用于返回map的key
	 * @param startRows 起始行
	 * @param startCols 起始列
	 * @return
	 * @Author :乐享生活522
	 * @Date :2019年10月15日 下午7:46:23
	 */
	public static List<Map<String, Object>> readExcelFile(MultipartFile file, String[] heads, int startRows, int startCols) {
		InputStream fis = null;
		Workbook book = null;
		String fileName = file.getOriginalFilename();
		String fileType = fileName.substring(fileName.lastIndexOf(".") + 1);
		Map<String, Object> mergeRowsMap = new HashMap<>();
		List<Map<String, Object>> rowList = new ArrayList<>();
		try {
			fis = file.getInputStream();
			if (fileType.equals("xls")) {
				book = new HSSFWorkbook(fis);
			} else if (fileType.equals("xlsx")) {
				book = new XSSFWorkbook(fis);
			} else {
				return null;
			}
			Sheet sheet = book.getSheetAt(0);
			int totalRows = sheet.getLastRowNum() + 1;//获取最后一行的序号(总行数)
			for (int i = startRows; i < totalRows; i++) {
				Row row = sheet.getRow(i);
				if (row != null) {
					Map<String, Object> rowMap = new HashMap<>();
					for (int j = startCols; j < heads.length; j++) {
						Cell cell = row.getCell(j);
						String cellValue = "";
						if (cell != null) {
							switch (cell.getCellType()) {
							case Cell.CELL_TYPE_STRING:
								cellValue = cell.getStringCellValue();
								break;
							case Cell.CELL_TYPE_NUMERIC:
								if (DateUtil.isCellDateFormatted(cell)) {
									cellValue = DateUtils.format(DateUtil.getJavaDate(cell.getNumericCellValue()), Pattern.YMD);
								} else {
									cellValue = numberFormat.format(cell.getNumericCellValue());
								}
								break;
							case Cell.CELL_TYPE_BOOLEAN:
								cellValue = cell.getBooleanCellValue() ? "是" : "否";
								break;
							case Cell.CELL_TYPE_FORMULA:
								cellValue = cell.getCellFormula();
								break;
							case Cell.CELL_TYPE_BLANK:
								cellValue = "";
								break;
							case Cell.CELL_TYPE_ERROR:
								cellValue = "非法字符";
								break;
							default:
								cellValue = "";
								break;
							}
						}
						Map<String, Object> mergeCellMap = isMergedRegion(sheet, i, j);
						if (MapUtils.isNotEmpty(mergeCellMap)) {
							int firstRow = MapUtils.getIntValue(mergeCellMap, "firstRow");
							int firstColumn = MapUtils.getIntValue(mergeCellMap, "firstColumn");
							int lastRow = MapUtils.getIntValue(mergeCellMap, "lastRow");
							if (StringUtils.isEmpty(cellValue) && firstRow < i && lastRow >= i && firstColumn == j) {
								cellValue = MapUtils.getString(mergeRowsMap, heads[j], "");
							} else {
								mergeRowsMap.put(heads[j], cellValue);
							}
						}
						/*if (mergeList.contains(heads[j])) {//存在合并列中
							if (StringUtils.isEmpty(cellValue)) {
								cellValue = MapUtils.getString(mergeRowsMap, heads[j], "");
							} else {
								mergeRowsMap.put(heads[j], cellValue);
							}
						}*/
						rowMap.put(heads[j], cellValue);
					}
					rowList.add(rowMap);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (book != null) {
				try {
					book.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (fis != null) {
				try {
					fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return rowList;
	}

	/**
	 * @Comments :判断当前单元格是否合并
	 * @param sheet
	 * @param row 当前行
	 * @param column 当前列
	 * @Author :乐享生活522
	 * @Date :2019年10月15日 下午7:15:13
	 */
	private static Map<String, Object> isMergedRegion(Sheet sheet, int row, int column) {
		int sheetMergeCount = sheet.getNumMergedRegions();
		for (int i = 0; i < sheetMergeCount; i++) {
			CellRangeAddress range = sheet.getMergedRegion(i);
			int firstColumn = range.getFirstColumn();
			int lastColumn = range.getLastColumn();
			int firstRow = range.getFirstRow();
			int lastRow = range.getLastRow();
			if (row >= firstRow && row <= lastRow) {
				if (column >= firstColumn && column <= lastColumn) {
					Map<String, Object> resultMap = new HashMap<>();
					resultMap.put("firstRow", firstRow);
					resultMap.put("lastRow", lastRow);
					resultMap.put("firstColumn", firstColumn);
					return resultMap;
				}
			}
		}
		return null;
	}

}

http://www.niftyadmin.cn/n/648027.html

相关文章

魔兽,召唤燃情岁月

最近魔兽上映了&#xff0c;4S 店本来组织了首映日会员包场观影活动&#xff0c;我提前了好几天报名居然全报满了&#xff0c;这倒是出乎预料之外&#xff0c;以前从没碰到过。本来是不敢对这部电影抱有太高期望的&#xff0c;怕是期望越高而失望也越高&#xff0c;毕竟在游戏改…

Java lambda表达式 排序、分组、循环、截取

List 循环 list.forEach(map -> {//此处可以对map进行操作 });根据【A属性的值】对List进行分组 //stream()方法不会改变原有tempList Map<String, List<Map<String, Object>>> tempMap tempList.stream().collect(Collectors.groupingBy(map -> Ma…

JavaScript基础教程1-20160612

1.javascript是一门浏览器运行的脚本语言和java没关系 2.javascript语言写在哪里&#xff1f; &#xff08;1&#xff09;可以写单独的文件里面去调用(推荐采用此方法) index.html <head><script src"20160612.js"></script> </head>2016061…

紫橙绿蓝的jQuery幻灯片切换

效果展示 http://hovertree.com/texiao/jquery/77/看惯了左右切换的幻灯片&#xff0c;何问起向您推荐一个新颖的&#xff0c;旋转切换&#xff0c;通过点击按钮的相应区域可以使幻灯片以旋转的方式来切换图片&#xff0c;非常有创意。点击哪个颜色就切换到那个颜色&#xff0c…

Ext Js Grid实现动态添加列

最近工作中&#xff0c;客户要求实现自定义列的效果&#xff0c;可根据设置进行页面表格的动态加载&#xff0c;数据库中列的存储方式为单行对应表格中的单列 数据库查询列集合 --由于Oracle默认对查询结果的key进行转大写处理&#xff0c;但Extjs中列的属性不符合要求&#…

CentOS6.5 Python 2.7.11+IPython 4.2.0安装

1、下载Python2.7.11https://www.python.org/downloads/release/python-2711/ 解决一个依赖关系 yum install readline-devel解压、安装tar xvf Python-2.7.11.tar.xzcd Python-2.7.11./configure --prefix/usr/local/python27make&&make install2、下载ipython…

Python 变量的引用以及是否可变

变量进阶01.变量的引用1.1 引用的概念1.2 变量引用 的示例1.3 函数的参数和返回值的传递02.可变和不可变类型03.局部变量和全局变量3.1 局部变量3.2 全局变量01.变量的引用 变量 和 数据 都是保存在 内存 中的在Python中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.…

SQL技巧之分类汇总

数据表结构username type numaaaa 玉米 1212aaaa 玉米 212bbb 小麦 2323bbb .... 只有两种产品 玉米和小麦&#xff0c;玉米价格1.5&#xff0c;小麦价格1.2 求总价值&#xff1f; with a as( select type,sum(num) as num from foods group by type),b as( select t…