`

excel的操作相关的---读取excell内容

 
阅读更多
package com.zte.xh.fund.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
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.Cell;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.mysql.jdbc.StringUtils;

/**
 * 读取excell的工具类
 * 
 * @author Jay_Lee
 *
 */
public class ExcellUtil {
	private static XSSFWorkbook xssfWorkbook;
	private static HSSFWorkbook hssfWorkbook;

	/**
	 * 向外提供的调用接口,根据后缀名判断不同的excell文件调用不同方法
	 * 
	 * @param path
	 * @throws IOException
	 */
	public static List<Map<String, String>> startRead(String path)
			throws IOException {
		String fileType = path.substring(path.lastIndexOf(".") + 1,
				path.length());
		List<Map<String, String>> result = new ArrayList<Map<String, String>>();
		if (fileType.equalsIgnoreCase("XLSX")) {
			result = readXlsx(path, findXlsxStartEnd(path));
		} else {
			result = readXls(path, findXlsStartEnd(path));
		}
		return result;
	}

	/**
	 * 找到xls文件的excell中有效数据的起始位置
	 * 
	 * @param path
	 * @throws IOException
	 */
	private static Map<String, Integer> findXlsStartEnd(String path)
			throws IOException {
		InputStream is = new FileInputStream(path);
		hssfWorkbook = new HSSFWorkbook(is);
		Map<String, Integer> resultNum = new HashMap<String, Integer>();
		// 循环工作表Sheet
		for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
			HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
			if (hssfSheet == null) {
				continue;
			}

			// 循环行Row
			for (int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
				HSSFRow hssfRow = hssfSheet.getRow(rowNum);
				if (hssfRow == null) {
					continue;
				}

				// 循环列Cell
				for (int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum++) {
					HSSFCell hssfCell = hssfRow.getCell(cellNum);
					if (hssfCell == null) {
						continue;
					}

					String value = getValueHssf(hssfCell).trim();
					// 如果这里读取出了账号,那么记录它的cell在每行的位置,以后直接读取下一行的此处
					if (value.equals("账号")) {
						resultNum.put("startRow", rowNum + 1);
						resultNum.put("startCell", cellNum);
					} else if (value.equals("说明")) {
						resultNum.put("endCell", cellNum);
						return resultNum;
					}
				}
			}
		}
		return null;
	}

	/**
	 * 读取xls的excell文件
	 * 
	 * @param path
	 * @return
	 * @throws IOException
	 */
	private static List<Map<String, String>> readXls(String path, Map startMap)
			throws IOException {
		List<Map<String, String>> accounts = new ArrayList<Map<String, String>>();
		Map<String, String> tempMap = null;
		int startRow = (int) startMap.get("startRow");
		int startCell = (int) startMap.get("startCell");
		int endCell = (int) startMap.get("endCell");
		InputStream is = new FileInputStream(path);
		hssfWorkbook = new HSSFWorkbook(is);
		// 循环工作表Sheet
		for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
			HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
			if (hssfSheet == null) {
				continue;
			}

			// 循环行Row
			for (int rowNum = startRow; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
				HSSFRow hssfRow = hssfSheet.getRow(rowNum);
				if (hssfRow == null) {
					continue;
				}
				tempMap = new HashMap<String, String>();
				// 循环列Cell
				for (int cellNum = startCell; cellNum <= endCell; cellNum++) {
					HSSFCell hssfCell = hssfRow.getCell(cellNum);
					String value = getValueHssf(hssfCell).trim();
					tempMap.put(String.valueOf(cellNum),
							StringUtils.isNullOrEmpty(value) ? "" : value);
				}
				accounts.add(tempMap);
			}
		}
		return accounts;
	}

	/**
	 * 读取cell中的不同类型的数据
	 * 
	 * @param hssfCell
	 * @return
	 */
	private static String getValueHssf(HSSFCell hssfCell) {
		if (hssfCell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
			return String.valueOf(hssfCell.getBooleanCellValue());
		} else if (hssfCell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
			return String.valueOf(hssfCell.getNumericCellValue());
		} else {
			return String.valueOf(hssfCell.getStringCellValue());
		}
	}

	/**
	 * 找到Xlsx文件的excell中有效数据的起始位置
	 * 
	 * @param path
	 * @return
	 * @throws IOException
	 */
	private static Map<String, Integer> findXlsxStartEnd(String path)
			throws IOException {
		xssfWorkbook = new XSSFWorkbook(path);
		Map<String, Integer> resultNum = new HashMap<String, Integer>();
		// 循环工作表Sheet
		for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
			XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
			if (xssfSheet == null) {
				continue;
			}

			// 循环行Row
			for (int rowNum = 0; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
				XSSFRow xssfRow = xssfSheet.getRow(rowNum);
				if (xssfRow == null) {
					continue;
				}

				// 循环列Cell
				for (int cellNum = 0; cellNum <= xssfRow.getLastCellNum(); cellNum++) {
					XSSFCell xssfCell = xssfRow.getCell(cellNum);
					if (xssfCell == null) {
						continue;
					}
					String value = getValueXssf(xssfCell).trim();
					// 如果这里读取出了账号,那么记录它的cell在每行的位置,以后直接读取下一行的此处
					if (value.equals("账号")) {
						resultNum.put("startRow", rowNum + 1);
						resultNum.put("startCell", cellNum);
					} else if (value.equals("说明")) {
						resultNum.put("endCell", cellNum);
						return resultNum;
					}
				}
			}
		}
		return null;
	}

	/**
	 * 通过起始位置读取xlsx中的数据
	 * 
	 * @param path
	 * @param startMap
	 * @return
	 * @throws IOException
	 */
	private static List<Map<String, String>> readXlsx(String path, Map startMap)
			throws IOException {
		List<Map<String, String>> accounts = new ArrayList<Map<String, String>>();
		Map<String, String> tempMap = null;
		InputStream is = new FileInputStream(path);
		xssfWorkbook = new XSSFWorkbook(path);
		int startRow = (int) startMap.get("startRow");
		int startCell = (int) startMap.get("startCell");
		int endCell = (int) startMap.get("endCell");
		// 循环工作表Sheet
		// 循环工作表Sheet
		for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
			XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
			if (xssfSheet == null) {
				continue;
			}
			// 循环行Row
			for (int rowNum = startRow; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
				XSSFRow xssfRow = xssfSheet.getRow(rowNum);
				if (xssfRow == null) {
					continue;
				}
				tempMap = new HashMap<String, String>();
				// 循环列Cell
				for (int cellNum = startCell; cellNum <= endCell; cellNum++) {
					XSSFCell xssfCell = xssfRow.getCell(cellNum);
					String value = getValueXssf(xssfCell).trim();
					tempMap.put(String.valueOf(cellNum),
							StringUtils.isNullOrEmpty(value) ? "" : value);
				}
				accounts.add(tempMap);
			}
		}
		return accounts;
	}

	@SuppressWarnings("static-access")
	private static String getValueXssf(XSSFCell xssfCell) {
		if (xssfCell.getCellType() == xssfCell.CELL_TYPE_BOOLEAN) {
			return String.valueOf(xssfCell.getBooleanCellValue());
		} else if (xssfCell.getCellType() == xssfCell.CELL_TYPE_NUMERIC) {
			return String.valueOf(xssfCell.getNumericCellValue());
		} else {
			return String.valueOf(xssfCell.getStringCellValue());
		}
	}

	/**
	 * 从Excel中读取管理员信息的格式化方法
	 * 
	 * @param xssfCell
	 * @return
	 */
	@SuppressWarnings("static-access")
	public static String getValueXssfFormat(XSSFCell xssfCell) {
		DecimalFormat df2 = new DecimalFormat("#");
		if (xssfCell.getCellType() == xssfCell.CELL_TYPE_BOOLEAN) {
			return String.valueOf(xssfCell.getBooleanCellValue());
		} else if (xssfCell.getCellType() == xssfCell.CELL_TYPE_NUMERIC) {
			return String.valueOf(df2.format(xssfCell.getNumericCellValue()));
		} else {
			return String.valueOf(xssfCell.getStringCellValue());
		}
	}

	/**
	 * 从Excel中读取管理员信息
	 * 
	 * @param path
	 * @return
	 * @throws IOException
	 */
	public static List<String> readXlsxFormat(String path) throws IOException {
		List<String> list = new ArrayList<String>();
		XSSFWorkbook xssfWorkbook = new XSSFWorkbook(path);
		// 循环工作表Sheet
		for (int numSheet = 0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++) {
			XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
			if (xssfSheet == null) {
				continue;
			}

			// 循环行Row
			for (int rowNum = 0; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
				XSSFRow xssfRow = xssfSheet.getRow(rowNum);
				if (xssfRow == null) {
					continue;
				}

				// 循环列Cell
				for (int cellNum = 0; cellNum <= xssfRow.getLastCellNum(); cellNum++) {
					XSSFCell xssfCell = xssfRow.getCell(cellNum);
					if (xssfCell == null) {
						continue;
					}
					list.add(getValueXssfFormat(xssfCell));
					System.out.print("   " + getValueXssfFormat(xssfCell));
				}
				System.out.println();
			}
		}
		return list;
	}

	/**
	 * 测试方法
	 * 
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		String path = "f:" + File.separator + "checkAccount.xls";
		List<Map<String, String>> lists = startRead(path);
		Map<String, String> tem = lists.get(0);
		System.out.println(tem.toString());
		System.out.println(lists.size());
	}
}
分享到:
评论

相关推荐

    2021-03-08 C# 读取Excell方法一.zip

    在C#中,有多种库可以用来操作Excel文件,如Microsoft.Office.Interop.Excel(需要安装Office)和更现代的、轻量级的库,如EPPlus或NPOI。描述中的“WindowsFormsApp1”可能是一个简单的Windows窗体应用程序,演示了...

    qt读取excel文件

    在Windows环境下,可以利用这个特性来操作Excel对象,如打开、读取、写入Excel文件。首先需要在.pro文件中包含QAxContainer模块: ```cpp QT += axcontainer ``` 3. **读取Excel文件**: 使用QAxObject创建一...

    C# Excel操作(读取/写入)

    C# 编写的操作Excel读取/写入动态库(COM/NPOI两种方式),个人推荐使用NPOI方式,因为COM方式存在无法关闭Excel进程的情况(个人体验COM方式效率有点低)。。。已设置0分,资源自取。

    php操作excel

    当我们需要处理Excel数据时,PHP提供了一些库和工具,帮助我们实现读取、写入和操作Excel文件。标题提到的“php操作excel”,主要是指使用PHP与Excel文件进行交互的能力。下面将详细阐述这一主题。 首先,描述中...

    vc 直接读取EXCELL的内容

    在VC++(Visual C++)开发环境中,直接读取Excel文件的内容...对于大型或频繁的读取操作,可以考虑使用第三方库如libxl、Apache POI或OpenXML SDK,这些库提供了更高效、轻量级的解决方案,且无需依赖Excel的运行环境。

    读取Excell内容到程序中(WinForm&WPF;)

    总的来说,读取Excel内容到WinForm或WPF程序中,需要考虑文件格式、性能优化以及错误处理等多个方面。通过选择合适的方法和库,我们可以高效、稳定地实现这一功能。在具体应用中,还可以结合实际业务逻辑,进一步对...

    RS232至excel数据保存

    本文将详细介绍如何利用C++实现从RS232接口读取数据,并将其保存到Excel文件中的过程。 #### 二、基础知识概述 在深入了解本项目的实现细节之前,我们需要先对几个关键概念有所了解: 1. **RS232**:这是一种标准...

    java读取excel数据!

    如果你的压缩包文件"ExcelWrite"包含示例代码或模板,你可以参照上述步骤理解并运行这些代码,以实现从Excel文件读取数据并进行操作的功能。在实际开发中,你可能需要根据具体需求对这些基本操作进行扩展,比如处理...

    excel+fft.zip_EXCEL FFT_EXCELL FFT_country6dm_labview_读取excel

    总的来说,这个"excel+fft.zip"压缩包中的内容涉及了Excel的数据存储、LabVIEW的编程能力以及FFT的信号处理技术,这些都是现代科研和工程实践中不可或缺的技能。掌握这些工具和技术,能帮助用户高效地处理和理解各种...

    C#读取EXCELL源码

    在C#编程环境中,Microsoft Office Interop 库为我们提供了一个接口来操作Excel文件,这使得开发者能够方便地读取、写入甚至修改Excel工作簿。本文将深入探讨如何使用C#进行Excel操作,并通过实例代码展示如何实现...

    C++通过WPS读取excel

    在C++编程环境中,使用WPS Office来读取Excel文件是一种常见的需求,特别是在Windows平台下。本篇将详细探讨如何利用Visual Studio 2010(VS2010)的MFC(Microsoft Foundation Classes)框架,通过WPS提供的API接口...

    用sql server读取和写入excel文件

    用sql server读取和写入excel文件,读取和写入数据非常方便,大批量数据导入与导出非常快

    使用EXCEL记录串口数据

    本文将详细讲解如何使用EXCEL来记录串口数据,并结合单片机AVR通过UART(通用异步收发传输器)发送的数据进行实际操作。 **一、EXCEL与串口通信** 1. **什么是串口通信?** 串口通信是设备间通过串行数据线进行...

    导入poi jar包实现使用Beanshell读写Excel文件

    在Java编程环境中,Apache POI库是一个非常实用的工具,它允许我们操作Microsoft Office格式的文件,特别是Excel(.xls和.xlsx)文件。在JMeter测试框架中,我们可以结合使用POI库和BeanShell组件来读取和写入Excel...

    iOS 读取execl文件内容

    这里提到的ZXLSXReader就是这样一个库,它允许开发者导入到Xcode项目中,方便地读取和操作Excel文件。 ZXLSXReader是一个轻量级的库,专注于解析.xlsx文件,而不是创建或编辑它们。它的工作原理是通过解析XML文件...

    vb打开excel并在datagridview显示

    为了从Excel读取数据并处理,代码使用了`OleDbDataAdapter`类来填充一个`DataSet`对象。`DataSet`是一个内存中的数据容器,它能够存储和管理来自多个数据源的数据。通过执行SQL查询`"select * FROM [Sheet1$]"`,`...

    vs2015+QT5操作Excel表格实现导入导出

    在本文中,我们将深入探讨如何使用Visual Studio 2015 (VS2015) 配合QT5库来操作Excel表格,实现数据的导入导出,以及增删功能。同时,我们还会关注如何利用QSS(Qt样式表)进行用户界面的美化。 首先,QT5是一个跨...

    CS架构读取EXCEL表格中数据

    本程序采用CS架构,读取EXCEL表格中的数据,在读取时,系统会自己遍历文件夹下面的所有文件。在将数据写入数据库时,会自动检测数据库是否存在,如果未有数据库,系统会提示用户是否新建数据库,如果新建,会提供...

    VC调用Excell操作

    "VC调用Excel操作"就是一种常见的技术,它允许Visual C++ (VC)应用程序与Microsoft Excel进行交互,以便读取、写入或处理Excel文件中的数据。这种技术在数据分析、报表生成以及自动化工作流中非常有用。 首先,让...

    Office_Excell_Read_excel_labview_

    总的来说,“Office_Excell_Read.vi”演示了如何使用Labview读取Excel文件的内容,这对于需要在Labview环境中处理Excel数据的工程应用非常有价值。通过学习和理解这个例子,你可以创建自己的Labview程序,实现更复杂...

Global site tag (gtag.js) - Google Analytics