java 读取Excel文件并数据持久化方法Demo
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的更多相关文章
- Java读取Excel文件的几种方法
Java读取 Excel 文件的常用开源免费方法有以下几种: 1. JDBC-ODBC Excel Driver 2. jxl.jar 3. jcom.jar 4. poi.jar 简单介绍: 百度文 ...
- R语言读取excel文件的3种方法
R读取excel文件中数据的方法: 电脑有一个excel文件,原始的文件路径是:E:\R workshop\mydata\biom excel数据为5乘2阶矩阵,元素为 ...
- java分享第十六天( java读取properties文件的几种方法&java配置文件持久化:static块的作用)
java读取properties文件的几种方法一.项目中经常会需要读取配置文件(properties文件),因此读取方法总结如下: 1.通过java.util.Properties读取Propert ...
- java读取excel文件的代码
如下内容段是关于java读取excel文件的内容,应该能对各朋友有所用途. package com.zsmj.utilit; import java.io.FileInputStream;import ...
- java读取txt文件的2中方法---并将内容(每一行以固定的字符分割切成2段)存到map中去
#java读取txt文件的第一种方法 /** * 方法:readTxt * 功能:读取txt文件并把txt文件的内容---每一行作为一个字符串加入到List中去 * 参数:txt文件的地址 * 返回: ...
- 关于解决java读取excel文件遇空行抛空指针的问题 !
关于解决java读取excel文件遇空行抛空指针的问题 ! package exceRead; import java.io.File; import java.io.FileInputStream; ...
- java读取excel文件数据导入mysql数据库
这是我来公司的第二周的一个小学习任务,下面是实现过程: 1.建立maven工程(方便管理jar包) 在pom.xml导入 jxl,mysql-connector 依赖 可以在maven仓库搜索 2.建 ...
- 读取Excel文件的两种方法
第一种方法:传统方法,采用OleDB读取EXCEL文件, 优点:写法简单,缺点:服务器必须安有此组件才能用,不推荐使用 private DataSet GetConnect_DataSet2(stri ...
- .NET读取Excel文件的三种方法的区别
ASP.NET读取Excel文件方法一:采用OleDB读取Excel文件: 把Excel文件当做一个数据源来进行数据的读取操作,实例如下: public DataSet ExcelToDS(strin ...
随机推荐
- SQL搜索下划线,like中不能匹配下划线的问题
最近在检测天气预报15天查询网 站(http://tqybw.net)时的URL时,发现页面中有很些404页,分析发现,是请求地址的能参数中多了下划线“_”,而rewrite规 则中并没有配这样的规则 ...
- Demonstrating One-Shot Execution TimerTask Timer
Listing -. Demonstrating One-Shot Execution import java.util.Timer; import java.util.TimerTask; publ ...
- MFC函数之BitBlt
MFC函数之BitBlt // Cgame123View 绘制 void Cgame123View::OnDraw(CDC* pDC) { Cgame123Doc* pDoc = GetDocumen ...
- Asp.Net MVC Control向View传值
1.通过View(Parameter)参数传值 Control: namespace MyMVCDemo.Controllers { public class PersonControlle ...
- c signal
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使用信号,以及有关信号的几个系统调用. 信号机制是进程之间相互传递消息的一种方法,信号全 ...
- jQuery插件之Wookmark瀑布流
使用方法: 1.下载wookmark.js 2.构建html <div class="wrapper"> <div id="con1_1"&g ...
- Barricade---hdu5889(最短路+网络流)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5889 题意:有n个点m条边,每条边的长度相同,我们可以默认为1,构成一个无向图:现在起点为1,终点为n ...
- 简述C#中关键字var和dynamic的区别
C#中关键字var和dynamic的区别如下: 1.var申明的变量必须初始化,dynamic申明的变量无需初始化. 2.var关键字只能在方法内部申明局部变量,dynamic关键字可用于局部变量,字 ...
- JAVA并发编程的艺术
CAS有两个特点: 1.for循环 2.compareAndSet(可能别的线程先改变然后又重置,此时CAS是成功的,也就是CAS执行的过程中,可能多个线程对此变量做了修改,而不是各个线程互斥的修改) ...
- 忘记Mysql的root密码的处理办法
1,停止MYSQL服务,CMD打开DOS窗口,输入 net stop mysql 2,在CMD命令行窗口,进入MYSQL安装目录 比如E:\Program Files\MySQL\MySQL Serv ...