记录一次使用Poi读取Excel文件的过程;
1. 首先,在使用工具类读取Excel文件的时候出现了两个问题,针对问题将工具类的方法进行了修改。
- 读取空值问题:读取内容若为空,报错;
- 读取时间格式问题:读取
2019/7/16 17:11:00
类型的时间,使用工具类直接读取,会将时间转换为16-七月-2017
,或16-Jul-2017
(本机导入会将时间转换为16-七月-2017
,打包到服务器之后,导入将时间转换为16-Jul-2017
,针对两种时间都有相应的解决方法),转换之后,可以发现,时间格式变为了yyyy-MM-dd
,所以需要对方法进行修改,使转换后的时间格式为yyyy-MM-dd HH:mm:ss
。下面附上修改后的工具类;
2.工具类(针对遇到的问题修改后的工具类)
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
public class ReadExcelUtils2 {
/**
* 读写excel
*/
public static class RWExcel {
private static DateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private MultipartFile multipartFile;
private int sheetNum = 0;
/**
* 构造方法
*/
public RWExcel(MultipartFile multipartFile, int sheetNum) {
this.multipartFile = multipartFile;
this.sheetNum = sheetNum;
}
/**
* 读取excel 封装成集合
* 该程序需要传入一份excel 和excel的列数 行数由程序自动检测
* 注意:该方法统计的行数是默认第一行为title 不纳入统计的
*
* @return
*/
// @Test
public ArrayList<List> ReadXLSExcel() {
// int column = 5;//column表示excel的列数
ArrayList<List> list = new ArrayList<List>();
try {
// 建需要读取的excel文件写入stream 把这个 换成XSSFW 试试看 TODO
HSSFWorkbook workbook = new HSSFWorkbook(multipartFile.getInputStream());
// 指向sheet下标为0的sheet 即第一个sheet 也可以按在sheet的名称来寻找
HSSFSheet sheet = workbook.getSheetAt(sheetNum);
// 获取sheet1中的总行数
int rowTotalCount = sheet.getLastRowNum();
//获取总列数
int columnCount = sheet.getRow(0).getPhysicalNumberOfCells();
for (int i = 1; i <= rowTotalCount; i++) {
// 获取第i列的row对象
HSSFRow row = sheet.getRow(i);
ArrayList<String> listRow = new ArrayList<String>();
for (int j = 0; j < columnCount; j++) {
//下列步骤为判断cell读取到的数据是否为null 如果不做处理 程序会报错
//如果未null则加上""组装成非null的字符串
if (row.getCell(j) == null) {
listRow.add("");
//如果读取到额cell不为null 则直接加入 listRow集合
} else {
/* cell = row.getCell(j).toString();
listRow.add(cell);*/
Cell cell = row.getCell(j);
switch (cell.getCellTypeEnum()) {
case NUMERIC:
if (!DateUtil.isCellDateFormatted(cell)) {
listRow.add(row.getCell(j).toString());
} else {
listRow.add(formater.format(cell.getDateCellValue()));
}
break;
case ERROR:
listRow.add("");
break;
case BLANK:
listRow.add("");
break;
default:
listRow.add(row.getCell(j).toString());
break;
}
}
// 在第i列 依次获取第i列的第j个位置上的值 %15s表示前后间隔15个字节输出
}
list.add(listRow);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
public ArrayList<List> ReadXLSXExcel() {
// int column = 5;//column表示excel的列数
ArrayList<List> list = new ArrayList<List>();
try {
// 建需要读取的excel文件写入stream 把这个 换成XSSFW 试试看 TODO
XSSFWorkbook workbook = new XSSFWorkbook(multipartFile.getInputStream());
//HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(filePath));
// 指向sheet下标为0的sheet 即第一个sheet 也可以按在sheet的名称来寻找
XSSFSheet sheet = workbook.getSheetAt(sheetNum);
// 获取sheet1中的总行数
int rowTotalCount = sheet.getLastRowNum();
//获取总列数
int columnCount = sheet.getRow(0).getPhysicalNumberOfCells();
for (int i = 1; i <= rowTotalCount; i++) {
// 获取第i列的row对象
XSSFRow row = sheet.getRow(i);
ArrayList<String> listRow = new ArrayList<String>();
for (int j = 0; j < columnCount; j++) {
//下列步骤为判断cell读取到的数据是否为null 如果不做处理 程序会报错
//如果未null则加上""组装成非null的字符串
if (row.getCell(j) == null) {
listRow.add("");
//如果读取到额cell不为null 则直接加入 listRow集合
} else {
/*cell = row.getCell(j).toString();
listRow.add(cell);*/
Cell cell = row.getCell(j);
switch (cell.getCellTypeEnum()) {
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
listRow.add(formater.format(cell.getDateCellValue()));
} else {
// objects[index++] = (int) cell.getNumericCellValue();
listRow.add(row.getCell(j).toString());
}
break;
case BLANK:
listRow.add("");
break;
case ERROR:
listRow.add("");
break;
default:
listRow.add(row.getCell(j).toString());
break;
}
}
// 在第i列 依次获取第i列的第j个位置上的值 %15s表示前后间隔15个字节输出
}
list.add(listRow);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
public static String getMonthNum(String dateStr) {
try {
if (!dateStr.contains("-")) {
return null;
} else if (!dateStr.contains("月-")) {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy", Locale.US);
Date date = sdf.parse(dateStr);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(date);
return dateString;
}
DateFormat fmt = new SimpleDateFormat("dd-MM月-yyyy");
if (dateStr.contains("十")) {
dateStr = dateStr.replace("十一月", "11月");
dateStr = dateStr.replace("十二月", "12月");
dateStr = dateStr.replace("十月", "10月");
} else {
dateStr = dateStr.replace("一月", "01月");
dateStr = dateStr.replace("二月", "02月");
dateStr = dateStr.replace("三月", "03月");
dateStr = dateStr.replace("四月", "04月");
dateStr = dateStr.replace("五月", "05月");
dateStr = dateStr.replace("六月", "06月");
dateStr = dateStr.replace("七月", "07月");
dateStr = dateStr.replace("八月", "08月");
dateStr = dateStr.replace("九月", "09月");
}
Date date = fmt.parse(dateStr);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(date);
return dateString;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
}