目前市场上流行的对于excel处理的框架大致有两种:poi和jxl。对于这两种框架,我们可以做一个简单的对比:
   1 开发团队:poi是Apache旗下的一个开源项目,由Apache官方维护,jxl好像是一个个人维护的开源项目。
   2 各自优点:poi对公式支持较好,jxl不算好 。jxl提供对图片的支持(仅仅PNG格式),poi支持。(就这一条来看财务软件就该选poi,而媒体类的软件就该选jxl了)
   3 内存消耗:由于jxl在对资源回收利用方面做了相当的功课,在内存消耗上jxl是略胜于poi的。所以对于大数据量的软件导入来说,选择jxl是比较合算的,当然数据量小的基本没有差别。
   4 运行速度: 估计是内存消耗多的缘故,poi对于读写速度这一功能做的好像比jxl好了不少,并且支持压缩excel。
    对比了这么多,对于自己项目该使用哪个框架,应该也十分明显了(当然这些也都是从网上搜集来的,不保证有错误的地方)。
    这里我记录一下poi的使用吧,都挺简单的,基本原理都是将excel表格数据提取出来组成一个list。然后对应这个list自己去做循环对应自己数据表的数据就行了。需要说明的一点是如果是数字类型的话,读出来的数据一般都是以double类型返回给你的,比如你在excel里面写的是100,读取出来的数据就是100.0.这点比较烦人,当然自己做一下处理就好了。
    还有一点就是poi也有两个不同的jar包,分别是处理excel2003和excel2007+的,对应的是poi和poi-ooxml。毕竟poi-ooxml是poi的升级版本,处理的单页数据量也是百万级别的,所以我们选择的也是poi-ooxml。好了,下面就贴上代码吧,注释较多,就不多做啰嗦了。,前提是引入包:

<!--poi对excel2007以上版本的支持-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.12</version>
</dependency>

以下代码完全可以作为一个excel工具类迁移到自己的项目中:

