Java POI利用反射导入导出Excel、Jxls实现Excel模板导出

告别繁琐代码:Java 导出 Excel 的终极解决方案 JXLS 摘要: JXLS 是一个基于模板的 Excel 导出工具,能显著简化 Java 开发中的报表生成。相比传统 Apache POI 手动编码方式,JXLS 通过 Excel 模板定义样式和结构,代码仅需绑定数据,解决了硬编码维护难、动态列处理复杂等问题。核心功能包括循环填充(jx:each)、条件判断(jx:if)、分组排序、合并单元格及公式支持,覆盖 90% 实际场景。优势包括开发效率高、维护成本低,并支持流式处理优化大数据量导出。示例代码演示了从模板设计到数据绑定的完整流程,适合需要灵活、可维护的 Exc 阅读详情

初衷:项目中一直没有一个好用的Excel导入导出功能。所以简单实现了导入导出功能分享大家一起讨论和学习

关于本项目说明

  1. 导入:基于poi导入做了一层封装、支持注解方式标识属性对应Excel列、并支持简单规则校验、提供校验规则自定义
  2. 两种导出:一种基于poi的导出,一种基于jxls模板导出。jxls模板导出可参考:jxls说明
  3. 别的就不多BB了,直接上代码。源码包可直接下载使用:点我取源码 没有过多的文字说明,全是代码下载看源码便知

1、基于maven项目的添加依赖,POM依赖如下

<!-- Excel poi文件处理 -->
	<dependency>
		<groupId>commons-beanutils</groupId>
		<artifactId>commons-beanutils</artifactId>
		<version>1.8.0</version>
	</dependency>
	<dependency>
		<groupId>org.apache.poi</groupId>
		<artifactId>poi-ooxml</artifactId>
		<version>3.9</version>
	</dependency>
	<!-- Excel模板导出依赖 -->
	<dependency>
		<groupId>net.sf.jxls</groupId>
		<artifactId>jxls-core</artifactId>
		<version>1.0.6</version>
	</dependency>
	<dependency>
		<groupId>net.sf.jxls</groupId>
		<artifactId>jxls-reader</artifactId>
		<version>1.0.6</version>
	</dependency>
	<dependency>
	    <groupId>org.apache.ant</groupId>
	    <artifactId>ant</artifactId>
	    <version>1.9.4</version>
	</dependency>

 2、Excle导入类ExcelException.java,ExcelFieldMeta.java,ExcelUtil.java。入口类为ExcelUtil.java提供各种静态方法

ExcelUtil.java

/**
 * Excel导入
 * 
 * @author http://blog.youkuaiyun.com/make_a_difference
 */
@SuppressWarnings("unchecked")
public class ExcelUtil {

	private static Log logger = LogFactory.getLog(ExcelUtil.class);

	// 换行标识
	private final static String ENTER_STR = "\n";

	/**
	 * 默认解析Excel第一个sheet页
	 * 
	 * @param is
	 *            输入流
	 * @param startRow
	 *            开始解析行
	 * @param clazz
	 *            实体类
	 * @return
	 * @throws ExcelException
	 */
	public static <T> List<T> excelParsing(InputStream is, Integer startRow, Class<T> clazz) throws ExcelException {
		return excelParsing(is, 1, startRow, clazz);
	}

	/**
	 * 默认解析Excel第一个sheet页
	 * 
	 * @param is
	 *            输入流
	 * @param startRow
	 *            开始解析行
	 * @param clazz
	 *            实体类
	 * @return
	 * @throws ExcelException
	 * @throws FileNotFoundException
	 */
	public static <T> List<T> excelParsing(File file, Integer startRow, Class<T> clazz) throws ExcelException {
		FileInputStream is;
		try {
			is = new FileInputStream(file);
		} catch (FileNotFoundException e) {
			logger.error("Excel文件异常", e);
			throw new ExcelException("Excel文件异常");
		}
		return excelParsing(is, 1, startRow, clazz);
	}

	/**
	 * 解析Excel
	 * 
	 * @param is
	 *            输入流
	 * @param sheetIndex
	 *            sheet页数
	 * @param startRow
	 *            开始解析行
	 * @param clazz
	 *            实体类
	 * @return
	 * @throws ExcelException
	 */
	public static <T> List<T> excelParsing(InputStream is, Integer sheetIndex, Integer startRow, Class<T> clazz)
			throws ExcelException {
		// 1: 获取工作簿
		Workbook wb = null;
		try {
			wb = ExcelUtil.getWorkbook(is);
		} catch (Exception e) {
			logger.error("系统解析Excel获取WorkBook错误", e);
			throw new ExcelException("系统解析Excel错误");
		}
		// 2:获取第一个sheet页码
		Sheet sheet = wb.getSheetAt(sheetIndex - 1);
		return doParsing(sheet, startRow, clazz);
	}

