这几天有个需求问题,将ftp内excel文件读取存入到数据库,一开始因为要用POI解析Excel使用的工具类是传入一个路径,但是因为远程FTP传入的路径在项目中老报错找不到文件,想了想之后应该是路径传入工具类后,在工具类读取时候直接用了new InputStream这样并不在FTP SERVER进行,所以会报错,修改了下工具类,使用了读取文件的流传入工具类.读取内容就OK了.下面是代码内容:
读取的二维数组第一维度是Excel的行数据, 第二维度是Excel的多行数据
/** 读取存在任意合并单元格的工具类 */
package com.jumbo.util;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
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.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* @author 楚长川
* @version 创建时间:2018/8/27 9:56
* @ClassName: ExcelReaderUtil
* @Title: parent
* @Description: todo:(Excel读取到二维集合-此工具类可以对应存在合并单元格的excel)
*/
public class ExcelReaderUtil {
/**
* @param is
* @return List<List<String>> 返回类型
* @Title: readXls
* @Description: 处理xls文件
*/
public static List<List<String>> readXls(InputStream is) throws Exception {
// HSSFWorkbook 标识整个excel
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
List<List<String>> result = new ArrayList<List<String>>();
int size = hssfWorkbook.getNumberOfSheets();
// 循环每一页,并处理当前循环页
for (int numSheet = 0; numSheet < size; numSheet++) {
// HSSFSheet 标识某一页
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 处理当前页,循环读取每一行
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
// HSSFRow表示行
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
int minColIx = hssfRow.getFirstCellNum();
int maxColIx = hssfRow.getLastCellNum();
List<String> rowList = new ArrayList<String>();
// 遍历改行,获取处理每个cell元素
for (int colIx = minColIx; colIx < maxColIx; colIx++) {
// HSSFCell 表示单元格
HSSFCell cell = hssfRow.getCell(colIx);
boolean isMerge = isMergedRegion(hssfSheet, rowNum, colIx);
//判断是否具有合并单元格
if(isMerge) {
rowList.add(getMergedRegionValue(hssfSheet, rowNum, colIx));
}else {
//returnStr = cell.getRichStringCellValue().getString();
rowList.add(getStringVal(cell));
}
if (cell == null) {
continue;
}
}
result.add(rowList);
}
}
return result;
}
/**
* @param is
* @return List<List<String>> 返回类型
* @Title: readXlsx
* @Description: 处理Xlsx文件
*/
public static List<List<String>> readXlsx(InputStream is) throws Exception {
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
List<List<String>> result = new ArrayList<List<String>>();
// 循环每一页,并处理当前循环页
for (XSSFSheet xssfSheet : xssfWorkbook) {
if (xssfSheet == null) {
continue;
}
// 处理当前页,循环读取每一行
for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
XSSFRow xssfRow = xssfSheet.getRow(rowNum);
int minColIx = xssfRow.getFirstCellNum();
int maxColIx = xssfRow.getLastCellNum();
List<String> rowList = new ArrayList<String>();
for (int colIx = minColIx; colIx < maxColIx; colIx++) {
XSSFCell cell = xssfRow.getCell(colIx);
if (cell == null) {
continue;
}
rowList.add(cell.toString());
}
result.add(rowList);
}
}
return result;
}
/**
* 改造poi默认的toString()
* @param @param cell
* @param @return 设定文件
* @return String 返回类型
* @throws
* @Title: getStringVal
* @Description:
* 1.对于不熟悉的类型,或者为空则返回""控制串
* 2.如果是数字,则修改单元格类型为String,然后返回String,保证数字不被格式化
*/
public static String getStringVal(HSSFCell cell) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
return cell.getBooleanCellValue() ? "TRUE" : "FALSE";
case Cell.CELL_TYPE_FORMULA:
return cell.getCellFormula();
case Cell.CELL_TYPE_NUMERIC:
//cell.setCellType(Cell.CELL_TYPE_STRING);
//return cell.getStringCellValue();
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
return DateFormatUtils.format(date, "yyyy-MM-dd HH:mm:ss");
} else {
DecimalFormat df = new DecimalFormat("0");
return(df.format(cell.getNumericCellValue()));
}
case Cell.CELL_TYPE_STRING:
return cell.getStringCellValue();
default:
return "";
}
}
/**
* 判断指定的单元格是否是合并单元格
* @param hssfSheet
* @param row 行下标
* @param column 列下标
* @return
*/
private static boolean isMergedRegion(HSSFSheet hssfSheet, int row , int column) {
int sheetMergeCount = hssfSheet.getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress range = hssfSheet.getMergedRegion(i);
int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if(row >= firstRow && row <= lastRow){
if(column >= firstColumn && column <= lastColumn){
return true;
}
}
}
return false;
}
/**
* 获取合并单元格的值
* @param hssfSheet
* @param row
* @param column
* @return
*/
public static String getMergedRegionValue(HSSFSheet hssfSheet ,int row , int column){
int sheetMergeCount = hssfSheet.getNumMergedRegions();
for(int i = 0 ; i < sheetMergeCount ; i++){
CellRangeAddress ca = hssfSheet.getMergedRegion(i);
int firstColumn = ca.getFirstColumn();
int lastColumn = ca.getLastColumn();
int firstRow = ca.getFirstRow();
int lastRow = ca.getLastRow();
if(row >= firstRow && row <= lastRow){
if(column >= firstColumn && column <= lastColumn){
HSSFRow hssfRow = hssfSheet.getRow(firstRow);
HSSFCell fCell = hssfRow.getCell(firstColumn);
return getStringVal(fCell) ;
}
}
}
return null ;
}
}
/** FTP连接读取 */
public class ftpUtils{
private static final Logger logger = LoggerFactory.getLogger(this.class);
public void addDelayInfo(){
//连接FTP远程服务器
FTPClient ftpClient = ftpConnect();
try {
ftpClient.setControlEncoding("UTF-8");
ftpClient.changeWorkingDirectory("ftp内指定的文件夹");
//读取ftp指定目录文件
FTPFile[] ftpFiles = ftpClient.listFiles();
for (FTPFile filePath:ftpFiles) {
InputStream inputStream = ftpClient.retrieveFileStream(filePath.getName());
//遍历ftp目录获取excel文件
String fileType = filePath.getName().substring(filePath.getName().lastIndexOf("."), filePath.getName().length());
List<List<String>> lists = new ArrayList<>();
if (fileType.equals(".xls")) {
//在这里调用工具类,将ftp.retrieveFileStream读取指定文件的流传入,
lists = ExcelReaderUtil.readXls(inputStream);
} else if (fileType.equals(".xlsx")) {
//在这里调用工具类,将ftp.retrieveFileStream读取指定文件的流传入,
lists = ExcelReaderUtil.readXls(inputStream);
}
//这里是我自己的方法,调用读取结果进行
saveDelayOrder(lists, filePath.getName());
}
}catch (Exception e){
logger.error("DelayOrderManagerImpl.addDelayInfo() throws an Exception", e);
}
}
public FTPClient ftpConnect() {
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect("ip","port");
boolean isLoginSuccess = ftpClient.login("username","password");
if (isLoginSuccess){
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)){
ftpClient.disconnect();
logger.error("FTP 服务拒绝连接!ReplyCode is:{}", reply);
}
}
} catch (Exception e) {
logger.error("-ftpConnect error"+e);
}
return ftpClient;
}
}