基于Apache POI的Java读写excel的操作实现,网上的教程有很多,但是都不是很通用,尤其是在写操作的时候,你不知道写进来的数据格式是怎么样的,更无法去格式化。因此本文基于Apache POI,利用Java注解的方式,实现一个通用的Excel读写工具类。
一、Excel读操作
excel读操作相对比较简单,实现方式比较统一,就是读取excel的每一行,再读取每一列,将内容取出。具体实现如下。
/**
* 日期格式化
*/
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd HH:mm");
/**
* 整数格式化,取所有整数部分
*/
private static final DecimalFormat df = new DecimalFormat("#");
/**
* 读取Excel表格表头的内容
* @param inputStream
* @return String 表头内容的数组
*/
public static List<String> readExcelTitle(InputStream inputStream, String fileName) throws Exception {
List<String> titles = Lists.newArrayList();
Workbook workbook = getWorkbook(inputStream, fileName);
if (workbook == null) {
return titles;
}
Sheet sheet = workbook.getSheetAt(0);
//excel为空
if (sheet.getLastRowNum() == 0 && sheet.getPhysicalNumberOfRows() == 0) {
return titles;
}
//得到首行的row
Row row = sheet.getRow(0);
//标题总列数
int colNum = row.getPhysicalNumberOfCells();
for (int i = 0; i < colNum; i++) {
titles.add(getStringCellValue(row.getCell(i)));
}
return titles;
}
/**
* 读取excel文件内容
* @param inputStream 文件输入流, excel具体内容
* @param fileName 文件名,通过文件后缀名判断excel版本
* @return
* @throws Exception
*/
public static List<List<String>> readExcelContent(InputStream inputStream, String fileName) throws Exception {
List<List<String>> result = Lists.newArrayList();
Workbook workbook = getWorkbook(inputStream, fileName);
if (workbook == null) {
return result;
}
try {
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0);
if (row == null) {
return result;
}
int colNum = row.getLastCellNum();
// 得到总行数
int rowNum = sheet.getLastRowNum();
// 正文内容应该从第二行开始,第一行为表头的标题
for (int i = 0; i <= rowNum; i++) {
row = sheet.getRow(i);
// 过滤空白行
if (isBlankRow(colNum, row)) {
continue;
}
List<String> rowContents = Lists.newArrayList();
for (int j = 0; j < colNum; j++) {
rowContents.add(getCellValue(row.getCell(j)));
}
result.add(rowContents);
}
} catch (Exception e) {
throw new Exception("excel解析失败!");
}
return result;
}
private static boolean isBlankRow(int colNum, Row row) {
for (int i = 0; i <= colNum; i++) {
// 只要有一列不为空, 该行就不为空行
if (StringUtils.isNotBlank(getCellValue(row.getCell(i)))) {
return false;
}
}
return true;
}
/**
* 获取workbook
*/
private static Workbook createWorkbook(String fileName) throws Exception {
Workbook workbook = null;
if (isExcel2003