import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.poifs.filesystem.NPOIFSFileSystem;
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.xssf.usermodel.XSSFWorkbook; public class ReadExcelUtil { /**
*
* @param inputStream 文件
* @param fileName 文件名(full name)
* @param sheetNum 表單序號(不寫表示全部讀取,不建議這樣做)
* @param flag 建議選擇false(true表示按單元格格式進行讀取數據,false表示所有按String格式讀取)
* @param r 開始讀取的行號
* @param c 開始讀取的列號
* @return Map<String, List<List<Object>>>
* String: sheet 的序号
* List<Object>: 每一行中每一个格子的值组成的数组,为有序 ArrayList
* List<List<Object>>: 以每一行所有格子的值组成的List为元素,组成新的List,为有序 ArrayList
*/
public Map<String, List<List<Object>>> readExcel(InputStream inputStream, String fileName, int sheetNum, boolean flag, int r, int c) {
Workbook wb = getExcelKind(inputStream, fileName);
Map<String, List<List<Object>>> map = readSheet(wb, sheetNum, flag, r, c);
return map;
}
public Map<String, List<List<Object>>> readExcel(InputStream inputStream, String fileName, boolean flag, int r, int c) {
Workbook wb = getExcelKind(inputStream, fileName);
Map<String, List<List<Object>>> map = readSheet(wb, flag, r, c);
return map;
} /**
* 选择sheet(工作表格区间)读取表格,可遍历
*
* @param wb
* @param sheetNum
* @param flag
* @param r
* @param c
* @return
*/
public Map<String, List<List<Object>>> readSheet(Workbook wb, int sheetNum, boolean flag, int r, int c) {
Map<String, List<List<Object>>> map = new HashMap<String, List<List<Object>>>();
int sn = 0;
for (Sheet sheet : wb) {
if (sn >= sheetNum) {
break;
}
List<List<Object>> list = readRow(sheet, flag, r, c);
map.put(wb.getSheetName(sn), list);
sn++;
}
return map;
} public Map<String, List<List<Object>>> readSheet(Workbook wb, boolean flag, int r, int c) {
Map<String, List<List<Object>>> map = new HashMap<String, List<List<Object>>>();
int sn = 0;
for (Sheet sheet : wb) {
List<List<Object>> list = readRow(sheet, flag, r, c);
       // 以表单的名字为key存储
map.put(wb.getSheetName(sn), list);
sn++;
}
return map;
} /**
* 按 行、列 遍历式 读取表格
*
* @param sheet
* @param flag
* @param r
* @param c
* @return List<List<Object>>
*/
public List<List<Object>> readRow(Sheet sheet, boolean flag, int r, int c) {
List<List<Object>> list = new ArrayList<List<Object>>();
for (Row row : sheet) {
List<Object> olist = new ArrayList<Object>();
for (Cell cell : row) {
int rowNum = row.getRowNum();
int columnIndex = cell.getColumnIndex();
if (rowNum >= r && columnIndex >= c) {
Object obj = readCell(cell, flag);
olist.add(obj);
}
}
list.add(olist);
}
return list;
} /**
* 按 格子 读取表格
*   这个方法是根据官方的文档改编的,大致跟官方一样,可是总感觉哪里不舒服
* @param cell
* @param flag
* @return
*/
public Object readCell(Cell cell, boolean flag) {
Object obj = null;
if (flag) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
obj = cell.getDateCellValue();
} else obj = cell.getNumericCellValue();
break;
case Cell.CELL_TYPE_STRING:
obj = cell.getRichStringCellValue().getString(); break;
case Cell.CELL_TYPE_FORMULA:
obj = cell.getCellFormula(); break;
case Cell.CELL_TYPE_BLANK:
         // TODO 感觉这里处理的不是很好,应该有一个更好的处理行为才对
break;
case Cell.CELL_TYPE_BOOLEAN:
obj = cell.getBooleanCellValue(); break;
case Cell.CELL_TYPE_ERROR:
obj = "cell ERROR"; break;
default: break;
}
} else obj = cell.toString();
return obj;
} /**
* 根据文件后缀名,创建不同的 workbook 的类型
*
* @param file
* @param suffix
* @return workbook wb
*/
public Workbook getExcelKind(InputStream file, String fileName) {
String suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
// Workbook wb = WorkbookFactory.create(file); 这是为了学习新的方法,才将这句注释掉的。否则,只需要这一句,下面的基本全都可以省略
Workbook wb = null;
if (suffix != null && suffix.equals("xlsx")) { // 07+
try {
OPCPackage pkg = OPCPackage.open(file);
wb = new XSSFWorkbook(pkg);
pkg.close();
} catch (InvalidFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else if (suffix != null && suffix.equals("xls")) { // 03-
try {
NPOIFSFileSystem fs = new NPOIFSFileSystem(file);
wb = new HSSFWorkbook(fs.getRoot(), true);
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
} else if (suffix == null) {
return null;
} else {
System.out.println("没找到对应的后缀名,检查后再试试呗。");
return null;
}
return wb;
} }

只是一个小小的例子,本想着能把这个方法做成普适的,可惜总有几个牛角尖钻不透,智商着急啊。

=====================================第二版=====================================

 import com.google.common.collect.Lists;
import com.vastio.exception.PlatformException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.io.FileInputStream;
import java.io.IOException;
import java.util.List; public class ReadExcelFile { private static final Logger LOGGER = LoggerFactory.getLogger(ReadExcelFile.class.getName()); public static void main(String[] args) {
String path = "C:\\test.xls";
System.out.println(readExcel(path));
} /**
* 读取Excel文件并将数据放到list中
*
* @param path 文件的绝对路径
* @return list
*/
public static List<List<List<String>>> readExcel(String path) {
List<List<List<String>>> sheetList = Lists.newArrayList();
try {
Workbook workbook = WorkbookFactory.create(new FileInputStream(path));
int sheetNum = workbook.getNumberOfSheets(); // sheet数目
List<List<String>> rowList = Lists.newArrayList();
for (int i = 0; i < sheetNum; i++) {
Sheet sheet = workbook.getSheetAt(i);
int rowNum = sheet.getPhysicalNumberOfRows(); // 总行数
for (int r = 0; r < rowNum; r++) {
int cellNum = sheet.getRow(r).getPhysicalNumberOfCells(); // 每一行包含的总格子数
List<String> cellList = Lists.newArrayList();
for (short c = 0; c < cellNum; c++) {
Cell cell = sheet.getRow(r).getCell(c);
String value;
if (cell == null) continue;
switch (cell.getCellTypeEnum()) {
case FORMULA: // 公式
value = String.valueOf(cell.getCellFormula());
cellList.add(value);
break;
case NUMERIC: // 数值
value = String.valueOf(cell.getNumericCellValue());
cellList.add(value);
break;
case STRING: // 字符串
value = String.valueOf(cell.getStringCellValue());
cellList.add(value);
break;
case BLANK: // 空白
value = "";
cellList.add(value);
break;
case BOOLEAN:
value = String.valueOf(cell.getBooleanCellValue());
cellList.add(value);
break;
case ERROR:
value = String.valueOf(cell.getErrorCellValue());
cellList.add(value);
break;
case _NONE:
value = "error at : " + cell.getAddress();
throw new PlatformException(value); // 自定义的异常类
default:
break;
}
}
rowList.add(cellList);
}
sheetList.add(rowList);
}
} catch (IOException e) {
LOGGER.debug(e.getMessage());
} catch (InvalidFormatException e) {
LOGGER.debug(e.getMessage());
} catch (PlatformException e) {
LOGGER.debug(e.getMessage());
}
return sheetList;
}
}

这个是简易版,自定义的成分居多。

需要导入的包有

'org.apache.poi:poi:3.15',
'org.apache.poi:poi-ooxml:3.15',
'com.github.virtuald:curvesapi:1.04',
'commons-codec:commons-codec:1.10',
'org.apache.poi:poi-ooxml-schemas:3.15',
'org.apache.commons:commons-collections4:4.1'

构建工具为gradle。

java 读取Excel文件并数据持久化方法Demo的更多相关文章

  1. Java读取Excel文件的几种方法

    Java读取 Excel 文件的常用开源免费方法有以下几种: 1. JDBC-ODBC Excel Driver 2. jxl.jar 3. jcom.jar 4. poi.jar 简单介绍: 百度文 ...

  2. R语言读取excel文件的3种方法

    R读取excel文件中数据的方法: 电脑有一个excel文件,原始的文件路径是:E:\R workshop\mydata\biom excel数据为5乘2阶矩阵,元素为                ...

  3. java分享第十六天( java读取properties文件的几种方法&java配置文件持久化:static块的作用)

     java读取properties文件的几种方法一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取Propert ...

  4. java读取excel文件的代码

    如下内容段是关于java读取excel文件的内容,应该能对各朋友有所用途. package com.zsmj.utilit; import java.io.FileInputStream;import ...

  5. java读取txt文件的2中方法---并将内容(每一行以固定的字符分割切成2段)存到map中去

    #java读取txt文件的第一种方法 /** * 方法:readTxt * 功能:读取txt文件并把txt文件的内容---每一行作为一个字符串加入到List中去 * 参数:txt文件的地址 * 返回: ...

  6. 关于解决java读取excel文件遇空行抛空指针的问题 !

    关于解决java读取excel文件遇空行抛空指针的问题 ! package exceRead; import java.io.File; import java.io.FileInputStream; ...

  7. java读取excel文件数据导入mysql数据库

    这是我来公司的第二周的一个小学习任务,下面是实现过程: 1.建立maven工程(方便管理jar包) 在pom.xml导入 jxl,mysql-connector 依赖 可以在maven仓库搜索 2.建 ...

  8. 读取Excel文件的两种方法

    第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(stri ...

  9. .NET读取Excel文件的三种方法的区别

    ASP.NET读取Excel文件方法一:采用OleDB读取Excel文件: 把Excel文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(strin ...

随机推荐

  1. Memcached原理深度分析详解

    Memcached是 danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能.关于这个东 西,相信很多人都用过,本文意在通 ...

  2. phpspec安装配置

    安装  composer require phpspec/phpspec -dev 运行  bin/phpspec 在laravel中  vendor/bin/phpspec 配置phpspec.ym ...

  3. (转)常用的js设计模式

    模式是解决或者避免一些问题的方案. 在JavaScript中,会用到一些常用的编码模式.下面就列出了一些常用的JavaScript编码模式,有的模式是为了解决特定的问题,有的则是帮助我们避免一些Jav ...

  4. python : dictionary changed size during iteration

    1. 错误方式 #这里初始化一个dict >>> d = {'a':1, 'b':0, 'c':1, 'd':0} #本意是遍历dict,发现元素的值是0的话,就删掉 >> ...

  5. java不常用语法汇总(jdk1.6)

    1.浮点数省略的0 System.out.println(.5f); //.5和0.5等价. 2.import static引入一个static method后,可以在这个类中直接使用这个method ...

  6. Dynamics AX 从数据库二进制数据导出图片

    // andy 2014/12/10 static void SSW_Bit2ImageFile(Args _args) { Bitmap curBitmap; Image curImage; ; c ...

  7. Selenium2学习-019-WebUI自动化实战实例-017-获取浏览器类型

    Web UI 自动化脚本分布执行过程中有时候需要获取浏览器的相关信息,此文给出了一个简略获取浏览器类型的方法,敬请各位小主们参阅.若有不足之处,敬请大神指正,不胜感激! 闲话少述,上码. /** * ...

  8. android apk简单反编译

    1. 查看或者提取资源文件:     使用谷歌官方工具apktool,命令行如下: apktool d xxx.apk xxx_decode d代表反编译,xxx.apk为你要反编译的apk,xxx_ ...

  9. table表格某一td内容太多导致样式混乱的解决方案

    对于有很多条目的数据,通常采用table元素来快速实现,某一个td的内容太多的话就会导致样式混乱难看. 解决方案 要让table的宽度固定可以给table元素设置table-layout:fixed; ...

  10. 配置Tomcat6的管理用户

    在Tomcat上发布war之前需要配置一个管理用户以进入上传页面,而配置就是通过修改/usr/local/tomcat6/conf/tomcat-users.xml这个文件进行的.下面是修改后的文字: ...