锁定老帖子 主题:excel操作组件1.0源码
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-05-29
Excel导入导出组件
雏形版本
随着项目的完工,组件的开发也相继完成,它已经不只是一个想法,一个雏形,一个玩具。它实实在在的在项目中被使用,被完善。 它记录了我的一段开发历程,是我做为一个程序技术人员的见证。今天我把源码及使用文档公布出来,给需要的人提供帮助。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-05-29
我先下载来看看
|
|
返回顶楼 | |
发表时间:2008-05-29
真是不错~谢谢楼主分享!
|
|
返回顶楼 | |
发表时间:2008-05-29
对于读取 excle,我用这样的类型来保存数据
TreeMap<Integer, Map<Integer, String>> 用 map 来保存数据,可以同时保存行列号,如 把 "china" 保存在 第3行,第5列 TreeMap<3, Map<5, "china">> 读出excel中的数据之后,把内容都填充到 TreeMap 中,返回它就可以了,这样得到了一个大的 TreeMap,里面包含了若干个小的TreeMap,不用管内容是否变化啊 可能效率有问题吧,我没有大量的数据,至多几千个,所以用起来没什么问题。 源代码,没怎么整理,凑合看吧,用的是 jxl public TreeMap<Integer, Map<Integer, String>> readExcel(File file) { // TreeSet 继承了 SortedMap 接口,是有序的 // 之所以选择 Map,是因为它可以保存列数和行数,有对应关系 TreeMap<Integer, Map<Integer, String>> mapAllLine = new TreeMap<Integer, Map<Integer, String>>(); Workbook wb = null; try { // 构造Workbook(工作薄)对象 wb = Workbook.getWorkbook(file); if (wb == null) return null; // 获得了Workbook对象之后,就可以通过它得到Sheet(工作表)对象了 Sheet[] sheets = wb.getSheets(); if (sheets == null || sheets.length <= 0)// 空表 return null; log.info("============= 总 sheet 数是: " + sheets.length); // == 开始操作工作表 // 对每个工作表进行循环 for (int sheetNum = 0; sheetNum < sheets.length; sheetNum++) { // 得到当前工作表的行数 int rowNum = sheets[sheetNum].getRows(); log.info("============= 当前 sheet 数是: " + (sheetNum + 1)); // sheet 中内容为空的时候,退出 if (rowNum == 0 && sheetNum < sheets.length) { log.info("============= " + (sheetNum + 1) + " sheet 中内容为空,继续下一个 sheet "); continue; } // 循环当前 sheet for (int i = 0; i < rowNum; i++) {// for1 // 用来存储当前行的数据,为顺序存储 Map<Integer, String> mapColumn = new TreeMap<Integer, String>(); // 得到当前工作表的当前行的所有单元格 Cell[] cells = sheets[sheetNum].getRow(i); int cellsSize = cells.length; // log.info("cells size: " + cellsSize); for (int j = 0; j < cellsSize; j++) { // System.out.println("read:"+cells[j].getType().equals(CellType.DATE)); mapColumn.put(j + 1, cells[j].getContents().trim());// j+1,i+1避免出现 // 0 行 // 0 列 } mapAllLine.put(i + 1, mapColumn); } } } catch (BiffException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 最后关闭资源,释放内存 wb.close(); return mapAllLine; } } |
|
返回顶楼 | |
发表时间:2008-05-30
楼上的数据的读取,存储我回仔细研究。
Excel操作的时候,下面两点很重要。 1、Excel读取的时候,要取能识别表头及标题,从列标题的下一行开始读取。 2、读取完成之后,还要回写消息。把有问题的记录回写给用户,修改后,重新上传。有问题的记录包括两部分,一部分是格式验证未通过(使用文档中有说明)。一部分是业务验证未通过的记录(如:重复记录)。 |
|
返回顶楼 | |
发表时间:2008-05-30
我这个没有考虑表头等信息,只是读取正文第每个单元格的内容。
实际上,excel就是一个大的二维表,就像二维数组一样,只不过每行的单元格数目不同,如下面的形式: 1,1,1,1 2,2,2,2,2,2 3,3,3,3,3 4,4,4 共四行,每行的单元格数目不同 第一行:四个单元格 第二行:六个单元格 第三行:五个单元格 第四行:三个单元格 我就想用一个数据结构能保存上面的信息,并且保留每个单元格的具体位置信息,如我在这个数据结构中想要第三行第二个数据,那么他的位置应该在[3,2] 对应 TreeMap<3, Map<2, "china">> 我不知道有没有一个现成的数据结构,保存二维表,并且能有其位置信息。 我没有考虑效率什么的,没有再具体的深入研究,在我日常的应用中,我觉得够了。 如果把一个 excel 内容都得到了,具体的更进一步的比较等,就是后话了。 |
|
返回顶楼 | |
发表时间:2008-05-31
正在做同样的东东,不知道楼主有没有考虑过大数据量Excel文件导入导致内存溢出的问题
HSSFWorkbook wb=new HSSFWorkbook(new FileInputStream(fileName)); 这一句就直接抛出OOM异常 引用 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at org.apache.poi.hssf.usermodel.HSSFRow.createCellFromRecord(HSSFRow.java:181) at org.apache.poi.hssf.usermodel.HSSFSheet.setPropertiesFromSheet(HSSFSheet.java:182) at org.apache.poi.hssf.usermodel.HSSFSheet.<init>(HSSFSheet.java:123) at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:264) at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:168) at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:297) at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:278) at javaapplication4.Main.main(Main.java:30) 请问你是怎么处理的? |
|
返回顶楼 | |
发表时间:2008-06-02
我测试过的数据 导入:10000行。(20个字段信息) 导出:23000行。(4个字段信息) 我也有这个问题,正在想办法解决。 |
|
返回顶楼 | |
发表时间:2008-06-02
感觉感谢楼主的努力!
|
|
返回顶楼 | |
发表时间:2008-06-05
我不喜欢写配置文件
|
|
返回顶楼 | |