论坛首页 Java企业应用论坛

excel操作组件1.0源码

浏览 9023 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-05-29  
  雏形版本 Excel导入导出组件

  随着项目的完工,组件的开发也相继完成,它已经不只是一个想法,一个雏形,一个玩具。它实实在在的在项目中被使用,被完善。

  它记录了我的一段开发历程,是我做为一个程序技术人员的见证。今天我把源码及使用文档公布出来,给需要的人提供帮助。

   发表时间:2008-05-29  
我先下载来看看
0 请登录后投票
   发表时间:2008-05-29  
真是不错~谢谢楼主分享!
0 请登录后投票
   发表时间: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;
}
}



0 请登录后投票
   发表时间:2008-05-30  
楼上的数据的读取,存储我回仔细研究。
Excel操作的时候,下面两点很重要。
1、Excel读取的时候,要取能识别表头及标题,从列标题的下一行开始读取。
2、读取完成之后,还要回写消息。把有问题的记录回写给用户,修改后,重新上传。有问题的记录包括两部分,一部分是格式验证未通过(使用文档中有说明)。一部分是业务验证未通过的记录(如:重复记录)。
0 请登录后投票
   发表时间: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 内容都得到了,具体的更进一步的比较等,就是后话了。
0 请登录后投票
   发表时间: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)



请问你是怎么处理的?
0 请登录后投票
   发表时间:2008-06-02  

我测试过的数据
导入:10000行。(20个字段信息)
导出:23000行。(4个字段信息)
我也有这个问题,正在想办法解决。
0 请登录后投票
   发表时间:2008-06-02  
感觉感谢楼主的努力!
0 请登录后投票
   发表时间:2008-06-05  
我不喜欢写配置文件
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics