目前比较流行处理excel文档的方式一般有两种,分别是POI和JXL。重量级POI优缺点:适合对excel文档细节有比较专业的要求,如使用公式、宏等高级功能;缺点是操作相对繁琐,非纯java编写的架包,跨平台性有待加强。轻量级JXL优缺点:Jxl是纯javaAPI,跨平台性优越,操作相对简便;缺点是对excel文档的一些高级功能不支持,但可以满足日常需求。这里我们介绍POI的基本使用。

1.首先导入相关架包,如图:

这里还要注意你开发项目的JDK版本是什么,要根据相应JDK版本下载不同POI的版本。

如图:

2.操作ExcelReader辅助类可以处理xls和xlsx文件,readExcelTitle(InputStream is)方法读取文件标题,也就是文件首行,readExcelContent(InputStream is)方法读取文件内容:

import java.io.IOException;

import java.io.InputStream;

import java.text.DecimalFormat;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.LinkedHashMap;

import java.util.Map;

import org.apache.log4j.Logger;

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.DateUtil;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

import org.apache.poi.ss.usermodel.WorkbookFactory;

/**

* 操作Excel表格的功能类

*/

public class ExcelReader {

private static DecimalFormat df = new DecimalFormat("0");

private final static Logger log = Logger.getLogger(ExcelReader.class);

private Workbook wb=null;

private Sheet sheet=null;

private Row row=null;

/**

* 读取Excel表格表头的内容

* @param InputStream

* @return String 表头内容的数组

* @throws IOException

*/

public String[] readExcelTitle(InputStream is) throws Exception {

try {

wb = WorkbookFactory.create(is);

} catch (IOException e) {

log.error("读取Excel表格表头的内容异常", e);

throw e;

}

sheet = wb.getSheetAt(0);

row = sheet.getRow(0);

// 标题总列数

int colNum = row.getPhysicalNumberOfCells();

String[] title = new String[colNum];

for (int i = 0; i < colNum; i++) {

title[i] = getCellFormatValue(row.getCell(i));

}

log.info("读取Excel表格表头的内容完毕");

return title;

}

/**

* 读取Excel数据内容

* @param InputStream

* @return Map 包含单元格数据内容的Map对象

* @throws IOException

*/

public Map readExcelContent(InputStream is) throws Exception {

Map content = new LinkedHashMap();

String str = "";

try {

wb = WorkbookFactory.create(is);

} catch (IOException e) {

log.error("读取Excel数据内容", e);

throw e;

}

sheet = wb.getSheetAt(0);

// 得到总行数

int rowNum = sheet.getLastRowNum();

row = sheet.getRow(0);

int colNum = row.getPhysicalNumberOfCells();

// 正文内容应该从第二行开始,第一行为表头的标题

for (int i = 1; i <= rowNum; i++) {

row = sheet.getRow(i);

int j = 0;

while (j < colNum) {

// 每个单元格的数据内容用"-"分割开,以后需要时用String类的replace()方法还原数据

// 也可以将每个单元格的数据设置到一个javabean的属性中,此时需要新建一个javabean

// str += getStringCellValue(row.getCell((short) j)).trim() +

// "-";

if (row != null) {

str += getCellFormatValue(row.getCell(j)).trim() + ",";

} else {

str += "" + ",";

}

j++;

}

content.put(i, str.substring(0, str.length() - 1));

str = "";

}

log.info("读取Excel数据内容完毕");

return content;

}

/**

* 根据Cell类型设置数据

* @param cell

* @return

*/

private String getCellFormatValue(Cell cell) {

String cellvalue = "";

if (cell != null) {

// 判断当前Cell的Type

switch (cell.getCellType()) {

// 如果当前Cell的Type为NUMERIC

case Cell.CELL_TYPE_NUMERIC:

case Cell.CELL_TYPE_FORMULA: {

// 判断当前的cell是否为Date

if (DateUtil.isCellDateFormatted(cell)) {

// 如果是Date类型则,转化为Data格式

//方法1:这样子的data格式是带时分秒的:2015-12-18 0:00:00

//cellvalue = cell.getDateCellValue().toLocaleString();

//方法2:这样子的data格式是不带带时分秒的:2011-10-12

Date date = cell.getDateCellValue();

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

cellvalue = sdf.format(date);

}

// 如果是纯数字

else {

// 取得当前Cell的数值

cellvalue = String.valueOf(df.format(cell.getNumericCellValue()));

}

break;

}

// 如果当前Cell的Type为STRIN

case Cell.CELL_TYPE_STRING:

// 取得当前的Cell字符串

cellvalue = cell.getRichStringCellValue().getString();

break;

// 默认的Cell值

default:

cellvalue = " ";

}

} else {

cellvalue = "";

}

return cellvalue;

}

}

简单实例代码,实际使用中应该加上异常处理机制:

12345678910111213      FileInputStream is = new FileInputStream(file);

ExcelReader excelReader = new ExcelReader();

String[] title = excelReader.readExcelTitle(is);//读取文件标题(非文件名,而是文件第一行)

for (String str : title) {

System.out.println(str);

}

is.close();

is = new FileInputStream(file);

