- 浏览: 58448 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
下面这个工具类是今天半天的劳动成果。
以后自己也可能用得到。在此做一个记录。涉及公司的信息的代码以及注释已经删除。哈哈。。。。
依赖了开源的POI工具包,网址:http://poi.apache.org/
这个工具类自己还没经过严格测试,简单测了一下,大体差不多是OK 的。
源码中注释掉的部分即为测试代码
上源码罗:
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; 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.springframework.util.CollectionUtils; /** * 生成Excel报表工具类 */ public class ExcelProductUtil { /** * 生成列数固定格式的报表 * * @param contentList 报表的内容 * @param title 报表头描述以及T对象的属性描述 * Map<String,String>:key : T对象的属性描述 * value:报表头文字描述 * @param seq 关联属性在报表中出现的顺序 * Map<String,String>:key : T对象的属性描述 * value:属性对应的顺序 * @param sheetName sheet的名称 * @param rowNum 起始行(大于等于0) * * 注意: title与seq均不能为空 * seq中的key必须与title的Key完全一致 * seq中的value必须是从1开始的连续正整数 * title中的Key必须来自于T的属性名称 * */ public static HSSFWorkbook productReportSameColumn(List<? extends Object> contentList, Map<String, String> title, Map<String, Integer> seq, String sheetName, int rowNum) { //创建新的Excel工作薄 HSSFWorkbook workbook = new HSSFWorkbook(); try { //校验title中的属性值必须在T中存在 checkBeforeReportSameColumn(contentList, title, seq, sheetName, rowNum); HSSFSheet sheet = getSheet(sheetName, workbook); //生成报表的头部描述信息 createReportSameColumnHead(sheet, title, seq, rowNum); //生成报表的文件体 createReportSameColumnBody(sheet, title, contentList, seq, rowNum); } catch (Throwable e) { throw new RuntimeException(e); } return workbook; } /** * 创建新的Excel工作薄 * @param sheetName * @return */ private static HSSFSheet getSheet(String sheetName, HSSFWorkbook workbook) { HSSFSheet sheet = workbook.createSheet(sheetName); return sheet; } /** * 生成报表的文件体 * * @param workbook * @param title * @param contentList * @throws IllegalAccessException * @throws IllegalArgumentException */ private static void createReportSameColumnBody(HSSFSheet sheet, Map<String, String> title, List<? extends Object> contentList, Map<String, Integer> seq, int rowNum) throws IllegalArgumentException, IllegalAccessException { ++rowNum; for (Object content : contentList) { HSSFRow row = sheet.createRow(rowNum); Field[] fields = content.getClass().getDeclaredFields(); for (Field f : fields) { f.setAccessible(true); String name = f.getName(); if (title.containsKey(name)) { HSSFCell cell = row.createCell(seq.get(name)); cell.setCellValue((String) f.get(content)); } } ++rowNum; } } /** * 生成报表的头部描述信息 * * @param workbook * @param title */ private static void createReportSameColumnHead(HSSFSheet sheet, Map<String, String> title, Map<String, Integer> seq, int rowNum) { //获取排序之后的属性列表 List<Map.Entry<String, Integer>> headDesList = getSoredPropertisList(seq); HSSFRow row = sheet.createRow(rowNum); for (Map.Entry<String, Integer> entry : headDesList) { String headName = title.get(entry.getKey()); HSSFCell cell = row.createCell(entry.getValue()); cell.setCellValue(headName); } } /** * 获取排序之后的属性列表 * * @param seq * @return */ private static List<Map.Entry<String, Integer>> getSoredPropertisList(Map<String, Integer> seq) { List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(seq .entrySet()); //排序 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o1.getValue() - o2.getValue(); } }); return list; } /** * 校验title中的属性值必须在T中存在 * * @param contentList * @param title */ private static void checkBeforeReportSameColumn(List<? extends Object> contentList, Map<String, String> title, Map<String, Integer> seq, String sheetName, int rowNum) { if (CollectionUtils.isEmpty(contentList) || CollectionUtils.isEmpty(title) || CollectionUtils.isEmpty(seq) || StringUtil.isBlank(sheetName)) { throw new RuntimeException("传入参数不能为空!"); } if (rowNum < 0) { throw new RuntimeException("rowNum必须大于等于0!"); } //获取T的属性名称 List<String> propertiesNamesOfT = getTPropertiesName(contentList.get(0)); //获取title的属性名称 List<String> titlesNames = getTitleNames(title); //属性比较 compareProperties(propertiesNamesOfT, titlesNames); //seq中的key必须与title的Key完全一致 compareKey(title, seq); //seq中的value必须是从1开始的连续正整数 compareSeqValue(seq); } /** * seq中的value必须是从1开始的连续正整数 * * @param seq */ private static void compareSeqValue(Map<String, Integer> seq) { List<Map.Entry<String, Integer>> list = getSoredPropertisList(seq); if (list.get(0).getValue() != 1 || list.get(list.size() - 1).getValue() != list.size()) { throw new RuntimeException("seq中的value必须是从1开始的连续正整数"); } } /** * seq中的key必须与title的Key完全一致 * * @param title * @param seq */ private static void compareKey(Map<String, String> title, Map<String, Integer> seq) { Set<String> titleSet = title.keySet(); Set<String> seqSet = seq.keySet(); if (titleSet.size() != seqSet.size()) { throw new RuntimeException("seq中的key必须与title的Key必须完全一致!"); } Set<String> titleTempSet = new HashSet<String>(); titleTempSet.addAll(titleSet); titleTempSet.addAll(seqSet); if (titleTempSet.size() != seqSet.size()) { throw new RuntimeException("seq中的key必须与title的Key必须完全一致!"); } } /** * 属性比较:titlesNames是否在propertiesNamesOfT中存在 * * @param propertiesNamesOfT * @param titlesNames */ private static void compareProperties(List<String> propertiesNamesOfT, List<String> titlesNames) { List<String> tempPropertiesNamesOfT = new ArrayList<String>(); List<String> tempTitlesNames = new ArrayList<String>(); //对数组中的字符串转换成小写 for (String tName : propertiesNamesOfT) { String temp = tName.toLowerCase(); tempPropertiesNamesOfT.add(temp); } for (String tName : titlesNames) { String temp = tName.toLowerCase(); tempTitlesNames.add(temp); } if (!tempPropertiesNamesOfT.containsAll(titlesNames)) { throw new RuntimeException("title中的某些属性值在T对象中不存在!"); } } /** * 获取title的属性名称 * * @param title * @return */ private static List<String> getTitleNames(Map<String, String> title) { List<String> titleNames = new ArrayList<String>(); for (Map.Entry<String, String> entry : title.entrySet()) { titleNames.add(entry.getKey()); } return titleNames; } /** * 获取T的属性名称 * * @param t * @return */ private static List<String> getTPropertiesName(Object o) { List<String> list = new ArrayList<String>(); Field[] fields = o.getClass().getDeclaredFields(); for (Field f : fields) { f.setAccessible(true); list.add(f.getName()); } return list; } // private static class BankLog { // private String name; // private String password; // // public String getName() { // return name; // } // // public void setName(String name) { // this.name = name; // } // // public String getPassword() { // return password; // } // // public void setPassword(String password) { // this.password = password; // } // } // // public static void main(String[] args) throws Exception { // // List<BankLog> bankLog = new ArrayList<BankLog>(); // BankLog bankLog1 = new BankLog(); // bankLog1.setName("111"); // bankLog1.setPassword("222"); // BankLog bankLog2 = new BankLog(); // bankLog2.setName("0000"); // bankLog2.setPassword("333"); // bankLog.add(bankLog1); // bankLog.add(bankLog2); // // Map<String, String> title = new HashMap<String, String>(); // title.put("name", "名字"); // title.put("password", "密码"); // // Map<String, Integer> seq = new HashMap<String, Integer>(); // seq.put("name", 2); // seq.put("password", 1); // // String sheetName = "Sheet1"; // int rowNum = 1; // // HSSFWorkbook book = productReportSameColumn(bankLog, title, seq, sheetName, rowNum); // String filename = "text.xls"; // FileOutputStream fOut = new FileOutputStream(filename); // book.write(fOut); // fOut.flush(); // fOut.close(); // } }
发表评论
-
JVM参数以及调优
2011-10-24 23:39 848一、JVM配置参数中文说明: 1、-Xmixed ... -
分布式服务框架之NIO(一)
2011-10-22 23:08 1365NIO在实现分布式服务框架中非阻塞高并发的服务器端功能 ... -
Spring声明线程池配置示例
2011-09-13 14:19 780<bean id="***Ta ... -
HTTPS下载的问题
2011-08-31 17:18 1780遇到一个很恶心的问题,开发以及测试环境是http协议,下 ... -
实现自己的csv文件解析引擎
2011-08-26 14:29 1496前言: 这里仅仅支持Excel文件导出的CSV文件,解 ... -
迷茫了
2011-08-08 23:09 797又迷茫了,感觉没事可做,什么都不想做 实际并不是没事可做,实 ... -
正则表达式元字符总结
2011-07-14 23:22 968正则表达式元字符总结如下: 点号(.):任何单字符的通 ... -
多并发情况下日志信息中如何区分不同线程(客户端)调用
2011-07-13 21:57 1463在企业开发中,常常会遇到这样的需求:通过一个唯一标 ... -
windows下perl开发环境搭建
2011-07-09 22:07 69531、下载并安装ActivePerl,貌似不需要额外的配置,一步 ... -
如何让右键菜单出现“命令行在这里”,即cmd here
2011-06-29 00:24 4759要在命令行下跳转到某个嵌套很深的目录下时,使用cd命令等比 ... -
使用JMock简介
2011-06-28 13:36 1003一、常用关键字 one ... -
利用数据库锁实现简单的防并发编程
2011-06-22 23:27 1162大约有两类情况: 1、一个程序代码块同一时刻只允许一个 ... -
程序员如何减少BUG
2011-06-21 22:04 2548最近一个项目出了大量的BUG,很是惭愧,有没有可以尽量规避BU ... -
一些常用的正则表达式(项目中经常用到)
2011-06-15 17:11 8160最近做的一个内部系统项目,涉及大量的文本校验,里面用到了一些常 ... -
解析Excel文件转换科学计数法字符串为正常数字
2011-06-14 22:55 5691问题出现的情形是这样的: excel文件中某个字段,既 ... -
js正则表达式去除表单提交字符串前后的空格
2011-06-13 19:31 1486str为表单提交数据。 str=str.replace ... -
debug容器启动类报MMO异常解决办法
2011-06-10 19:58 771类似的,在eclipse的VM arguments中设置参数: ... -
理想的设计特征
2011-06-09 00:57 743其实下面这些是来自于代码大全,觉得讲得实在是精辟无比,想摘抄下 ... -
最近的几点关于编码的心得
2011-05-25 00:35 6881、编写一个类或者新建一个变量的时候,名字问题需要仔细的斟酌斟 ... -
JMS实现简单的聊天程序
2011-05-15 19:30 6074实现这个简单的聊天 ...
相关推荐
本篇文章将深入探讨“C#通用Excel导入导出工具类”的实现原理及应用,主要涉及的技术点包括反射、特性以及如何创建一个高效的Excel导入导出解决方案。 首先,我们要理解反射在C#中的作用。反射是一种强大的机制,它...
5. **公式支持**:支持在单元格中插入和计算Excel公式,这对于数据分析和报表生成非常有用。 6. **行列操作**:插入、删除、移动行列,以及获取特定行或列的数据。 7. **批量数据处理**:对于大量数据的导入导出,...
在Java编程环境中,导出Excel文档是一项常见的任务,特别是在数据处理、报表生成和数据分析等领域。为了简化这个过程,开发者通常会创建一个通用的工具类,以便在不同的项目中复用相同的代码逻辑。"java导出excel...
在Java编程中,将List集合数据导出到Excel表格是一个常见的需求,特别是在数据分析、报表生成或数据导出等场景。本实例提供了一个通用工具类,能够处理多种不同类型的对象集合,实现了最大化的通用性,使得开发者...
1. HTML报表生成:HTML是一种通用的网页标记语言, Reports工具类能将数据转换为HTML格式,方便在Web环境下展示。这通常涉及到DOM(文档对象模型)解析、CSS样式设计和JavaScript交互。通过这种方式,用户可以在线...
在IT行业中,Excel数据导出是一项常见的需求,特别是在数据分析、报表生成和数据交换等领域。"EXCEL数据导出工具类"就是为此目的设计的,它简化了从程序中导出数据到Excel文件的过程。让我们详细了解一下这个工具类...
- 这些工具类在日常开发中非常实用,比如在数据处理、报表生成、文件系统交互等场景。 - 对于企业级应用,可以作为公共服务层的一部分,提供统一的API供其他模块调用,降低代码的耦合度。 6. **集成与使用**: -...
本资源提供了一个基于Java实现的Excel导入导出工具类,结合注解的使用,使得这一功能更加便捷和通用。这个工具适用于构建公共的Excel处理模块,能够有效地提高开发效率。 首先,我们来看一下导入导出的基本原理。在...
### 基于OWC组件生成下载Excel报表的实例分析 #### 一、引言 在Web应用程序开发过程中,提供Excel报表给客户端下载是一项常见需求。这类应用通常涉及后端数据库(例如SQL Server),用于存储数据,并允许用户进行...
标题中的“生成excel报表(poi)公用方法AExcuteExcel”指的是使用Apache POI库来创建Excel报表的一个通用方法,名为“AExcuteExcel”。Apache POI是Java领域中广泛使用的库,它允许开发者读写Microsoft Office格式...
导出Excel功能通常涉及到读取和写入Excel文件,这在数据分析或报表生成中非常常见。这类工具类可能包含如`ExportToExcel`方法,能够将数据集合转换为Excel格式,便于用户进行查看和分析。 验证码类通常用于网站安全...
本主题将深入探讨“ABAP EXCEL通用类”——ZCL_EXCEL,它是SAP ABAP开发者用于处理Excel文件的一个强大工具。ZCL_EXCEL类允许程序员在后台生成、读取和修改Excel文件,从而实现与Microsoft Excel的数据交互。 首先...
本工具是基于Java反射机制实现的通用Excel导入导出类,它提供了便捷的方式来读取和写入Excel文件,适用于多种场景。下面我们将深入探讨这个工具的工作原理、使用方法以及相关的Java Excel处理知识。 1. **Java反射...
在Java编程中,导出Excel文件是常见的数据处理任务,特别是在数据分析、报表生成或数据交换等场景。这里我们将深入探讨如何使用Java实现XML到Excel的转换以及如何创建一个通用的Excel导出工具类。首先,我们需要理解...
本实用工具类利用Java编程语言中的泛型、反射和Apache POI库,实现了对Excel表格的强大功能,以适应各种实体封装的报表表格需求。 首先,让我们深入理解一下核心概念: 1. **泛型**:Java泛型是一种在编译时检查...
在Java编程环境中,处理Excel文件是一项常见的任务,尤其是在数据处理、报表生成以及数据导入导出等场景中。JXL库是Java中一个广泛使用的库,它允许开发者方便地读取和写入Excel文件,而无需依赖Microsoft Office。...
- **BIRT Project**:一款流行开源报表开发工具,界面操作类似Dreamweaver,支持图片生成、Excel及HTML导出,样式与脚本设置简便。 - **Pentaho Report Designer**:所见即得的开源报表设计工具,提供丰富的控件...
标题 "多功能通用Excel导入导出数据" 描述的是一个针对Excel数据处理的工具或库,它已经被二次封装,简化了导入导出操作。用户只需引入指定的jar包,并通过一行代码即可实现数据的导入和导出功能。描述中强调了其...
5. 输出的Excel报表文件,如`report.xlsx`,展示了使用JXL生成的最终报表。 总的来说,这个主题涉及的关键知识点包括: 1. 数据库报表工具的通用性:如何选择和使用能跨平台、跨数据库的报表工具。 2. JXL库:了解...
使用这个通用类,开发者可以轻松地将业务数据导出为Excel,无论是简单的数据展示还是复杂的报表生成,都能得心应手。在实际应用中,还可以根据具体需求扩展功能,例如添加排序、过滤、图表生成等。 综上所述,"c# ...