读取ftp内Excel文件,并将读取到的内容存入二维数组

这几天有个需求问题,将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;
        }
}

猜你喜欢

转载自blog.csdn.net/weixin_42558461/article/details/82219121
今日推荐