excel操作之poi-ooxml
目前市场上流行的对于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的更多相关文章
- Npoi导入导出Excel操作
之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求. 在winform上面实现excel操作:http://www.cnblogs.com/Cal ...
- .Net Excel操作之NPOI(一)简介
一.NPOI简介 NPOI是一个开源项目,可以读/写xls,doc,ppt文件,有着广泛的应用. 使用NPOI能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支 ...
- 数据导出生成Excel附件使用POI的HSSFWorkbook对象
比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和Java Excel.Jakarta POI 是一套用于访问微软格式文档的Java API.Jakarta POI有很多组 ...
- Delphi Excel 操作大全
Delphi Excel 操作大全 (一) 使用动态创建的方法首先创建 Excel 对象,使用ComObj:var ExcelApp: Variant;ExcelApp := CreateOleObj ...
- C#EXCEL 操作类--C#ExcelHelper操作类
主要功能如下1.导出Excel文件,自动返回可下载的文件流 2.导出Excel文件,转换为可读模式3.导出Excel文件,并自定义文件名4.将数据导出至Excel文件5.将指定的集合数据导出至Exce ...
- Excel 操作类
转载:http://www.cnblogs.com/fellowcheng/archive/2010/08/21/1805158.html ExcelHelper(Excel2007) Code hi ...
- C# excel操作
开源的Excel操作项目: http://www.cnblogs.com/lwme/archive/2011/11/27/2265323.html 添加引用:Microsoft Excel 11.0 ...
- [Excel操作]Microsoft Office Excel 不能访问文件
最近,客户服务器迁移,因操作系统环境变化而引起的的环境问题一堆,遇到的问题并解决方法在“[Excel]操作”类别会体现. Microsoft Office Excel 不能访问文件“C:\\LMSEx ...
- C#常用工具类——Excel操作类
/// 常用工具类——Excel操作类 /// <para> ------------------------------------------------</para> / ...
- 报表中的Excel操作之Aspose.Cells(Excel模板)
原文:报表中的Excel操作之Aspose.Cells(Excel模板) 本篇中将简单记录下Aspose.Cells这个强大的Excel操作组件.这个组件的强大之处,就不多说,对于我们的报表总是会有导 ...
随机推荐
- 《Brennan's Guide to Inline Assembly》学习笔记
原文见Brennan's Guide to Inline Assembly. AT&T语法 vs Intel语法 DJGPP是基于GCC的,因此它使用AT&T/UNIT语法,这和Int ...
- [Cometoj#3 D]可爱的菜菜子_线段树_差分_线性基
可爱的菜菜子 题目链接:https://cometoj.com/contest/38/problem/D?problem_id=1543 数据范围:略. 题解: 首先,如果第一个操作是单点修改,我们就 ...
- eXosip的register注册
转载于:http://blog.sina.com.cn/s/blog_4868f98601018ioh.html 这个测试程序是从eXosip原有的测试程序改造的.原程序是tools 目录下的 sip ...
- SpreadJS:一款高度类似Excel的开发工具,功能涵盖Excel的 95% 以上
Excel 作为一款深受用户喜爱的电子表格工具,借助其直观的界面.出色的计算性能.数据分析和图表,已经成为数据统计领域不可或缺的软件之一. 基于Excel对数据处理与分析的卓越表现,把Excel的功能 ...
- 【AtCoder】ARC060
ARC060 C - 高橋君とカード / Tak and Cards 每个数减去A,然后转移N次,每次选或不选,最后是和为0的时候的方案数,负数可以通过把所有数右移2500做到 #include &l ...
- Idea中Smart Tomcat插件启动报NullPointerException问题
如果你跟我一样用的是Idea Community社区版的话,也一定会遇到用Smart Tomcat插件启动报错的问题: 这个问题网上搜了一圈,大家好像也都遇到过了,不过也都没有找到原因和给出解决方案. ...
- spark异常篇-集群模式无法打印
在集群上运行 spark 时候,对 RDD 进行 foreach(print) 并没有打印任何内容,这是怎么回事呢? 这是因为 RDD 运行在各个 worker 上,foreach 是对 各个 wor ...
- glang flag
package main import ( "flag" "fmt" "github.com/golang/glog" ) /* 解析 fl ...
- hdu 1502 大数dp
对于每一个dp的问题 从其最优解的结构(分哪几种形式或者情况)入手 然后分析状态 这样就比较好找出状态转方程这里数据结构的选择很简单 顺序数组就可以 填充的方式顺序填充就可以 然后这道题目卡了我大数. ...
- 给枚举定义DescriptionAttribute
在C#中,枚举用来定状态值很方便,例如我定义一个叫做Season的枚举 public enum Season { Spring = 1, Summer = 2, Autumn = 3, Winter ...