/**
* 处理excel读入的工具类
* Created by Liujishuai on 2015/8/5.
*/
public class ExcelUtils {
/**
* 要求excel版本在2007以上
*
* @param file 文件信息
* @return
* @throws Exception
*/
public static List<List<Object>> readExcel(File file) throws Exception {
if(!file.exists()){
throw new Exception("找不到文件");
}
List<List<Object>> list = new LinkedList<List<Object>>();
XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));
// 读取第一张表格内容
XSSFSheet sheet = xwb.getSheetAt(0);
XSSFRow row = null;
XSSFCell cell = null;
for (int i = (sheet.getFirstRowNum() + 1); i <= (sheet.getPhysicalNumberOfRows() - 1); i++) {
row = sheet.getRow(i);
if (row == null) {
continue;
}
List<Object> linked = new LinkedList<Object>();
for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
Object value = null;
cell = row.getCell(j);
if (cell == null) {
continue;
}
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_STRING:
//String类型返回String数据
value = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_NUMERIC:
//日期数据返回LONG类型的时间戳
if ("yyyy\"年\"m\"月\"d\"日\";@".equals(cell.getCellStyle().getDataFormatString())) {
//System.out.println(cell.getNumericCellValue()+":日期格式:"+cell.getCellStyle().getDataFormatString());
value = DateUtils.getMillis(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())) / 1000;
} else {
//数值类型返回double类型的数字
//System.out.println(cell.getNumericCellValue()+":格式:"+cell.getCellStyle().getDataFormatString());
value = cell.getNumericCellValue();
}
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
//布尔类型
value = cell.getBooleanCellValue();
break;
case XSSFCell.CELL_TYPE_BLANK:
//空单元格
break;
default:
value = cell.toString();
}
if (value != null && !value.equals("")) {
//单元格不为空,则加入列表
linked.add(value);
}
}
if (linked.size()!= 0) {
list.add(linked);
}
}
return list;
}
/**
* 要求excel版本在2007以上
*
* @param fileInputStream 文件信息
* @return
* @throws Exception
*/
public static List<List<Object>> readExcel(FileInputStream fileInputStream) throws Exception {
List<List<Object>> list = new LinkedList<List<Object>>();
XSSFWorkbook xwb = new XSSFWorkbook(fileInputStream);
// 读取第一张表格内容
XSSFSheet sheet = xwb.getSheetAt(1);
XSSFRow row = null;
XSSFCell cell = null;
for (int i = (sheet.getFirstRowNum() + 1); i <= (sheet.getPhysicalNumberOfRows() - 1); i++) {
row = sheet.getRow(i);
if (row == null) {
continue;
}
List<Object> linked = new LinkedList<Object>();
for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {
Object value = null;
cell = row.getCell(j);
if (cell == null) {
continue;
}
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_NUMERIC:
if ("yyyy\"年\"m\"月\"d\"日\";@".equals(cell.getCellStyle().getDataFormatString())) {
//System.out.println(cell.getNumericCellValue()+":日期格式:"+cell.getCellStyle().getDataFormatString());
value = DateUtils.getMillis(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())) / 1000;
} else {
//System.out.println(cell.getNumericCellValue()+":格式:"+cell.getCellStyle().getDataFormatString());
value = cell.getNumericCellValue();
}
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
value = cell.getBooleanCellValue();
break;
case XSSFCell.CELL_TYPE_BLANK:
break;
default:
value = cell.toString();
}
if (value != null && !value.equals("")) {
//单元格不为空,则加入列表
linked.add(value);
}
}
if (linked.size()!= 0) {
list.add(linked);
}
}
return list;
} /**
* 导出excel
* @param excel_name 导出的excel路径(需要带.xlsx)
* @param headList excel的标题备注名称
* @param fieldList excel的标题字段(与数据中map中键值对应)
* @param dataList excel数据
* @throws Exception
*/
public static void createExcel(String excel_name, String[] headList,
String[] fieldList, List<Map<String, Object>> dataList)
throws Exception {
// 创建新的Excel 工作簿
XSSFWorkbook workbook = new XSSFWorkbook();
// 在Excel工作簿中建一工作表,其名为缺省值
XSSFSheet sheet = workbook.createSheet();
// 在索引0的位置创建行(最顶端的行)
XSSFRow row = sheet.createRow(0);
// 设置excel头(第一行)的头名称
for (int i = 0; i < headList.length; i++) { // 在索引0的位置创建单元格(左上端)
XSSFCell cell = row.createCell(i);
// 定义单元格为字符串类型
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
// 在单元格中输入一些内容
cell.setCellValue(headList[i]);
}
// ===============================================================
//添加数据
for (int n = 0; n < dataList.size(); n++) {
// 在索引1的位置创建行(最顶端的行)
XSSFRow row_value = sheet.createRow(n + 1);
Map<String, Object> dataMap = dataList.get(n);
// ===============================================================
for (int i = 0; i < fieldList.length; i++) { // 在索引0的位置创建单元格(左上端)
XSSFCell cell = row_value.createCell(i);
// 定义单元格为字符串类型
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
// 在单元格中输入一些内容
cell.setCellValue((dataMap.get(fieldList[i])).toString());
}
// ===============================================================
}
// 新建一输出文件流
FileOutputStream fos = new FileOutputStream(excel_name);
// 把相应的Excel 工作簿存盘
workbook.write(fos);
fos.flush();
// 操作结束,关闭文件
fos.close();
}
}

————————————————
版权声明:本文为CSDN博主「jeyson」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/js_sky/article/details/47334833