Map map = excelReader.readExcelContent(is);//读取文件内容

for (int i = 1; i <= map.size(); i++) {

System.out.println(map.get(i));

}

is.close();

相关截图:

POI 的详细介绍:请点这里

POI 的下载地址:请点这里

linux系统处理excel,Apache POI处理Excel文档相关推荐

  1. [实用][更新中]Java Apache POI 打印Word文档工具(含文本替换,动态表格功能)

    [实用][更新中]Java Apache POI 打印Word文档工具(含文本替换,动态表格功能) 基于Apache POI对Word进行操作 一.基于Apache POI封装的word文档工具V1. ...

  2. 关于Apache / poi 生成word文档之后不能正常换行的问题

    近期公司项目有个把文本转成word文档的功能,开始使用io操作输出文件的方式(后缀名是docx),使用手机自带的文档浏览工具打开是没有问题的,但是在电脑上用微软office就打开有问题了,于是找了三方 ...

  3. Java POI Word 写文档

    一个使用Apache POI写word文档的实例: 1 package apache.poi; 2 3 import java.io.ByteArrayInputStream; 4 import ja ...

  4. 【Apache POI】Excel操作(四):Excel大数据量的写入

    迷茫代表着你身边还有选择,焦虑意味着你手上还有时间. 有目录,不迷路 前言 超量数据 速率比较 原因剖析 超级版本大救星 往期回顾 前言 之前在下面这期Excel操作: [Apache POI]Exc ...

  5. Apache POI和EasyExcel 第六集:Apache POI的Excel读取单元格中的计算公式

    Apache POI和EasyExcel 第六集:Apache POI的Excel读取单元格中的计算公式 一.资源 代码实现中的带有计算公式的Excel(xls) 链接:https://pan.bai ...

  6. Apache POI和EasyExcel 第五集:Apache POI的Excel读取不同类型的数据

    Apache POI和EasyExcel 第五集:Apache POI的Excel读取不同类型的数据 一.资源 什么是Apache POI Apache POI 不同类型的数据的表格(xls) 链接: ...

  7. Apache POI和EasyExcel 第四集:Apache POI的Excel基本读取(分为03版的xls、07版的xlsx)

    Apache POI和EasyExcel 第四集:Apache POI的Excel基本读取(分为03版的xls.07版的xlsx) 一.资源 一个十分好用的日期类型处理包,和Java8搭配使用非常好 ...

  8. Apache POI和EasyExcel 第三集:Apache POI的Excel大数据量写入(分为03版的xls、07版的xlsx、升级版SXSSF)

    Apache POI和EasyExcel 第三集:Apache POI的Excel大数据量写入(分为03版的xls.07版的xlsx.升级版SXSSF) 一.结果 我的03跑了1.204秒,07跑了5 ...

  9. Java开发小技巧(六):使用Apache POI读取Excel

    前言 在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这里所说的数据源并非仅仅是指数据库,还包括excel.csv.xml等各种类型的数据接口文件,而这些文件中的数据不一定是结构化存储的, ...

  10. Apache POI操作Excel导出JAVABEAN对象方法

    2019独角兽企业重金招聘Python工程师标准>>> Apache POI操作Excel导出方法说明 Apache的POI组件是Java操作Microsoft Office办公套件 ...

最新文章

  1. jquery实现后台系统左侧菜单的点击展开/收缩二级菜单效果
  2. CentOS下的账户管理
  3. 一段把mp4中的音频提取并保存在原目录的python脚本
  4. IT部门的服务工作方式、工作内容有了彻底的改变——安徽移动通信有限责任公司...
  5. 数据结构五——二叉树
  6. 连续两年入选Gartner公共云容器,阿里云在边缘容器方面做了什么?
  7. Oracle存储过程及函数的练习题
  8. Eclipse创建SpringMVC,Spring, Hibernate项目
  9. jquery 选择器、筛选器、事件绑定与事件委派
  10. mongod启动问题
  11. 小米集团本周再回购1920万港元股票
  12. 【数据结构----笔记1】查找算法之【顺序查找和折半查找】
  13. Python建立数据库
  14. 3d模型多怎么优化_近似模型之响应面建模
  15. dd软件linux,dd工具
  16. 如何把几张照片拼在一起?
  17. JavaSE程序分析005 Integer的小事情
  18. 使用kdevelop出现问题及解决
  19. 网易视频云:HBase优化实战
  20. Improving Knowledge-aware Recommendation with Multi-levelInteractive Contrastive Learning

热门文章

  1. 最新资料!工银亚洲开户见证业务受理网点(深圳地区)
  2. 生成SQLite的db文件
  3. 【LibTorch】Microsoft C++ 异常: c10::NotImplementedError,位于内存位置 0x000000E8A9DAEDC0 处。
  4. 注册表(安全 活动桌面)
  5. MATLAB自定义拟合函数
  6. Elasticsearch 分布式搜索引擎 -- 数据聚合(聚合的种类、DSL实现聚合、RestAPI实现聚合)
  7. mysql根据日周月分组计算
  8. python批量修改照片的大小
  9. 微信悄悄新出了个野心很大的App
  10. c语言大一,C语言复习 大一.doc