	@SuppressWarnings("rawtypes")
	private static <T> List<T> doParsing(Sheet sheet, Integer startRow, Class<T> clazz) throws ExcelException {
		StringBuffer errorMessage = new StringBuffer("");
		// 1:获取sheet页的总行数
		int lastRow = sheet.getLastRowNum();
		// 2: 行解析,默认从0开始,startRow属性定义了数据从该行开始解析,程序中定义的行数从1开始算,所以此处要-1
		List resultList = new ArrayList(3);
		try {
			for (int rowIndex = startRow - 1; rowIndex <= lastRow; rowIndex++) {
				Row row = sheet.getRow(rowIndex); // 得到 第 n 行
				// 2.1获取的列为空则跳出循环
				if (row == null) {
					continue;
				}
				// 2.2 解析对象
				Object rowBean = clazz.newInstance();
				String rowErrorMessage = check(row, rowIndex, rowBean);
				// 2.3 如果返回的不是null,则存在错误信息则记录错误信息
				if (r
基于JXLS的Java Excel导入导出完整示例项目 / 使用OGNL直接求值代码逻辑逐行分析:1. 创建一个PoiContext对象,它是JXLS中用于存储变量的上下文容器;2. 将user对象注入上下文,键名为”user”;3. 定义一个OGNL表达式字符串,检查用户是否有Java技能;4. 调用执行表达式求值,传入表达式和变量映射;5. 强制转换结果为布尔值,判断条件是否成立;6. 打印输出结果。此机制允许在模板外预计算复杂条件,或将结果作为jx:if。 阅读详情

相关推荐

Apache POI大数据量Excel导出:SXSSFWorkbook内存优化与ZIP打包实战

Excel导出是Java后端高频遇到的工程需求,而Apache POI作为操作Office文档的主流工具,其API体系与内存模型直接决定了大数据场景下的稳定性。从HSSF、XSSF到SXSSFWorkbook,POI提供了从全量加载到流式写入的演进路径。SXSSFWorkbook通过滑动窗口机制将超过阈值的行刷新至磁盘临时文件,从而将内存占用控制在恒定水平,有效规避了内存溢出风险。结合分批查询、窗口大小调优、临时文件清理等工程实践,可支撑百万行数据的稳定导出。同时,借助java.util.zip将多Shee

weixin_31315567的博客 127

文件导入导出工具类和自定义注解

文件导入导出工具类,以及自定义导出字段注解;文件导入导出工具类,以及自定义导出字段注解;

commons-jexl-2.0.jar

org.apache.commons commons-jexl 2.0

使用net.sf.jxls下的jxls-core包进行复杂的Excel导出

使用net.sf.jxls下的jxls-core包进行复杂的Excel导出

SpringBoot快速集成jxls-poi(自定义模板,支持本地文件导出,在线文件导出)

主要介绍了SpringBoot快速集成jxls-poi(自定义模板,支持本地文件导出,在线文件导出),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

【C++PTA】6-1 Point类的运算 (10 分)

定义Point类,有坐标x,y两个私有成员变量;对Point类重载“+”(相加)、“-”(相减)和“==”(相等)运算符,实现对坐标的改变,要求用友元函数和成员函数两种方法实现。对Point类重载<<运算符,以使得代码 Point p; cout<<p<<endl;可以输出该点对象的坐标。 函数接口定义: 实现Point类。 裁判测试程序样例: /* 请在这里填写答案 */ int main(int argc, char const *argv[]) { P

libertye的博客 2367

TI电机驱动应用中MOSFET选型完整指南

深入解析TI电机驱动设计中MOSFET的选型关键,涵盖参数匹配、热性能与开关效率,帮助工程师优化系统性能并提升能效,是掌握MOSFET应用的核心参考。

weixin_42263617的博客 1268

cesium 高程数据使用

cesium 高程数据使用高程数据下载高程数据切片简单数据服务 高程数据下载 使用地理空间数据云平台免费提供的高程数据。地理空间云平台 点击列表中的下载得到数据压缩包。例如:ASTGTM2_N22E114.zip 高程数据切片 使用cesium实验室工具对下载得到的压缩包进行切片。cesium实验室 切片得到的文件夹目录。 简单数据服务 使用nodejs的koa启动简单的资源服务。koajs 项目根目录新建data文件夹,在新建dem文件夹放高程数据。 注意目录自行更换,这里是./data/dem

哎哟这个凉白白的博客 1811

XGBoost的简单安装及入门使用

XGBoost安装及简单入门 XGBoost支持多种操作系统,如Windows, Linux, MacOS等,并支持多种语言版本,如Python, R, Scale, Java等。XGBoost的安装方式一般有两种,一种是直接通过pip安装(适合用于Python),另外一种是通过源码编译安装 1、通过pip安装 通过pip安装Python包既简单又方便,只需执行如下的命令: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xgboost 使用

qq_41513230的博客 3万+

Redhawk解析PAD / IOPAD的实现方法

Redhawk解析IOPAD的实现方法1. IOPAD DEF的概念说明2. 生成 IOPAD GDS文件3. 生成 IOPAD DEF文件4. Redhawk解析过程中读取IOPAD DEF 本文主要简述【Redhawk解析IOPAD】的实现原理方法,具体脚本没有放在这里。 1. IOPAD DEF的概念说明 2. 生成 IOPAD GDS文件 注: getinfo2IODEF.tcl 是基于innovus获取IOPAD的摆放信息以及库信息。 run_cerate_iopadgds.csh 是基于c

kobayashiyou的博客 3153

上海市大数据中心笔试模拟试卷

为帮助考生熟悉上海市大数据中心笔试的题型、考点及答题逻辑,以下整理了一份的模拟试卷,涵盖大数据专业知识、行政职业能力测试(行测)、公共基础知识(含上海本地政策)三大核心模块,并附详细答案解析。

一叶之秋的博客 1813

基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(一)

基于若依的ruoyi-nbcio-plus支持VForm3表单字段数据保存到数据库的一种方法——全网首创(一)

宁波阿成的博客 658

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

上一篇: Java使用openoffice将office系列文档转换为PDF
下一篇: Windows安装node.js、npm、cnpm
make_a_difference
博客等级 码龄14年 10粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值