excel操作之poi-ooxml的更多相关文章

  1. Npoi导入导出Excel操作

    之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求. 在winform上面实现excel操作:http://www.cnblogs.com/Cal ...

  2. .Net Excel操作之NPOI(一)简介

    一.NPOI简介 NPOI是一个开源项目,可以读/写xls,doc,ppt文件,有着广泛的应用. 使用NPOI能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支 ...

  3. 数据导出生成Excel附件使用POI的HSSFWorkbook对象

    比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和Java Excel.Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组 ...

  4. Delphi Excel 操作大全

    Delphi Excel 操作大全 (一) 使用动态创建的方法首先创建 Excel 对象,使用ComObj:var ExcelApp: Variant;ExcelApp := CreateOleObj ...

  5. C#EXCEL 操作类--C#ExcelHelper操作类

    主要功能如下1.导出Excel文件,自动返回可下载的文件流 2.导出Excel文件,转换为可读模式3.导出Excel文件,并自定义文件名4.将数据导出至Excel文件5.将指定的集合数据导出至Exce ...

  6. Excel 操作类

    转载:http://www.cnblogs.com/fellowcheng/archive/2010/08/21/1805158.html ExcelHelper(Excel2007) Code hi ...

  7. C# excel操作

    开源的Excel操作项目: http://www.cnblogs.com/lwme/archive/2011/11/27/2265323.html 添加引用:Microsoft Excel 11.0 ...

  8. [Excel操作]Microsoft Office Excel 不能访问文件

    最近,客户服务器迁移,因操作系统环境变化而引起的的环境问题一堆,遇到的问题并解决方法在“[Excel]操作”类别会体现. Microsoft Office Excel 不能访问文件“C:\\LMSEx ...

  9. C#常用工具类——Excel操作类

    /// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...

  10. 报表中的Excel操作之Aspose.Cells(Excel模板)

    原文:报表中的Excel操作之Aspose.Cells(Excel模板) 本篇中将简单记录下Aspose.Cells这个强大的Excel操作组件.这个组件的强大之处,就不多说,对于我们的报表总是会有导 ...

随机推荐

  1. C++多线程基础学习笔记(十)

    一.Windows临界区的基本用法 CRITICAL_SECTION my_winsc;              //定义一个Windows的临界区,相当于一个mutex变量 InitializeC ...

  2. Photon Server 实现注册与登录(三) --- 前端UI设计和发起请求

    一.打开之前的测试项目.先将服务端代码编译一下,在 bin/Debug/目录下会发现有一个Common.dill.我们相应导入到前端使用.直接拖拽到相应地方 UI相应布局属于前端操作,这里就不做介绍了 ...

  3. Centos7下永久修改mysql5.6最大连接数

    由于解除系统限制,设置最大连接数时,量力而行.https://blog.csdn.net/five3/article/details/79671317

  4. Python内存相关

    Python内存相关 示例一: v1 = [1, 2, 3] v2 = [1, 2 ,3] v1 = 123 v2 = 123 v1 = "dogfa" v2 = "do ...

  5. 消息服务百科全书——High Availability

    1.1为何需要Replication 在Kafka在0.8以前的版本中,是没有Replication的,一旦某一个Broker宕机,则其上所有的Partition数据都不可被消 费,这与Kafka数据 ...

  6. dos(cmd)命令大全(本文摘至于网络)

    命令简介 cmd是command的缩写.即命令行 .       虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在 ...

  7. MyBatis 源码篇-日志模块2

    上一章的案例,配置日志级别为 debug,执行一个简单的查询操作,会将 JDBC 操作打印出来.本章通过 MyBatis 日志部分源码分析它是如何实现日志打印的. 在 MyBatis 的日志模块中有一 ...

  8. HTML练习一

    效果图 动态图 html代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  9. PHP 多维数组将下标从0开始

    点击链接加入群[php/web 学习课堂]:https://jq.qq.com/?_wv=1027&k=5645xiw 欢迎大家加入,一起讨论学习 模拟一个: public function ...

  10. java之JVM学习--简单了解GC算法

    JVM内存组成结构: (1)堆 所有通过new创建的对象都是在堆中分配内存,其大小可以通过-Xmx和-Xms来控制,堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区.Sur ...