- 浏览: 41895 次
- 性别:
- 来自: 天津
最新评论
-
从零开始单排有人帮:
细粒度的控制,我想了一个方式:所有资源有一个唯一的uuid标识 ...
Spring Security ,Apache Shiro的对比及数据级权限实现 -
jackyrong:
eya 写道dancewing 写道 在业务层,可以通过Sec ...
Spring Security ,Apache Shiro的对比及数据级权限实现 -
jackyrong:
请教下,数据权限的话,你是用AOP的方法,注入权限规则的SQL ...
Spring Security ,Apache Shiro的对比及数据级权限实现 -
alan2012:
对于eya采用规则,我也觉得这是比较灵活的,但现在还些地方不知 ...
Spring Security ,Apache Shiro的对比及数据级权限实现 -
a_alter:
至于那些 数据级别的 业务逻辑相关的, 个人觉得还是不纳入权限 ...
Spring Security ,Apache Shiro的对比及数据级权限实现
以前发过一次,看见许多朋友都很需要这种通用的导入导出组件
请注意:导入导出功能是通过自定义的Annotattion来实现的,要将pojo中的字段的类标注指定的annotation才可以,如果没有标注的,就默认不导出导入
一般情况下只需要简单的三步,就可以实现导入和导出了,要是你使用了hibernate,就会发现太方便了
一:
构造输入输出流 如: OutputStream out = new FileOutputStream("D:\\testOne.xls");
二,构造导入导出对象 如: ExcelExport<Testpojo> ex = new ExcelExport<Testpojo>();
三,操作 ex.exportExcel("测试", list, out);
当然,因为操作数据都是Connection接口的,所以,你可以在导入
导出之前对数据进行过滤、排序、分组等,到时候动态的传进去就可以了,实在非常的方便,废话不多说,直接上代码:
说说设计思路?如何实现规则验证,转换映射
jxl太原始了,还需要手工操作
另请教一下,导入的时候如果数据很多,每次保存在list种是不是不太合适?
把你的贴出来看看
请注意:导入导出功能是通过自定义的Annotattion来实现的,要将pojo中的字段的类标注指定的annotation才可以,如果没有标注的,就默认不导出导入
一般情况下只需要简单的三步,就可以实现导入和导出了,要是你使用了hibernate,就会发现太方便了
一:
构造输入输出流 如: OutputStream out = new FileOutputStream("D:\\testOne.xls");
二,构造导入导出对象 如: ExcelExport<Testpojo> ex = new ExcelExport<Testpojo>();
三,操作 ex.exportExcel("测试", list, out);
当然,因为操作数据都是Connection接口的,所以,你可以在导入
导出之前对数据进行过滤、排序、分组等,到时候动态的传进去就可以了,实在非常的方便,废话不多说,直接上代码:
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 作者:eya;QQ:1371392495,email:eya@eya.cc * 欢迎转载;转载时请著名出处 * */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ExcelAnnotation { // excel导出时标题显示的名字,如果没有设置Annotation属性,将不会被导出和导入 public String exportName(); }
import java.util.Date; /** * 作者:eya;QQ:1371392495,email:eya@eya.cc * 欢迎转载;转载时请著名出处 * */ public class Testpojo { @ExcelAnnotation(exportName = "用户名") String username; @ExcelAnnotation(exportName = "登录名") String loginname; @ExcelAnnotation(exportName = "年龄") Integer age; @ExcelAnnotation(exportName = "收入") Long money; @ExcelAnnotation(exportName = "时间") Date createtime; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getLoginname() { return loginname; } public void setLoginname(String loginname) { this.loginname = loginname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Long getMoney() { return money; } public void setMoney(Long money) { this.money = money; } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } }
import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; /** * 作者:eya;QQ:1371392495,email:eya@eya.cc * 欢迎转载;转载时请著名出处 * */ public class ExcelStyle { public static HSSFCellStyle setHeadStyle(HSSFWorkbook workbook ,HSSFCellStyle style) { style.setFillForegroundColor(HSSFColor.SKY_BLUE.index); style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style.setBorderBottom(HSSFCellStyle.BORDER_THIN); style.setBorderLeft(HSSFCellStyle.BORDER_THIN); style.setBorderRight(HSSFCellStyle.BORDER_THIN); style.setBorderTop(HSSFCellStyle.BORDER_THIN); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 生成字体 HSSFFont font = workbook.createFont(); font.setColor(HSSFColor.VIOLET.index); font.setFontHeightInPoints((short) 12); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 把字体应用到当前的样样式 style.setFont(font); return style; } public static HSSFCellStyle setbodyStyle(HSSFWorkbook workbook ,HSSFCellStyle style2) { style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index); style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); style2.setBorderBottom(HSSFCellStyle.BORDER_THIN); style2.setBorderLeft(HSSFCellStyle.BORDER_THIN); style2.setBorderRight(HSSFCellStyle.BORDER_THIN); style2.setBorderTop(HSSFCellStyle.BORDER_THIN); style2.setAlignment(HSSFCellStyle.ALIGN_CENTER); style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 生成字体 HSSFFont font2 = workbook.createFont(); font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL); // 把字体应用到当前的样样式 style2.setFont(font2); return style2; } }
import java.util.Date; /** * 作者:eya;QQ:1371392495,email:eya@eya.cc * 欢迎转载;转载时请著名出处 * */ public class Testpojo { @ExcelAnnotation(exportName = "用户名") String username; @ExcelAnnotation(exportName = "登录名") String loginname; @ExcelAnnotation(exportName = "年龄") Integer age; @ExcelAnnotation(exportName = "收入") Long money; @ExcelAnnotation(exportName = "时间") Date createtime; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getLoginname() { return loginname; } public void setLoginname(String loginname) { this.loginname = loginname; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Long getMoney() { return money; } public void setMoney(Long money) { this.money = money; } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } }
import java.io.File; import java.io.FileInputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; 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.ss.usermodel.Row; /** * 作者:eya;QQ:1371392495,email:eya@eya.cc * 欢迎转载;转载时请著名出处 * */ public class ImportExcel<T> { Class<T> clazz; public ImportExcel(Class<T> clazz) { this.clazz = clazz; } public Collection<T> importExcel(File file ,String... pattern) { Collection<T> dist = new ArrayList(); try { /** * 类反射得到调用方法 */ // 得到目标目标类的所有的字段列表 Field filed[] = clazz.getDeclaredFields(); // 将所有标有Annotation的字段,也就是允许导入数据的字段,放入到一个map中 Map fieldmap = new HashMap(); // 循环读取所有字段 for (int i = 0; i < filed.length; i++) { Field f = filed[i]; // 得到单个字段上的Annotation ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class); // 如果标识了Annotationd的话 if (exa != null) { // 构造设置了Annotation的字段的Setter方法 String fieldname = f.getName(); String setMethodName = "set" + fieldname.substring(0, 1).toUpperCase() + fieldname.substring(1); // 构造调用的method, Method setMethod = clazz.getMethod(setMethodName, new Class[] { f.getType() }); // 将这个method以Annotaion的名字为key来存入。 fieldmap.put(exa.exportName(), setMethod); } } /** * excel的解析开始 */ // 将传入的File构造为FileInputStream; FileInputStream in = new FileInputStream(file); // // 得到工作表 HSSFWorkbook book = new HSSFWorkbook(in); // // 得到第一页 HSSFSheet sheet = book.getSheetAt(0); // // 得到第一面的所有行 Iterator<Row> row = sheet.rowIterator(); /** * 标题解析 */ // 得到第一行,也就是标题行 Row title = row.next(); // 得到第一行的所有列 Iterator<Cell> cellTitle = title.cellIterator(); // 将标题的文字内容放入到一个map中。 Map titlemap = new HashMap(); // 从标题第一列开始 int i = 0; // 循环标题所有的列 while (cellTitle.hasNext()) { Cell cell = cellTitle.next(); String value = cell.getStringCellValue(); titlemap.put(i, value); i = i + 1; } /** * 解析内容行 */ //用来格式化日期的DateFormat SimpleDateFormat sf; if(pattern.length<1) { sf=new SimpleDateFormat("yyyy-MM-dd"); } else sf=new SimpleDateFormat(pattern[0]); while (row.hasNext()) { // 标题下的第一行 Row rown = row.next(); // 行的所有列 Iterator<Cell> cellbody = rown.cellIterator(); // 得到传入类的实例 T tObject = clazz.newInstance(); int k = 0; // 遍历一行的列 while (cellbody.hasNext()) { Cell cell = cellbody.next(); // 这里得到此列的对应的标题 String titleString = (String) titlemap.get(k); // 如果这一列的标题和类中的某一列的Annotation相同,那么则调用此类的的set方法,进行设值 if (fieldmap.containsKey(titleString)) { Method setMethod = (Method) fieldmap.get(titleString); //得到setter方法的参数 Type[] ts = setMethod.getGenericParameterTypes(); //只要一个参数 String xclass = ts[0].toString(); //判断参数类型 if(xclass. equals("class java.lang.String")) { setMethod.invoke(tObject, cell.getStringCellValue()); } else if(xclass. equals("class java.util.Date")) { setMethod.invoke(tObject, sf.parse(cell.getStringCellValue())); } else if(xclass. equals("class java.lang.Boolean")) { Boolean boolname=true; if(cell.getStringCellValue().equals("否")) { boolname=false; } setMethod.invoke(tObject,boolname ); } else if(xclass. equals("class java.lang.Integer")) { setMethod.invoke(tObject,new Integer( cell.getStringCellValue())); } else if(xclass. equals("class java.lang.Long")) { setMethod.invoke(tObject,new Long( cell.getStringCellValue())); } } // 下一列 k = k + 1; } dist.add(tObject); } } catch (Exception e) { e.printStackTrace(); return null; } return dist; } public static void main(String[] args) { ImportExcel<Testpojo> test = new ImportExcel(Testpojo.class); File file = new File("D:\\testOne.xls"); Long befor = System.currentTimeMillis(); List<Testpojo> result = (ArrayList) test.importExcel(file); Long after = System.currentTimeMillis(); System.out.println("此次操作共耗时:" + (after - befor) + "毫秒"); for (int i = 0; i < result.size(); i++) { Testpojo testpojo=result.get(i); System.out.println("导入的信息为:"+testpojo.getLoginname()+ "----"+testpojo.getAge()+"---"+testpojo.getMoney()+"-----"+testpojo.getCreatetime()); } System.out.println("共转化为List的行数为:" + result.size()); } }
import java.io.FileOutputStream; import java.io.OutputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.Iterator; import java.util.List; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import cc.eya.base.entity.account.Loginfo; /** * 作者:eya;QQ:1371392495,email:eya@eya.cc * 欢迎转载;转载时请著名出处 * */ public class ExcelExport<T> { //格式化日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * * @param title 标题 * @param dataset 集合 * @param out 输出流 */ public void exportExcel(String title, Collection<T> dataset, OutputStream out) { // 声明一个工作薄 try { //首先检查数据看是否是正确的 Iterator<T> its = dataset.iterator(); if(dataset==null||!its.hasNext()||title==null||out==null) { throw new Exception("传入的数据不对!"); } //取得实际泛型类 T ts = (T) its.next(); Class tCls = ts.getClass(); HSSFWorkbook workbook = new HSSFWorkbook(); // 生成一个表格 HSSFSheet sheet = workbook.createSheet(title); // 设置表格默认列宽度为15个字节 sheet.setDefaultColumnWidth(15); // 生成一个样式 HSSFCellStyle style = workbook.createCellStyle(); // 设置标题样式 style = ExcelStyle.setHeadStyle(workbook, style); // 得到所有字段 Field filed[] = ts.getClass().getDeclaredFields(); // 标题 List<String> exportfieldtile = new ArrayList<String>(); // 导出的字段的get方法 List<Method> methodObj = new ArrayList<Method>(); // 遍历整个filed for (int i = 0; i < filed.length; i++) { Field f = filed[i]; ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class); // 如果设置了annottion if (exa != null) { String exprot = exa.exportName(); // 添加到标题 exportfieldtile.add(exprot); // 添加到需要导出的字段的方法 String fieldname = f.getName(); String getMethodName = "get" + fieldname.substring(0, 1).toUpperCase() + fieldname.substring(1); Method getMethod = tCls.getMethod(getMethodName, new Class[] {}); methodObj.add(getMethod); } } // 产生表格标题行 HSSFRow row = sheet.createRow(0); for (int i = 0; i < exportfieldtile.size(); i++) { HSSFCell cell = row.createCell(i); cell.setCellStyle(style); HSSFRichTextString text = new HSSFRichTextString( exportfieldtile.get(i)); cell.setCellValue(text); } int index = 0; //这里重新取一下,前面调用了next()方法,会出现少一条的情况 its = dataset.iterator(); // 循环整个集合 while (its.hasNext()) { //从第二行开始写,第一行是标题 index++; row = sheet.createRow(index); T t = (T) its.next(); for (int k = 0; k < methodObj.size(); k++) { HSSFCell cell = row.createCell(k); Method getMethod=methodObj.get(k); Object value = getMethod.invoke(t, new Object[] {}); String textValue = getValue(value); cell.setCellValue(textValue); } } workbook.write(out); } catch (Exception e) { e.printStackTrace(); } } public String getValue(Object value) { String textValue = ""; if (value == null) return textValue; if (value instanceof Boolean) { boolean bValue = (Boolean) value; textValue = "是"; if (!bValue) { textValue = "否"; } } else if (value instanceof Date) { Date date = (Date) value; textValue = sdf.format(date); } else textValue = value.toString(); return textValue; } public static void main(String[] args) throws Exception { //构造一个模拟的List来测试,实际使用时,这个集合用从数据库中查出来 List list = new ArrayList(); for (int i = 0; i < 5000; i++) { Testpojo pojo = new Testpojo(); pojo.setLoginname("登录名"+i); pojo.setUsername("用户名"+i); pojo.setMoney(new Long(1000+i)); pojo.setCreatetime(new Date()); pojo.setAge(28); list.add(pojo); } //构造输出对象,可以从response输出,直接向用户提供下载 OutputStream out = new FileOutputStream("D:\\testOne.xls"); //开始时间 Long l = System.currentTimeMillis(); //注意 ExcelExport<Testpojo> ex = new ExcelExport<Testpojo>(); // ex.exportExcel("测试", list, out); out.close(); //结束时间 Long s = System.currentTimeMillis(); System.out.println("总共耗时:" + (s - l)); } }
- lib.rar (8 MB)
- 下载次数: 2386
评论
13 楼
fengsky491
2010-06-02
其实JXLS不错,就是可能会有些小bug
12 楼
caoyangx
2010-06-02
以前用jxl做一个通用的,不过没有用@注解方式,这个倒是不错的想法,可以参考一下。
11 楼
fengsky491
2010-06-02
JXL,能不能像jxls一样吧,数据源传入Excel,而Excel中用${po.id}这样取值?
qiren83 写道
JXL不是省事吗?
又学看其它的API
JPA查出来 JXL把结果生成出来 多灵活 又方便入手
又学看其它的API
JPA查出来 JXL把结果生成出来 多灵活 又方便入手
10 楼
mlhorizon
2010-06-02
注解方式挺好,以前做过一个使用excel模板导入导出的,将字段映射校验等信息存在excel的隐藏sheet中
9 楼
sinoyster
2010-06-02
allskylove 写道
哈哈,以前做过一个,同样是注解,方法反射调用,验证规则,转换规则。,导入导出,一般需要考虑 ,文件上传, 文件校验,字段校验(校验就比较多东西),还有字段类型转换,导入进度显示。出错处理等等。
说说设计思路?如何实现规则验证,转换映射
8 楼
qiren83
2010-06-02
JXL不是省事吗?
又学看其它的API
JPA查出来 JXL把结果生成出来 多灵活 又方便入手
又学看其它的API
JPA查出来 JXL把结果生成出来 多灵活 又方便入手
7 楼
sinoyster
2010-06-02
jxausea 写道
不是有jxl.jar包吗?还要自己写??
jxl太原始了,还需要手工操作
另请教一下,导入的时候如果数据很多,每次保存在list种是不是不太合适?
6 楼
jxausea
2010-06-02
不是有jxl.jar包吗?还要自己写??
5 楼
rachelmarf
2010-06-02
这不是有现成的么?
4 楼
liujianst
2010-06-01
搞个同时支持excel2007和2003的
3 楼
20029388
2010-06-01
有图为证???
2 楼
eya
2010-06-01
allskylove 写道
哈哈,以前做过一个,同样是注解,方法反射调用,验证规则,转换规则。,导入导出,一般需要考虑 ,文件上传, 文件校验,字段校验(校验就比较多东西),还有字段类型转换,导入进度显示。出错处理等等。
把你的贴出来看看
1 楼
wangchangbing
2010-06-01
还是很不错的想法 可以下载来试试
相关推荐
标题中的“一个通用从数据库导出excel、excel导入数据库组件所用到的jar包”指的是一个Java开发的工具,主要用于数据的导入导出操作。这个工具可以方便地将数据库中的数据导出为Excel格式,同时也可以将Excel文件中...
标题中的“通用从数据库导出excel、excel导入数据库组件”是指一种软件工具或技术,它允许用户方便地将数据从数据库导出到Excel电子表格格式,并能将Excel数据反向导入回数据库。这样的组件通常在数据迁移、数据分析...
总的来说,【Excel导入导出数据库小工具】是一个实用的工具,结合了C#的文件处理和数据库操作能力,为日常数据管理工作提供了便利。通过研究源代码,开发者不仅可以掌握Excel与数据库之间的数据迁移技术,还能提升C#...
4. **Excel数据导入**:项目可能需要从用户上传的Excel文件中读取数据并将其存储到数据库。这需要解析Excel文件,读取数据,进行必要的验证,然后将数据保存到合适的数据库表中。NPOI提供`HSSFWorkbook`和`...
在ASP.NET(C#)开发中,导入和导出Excel是一项常见的功能需求,它涉及到Web应用程序与Microsoft Excel数据的交互。这个主题涵盖了多个知识点,包括文件流处理、数据序列化、Excel对象模型的理解以及如何利用C#语言...
在导入数据时,可以从文件(如CSV或Excel)读取数据,然后使用数据适配器将数据加载到DataSet,最后通过适配器的Update方法将数据写入数据库。导出时,可以反向操作,先从数据库获取数据到DataSet,再写入文件。 5....
NPOI是一个开源的.NET库,用于读写Microsoft Office文档,包括Excel。它提供了丰富的API,可以创建、修改Excel文件,设置单元格样式,处理公式等,而无需依赖Office。NPOI适用于大量数据处理和复杂格式的场景,性能...
总的来说,DELPHI通过其强大的数据库组件和灵活的编程模型,提供了实现异构数据库导入导出的强大工具。通过精心设计的算法和策略,可以有效地处理大规模数据迁移,实现高效、可靠的数据交换。在实际项目中,根据具体...
标题中的“Excel通用模板组件”指的是一个用于处理Excel文件的工具或库,它提供了一种通用的方法来操作Excel模板,从而实现数据填充、格式化和自动化处理。这种组件通常适用于需要大量处理Excel数据的业务场景,例如...
数据查询编辑器(Power Query)是Excel的一个内置组件,它提供了强大的数据清洗、转换和加载功能。用户可以连接到各种数据源,如Access、SQL Server、Web服务等,然后使用M语言(Power Query语言)进行复杂的数据...
总的来说,PB通过HTML格式导出Excel是一种实用的方法,它结合了数据窗口的强大功能和HTML的通用性。不过,这种方式有其限制,例如对复杂格式的支持不足。在实际应用中,开发者需要根据项目需求和资源来决定是否采用...
- StringGrid则是一个通用的网格控件,适用于非数据库数据的显示和编辑。它可以手动填充和管理数据。 2. **数据导出的基本流程**: - 首先,需要遍历DBGrid或StringGrid中的每一行数据。 - 对于DBGrid,通常通过...
这里的示例代码中,`CreateOleObject('Excel.Application')` 创建了一个 Excel 应用程序对象。这允许我们进一步控制 Excel 的工作簿、工作表等元素,实现数据导入导出等功能。 2. **处理文件路径和对话框**: 代码...
标题中的“Excel通用方法及操作组件打包下载”指的是一个资源包,其中包含了多个与Excel相关的实用技巧、函数应用以及可能的VBA(Visual Basic for Applications)宏或C#、ASP.NET编程接口,用于扩展Excel的功能。...
6. 数据导出:从数据库导出数据到Excel的过程及其在实际业务中的应用。 掌握这些知识点,不仅能够帮助开发人员创建针对任何数据库的报表系统,还能提升他们在数据分析和报告生成方面的专业能力。
本项目提供的"Table表格导出为Excel、csv、txt、sql、json、xml、Word格式"就是这样一个功能丰富的解决方案,它允许用户将网页中的表格数据方便地转换为多种常见格式。 首先,我们来详细了解一下这些文件格式的特点...
综上所述,Java导入导出Excel是一个涉及前端交互、后端处理和数据操作的过程,需要理解Web开发、文件处理和Java API的使用,确保数据的准确性和安全性。通过这个项目,开发者可以提升对这些技术的掌握,更好地实现...
数据分页导入Excel是一项在大数据处理中常见的任务,它涉及到如何高效地从数据库中提取大量数据并将其组织成Excel格式。在这个过程中,我们通常会利用Java的Apache POI库,这是一个强大的工具,允许开发者创建、修改...
6. 测试环境准备:描述中提到“测试需要手动修改TP数据库配置”,意味着在测试环境中,可能需要创建一个新的数据库或修改现有数据库的连接参数,以便与CSV文件数据的导入导出操作匹配。 7. 压缩包文件内容: - `....
此外,通用数据库检索系统还应具备数据导入导出功能,能与各种文件格式进行交互,如CSV、Excel、XML等。这样,用户可以方便地在数据库和文件系统之间传输数据,实现数据的备份、迁移或整合。 在安全性方面,系统应...