讀取FTP上的excel文件,並寫入數據庫


 

 

   今天遇到一些問題,需要從ftp上讀取一些excel文件,並需要將excel中的數據寫入到數據庫,這樣就可以通過管理頁面查看這些數據。

    我將相關工作分為三步,1、從ftp上讀取相關文件,並將excel文件下載到本地。2、讀取本地下載完成的excel,讀取相關信息 3、將讀取的信息存儲到數據庫中。

    1、獲取java操作ftp操作,首先要從maven倉庫https://mvnrepository.com/artifact/commons-net/commons-net 下載相應的jar包,apache commons net 提供了相應的接口。

 

 /**
     * 獲取FTPClient對象
     * 
     * @param ftpHost
     *            FTP主機服務器
     * @param ftpPassword
     *            FTP 登錄密碼
     * @param ftpUserName
     *            FTP登錄用戶名
     * @param ftpPort
     *            FTP端口 默認為21
     * @return
     */
    public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort)
    {
    FTPClient ftpClient = new FTPClient();
    try
    {
        ftpClient = new FTPClient();
        ftpClient.connect(ftpHost, ftpPort);// 連接FTP服務器
        ftpClient.login(ftpUserName, ftpPassword);// 登陸FTP服務器
        if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode()))
        {
        log.info("未連接到FTP,用戶名或密碼錯誤。");
        ftpClient.disconnect();
        } else
        {
        log.info("FTP連接成功。");
        }
    } catch (SocketException e)
    {
        e.printStackTrace();
        log.info("FTP的IP地址可能錯誤,請正確配置。");
    } catch (IOException e)
    {
        e.printStackTrace();
        log.info("FTP的端口錯誤,請正確配置。");
    }
    return ftpClient;
    }
public static void main(String [] args) throws IOException
    {
    String ftp_ipadd = "127.0.0.1";//ftp 地址
    String ftp_user = "guest";//ftp 登錄帳號
    String ftp_passwd = "guest";//ftp 登錄帳號密碼
    int ftpport = 21;//ftp端口,默認為21
    
    FTPClient ftpClient = this.getFTPClient(ftp_ipadd, ftp_user, ftp_passwd, ftpport);
    log.info(String.valueOf(ftpClient.getReplyCode()));
    ftpClient.setControlEncoding("UTF-8"); // 中文支持
    ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);//設置文件類型
    ftpClient.enterLocalPassiveMode();//設置ftp 模式,有被動模式和活動模式,這里設置為被動模式
    String datestr = DateUtil.getyesterdayStr();//獲取前一天的日期格式為20180921
    ftpClient.changeWorkingDirectory("/data/" + datestr + "/JD/");//設置ftp文件所在的目錄
    FTPFile [] files = ftpClient.listFiles();
    log.info(files.toString());
    for (int i = 0; i < files.length; i++)
    {
        log.info(files[i].getName());
        File localFile = new File("d:\\download\\" + datestr + "\\" + files[i].getName());//設置本地下載的目錄
        File fileparent = localFile.getParentFile();//本地下載目錄下的文件夾,如果不存在則創建
        if (!fileparent.exists())
        {
        fileparent.mkdirs();
        }
        OutputStream os = new FileOutputStream(localFile);//輸出到本地文件流
        ftpClient.retrieveFile(files[i].getName(), os);//下載文件到本地
        os.close();

    }
    ftpClient.logout();//關閉ftp鏈接
    }

這里只寫了demo 不做代碼優化了。

2、讀取本地的excel文件,java讀取excel主要有兩種方式jxl 和 poi, jxl只能讀取2003以前的版本,但效率要高於poi,內存占用率也相對低(這里我也沒有驗證,導入量少基本沒感覺),poi則提供了兩種方式分別支持2003和2007,HSSF方式支持2003,XSSF方式支持2007。這里我使用jxl讀取xls結尾的文件,使用XSSF讀取xlsx結尾的文件。同樣如果想使用兩種方法都需要到maven倉庫下載相應的jar包。

/**
     * 讀取excel文件
     * 
     * @param args
     */
    public static void readExcel(File filePath)
    {
    String extString = filePath.getName().substring(filePath.getName().lastIndexOf("."));//讀取文件並判斷文件類型

    InputStream is = null;
    try
    {
        is = new FileInputStream(filePath);
        if (".xls".equals(extString))
        {
        jxlExcel(filePath);//這里執行jxl方法讀取excel
        } else if (".xlsx".equals(extString))
        {
        xssfExcel(filePath);//這里執行xssf方法讀取excel
        }

    } catch (FileNotFoundException e)
    {
        e.printStackTrace();
    } catch (IOException e)
    {
        e.printStackTrace();
    }
    }

    /**
     * 使用jxl方式讀取excel 2003
     * @param filePath
     */
    public static void jxlExcel(File filePath)
    {
    try
    {
        Workbook workbook = Workbook.getWorkbook(filePath);
        Sheet sheet = workbook.getSheet(0);
        int rowNums = sheet.getRows();// 獲取excel總行數
        int columns = sheet.getColumns();

        for (int i = 1; i <= rowNums; i++)
        {
        for (int j = 0; j < columns; j++)
        {
            log.info(sheet.getCell(i, j).toString());
        }
        }
    } catch (BiffException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    }

    public static void xssfExcel(File filePath)
    {
    try
    {
        XSSFWorkbook xssfworkbook = new XSSFWorkbook(new FileInputStream(filePath));
        XSSFSheet xssfsheet = xssfworkbook.getSheetAt(0);
        int rowNums = xssfsheet.getLastRowNum();// 當前sheet總共有多少行
        int columns = xssfsheet.getRow(0).getPhysicalNumberOfCells();// 當前sheet總共有多少列

        for (int i = 1; i <= rowNums; i++)
        {
        Row row = xssfsheet.getRow(i);

        for (int j = 0; j < columns; j++)
        {
            log.info(row.getCell(j).toString());
        }
        }
    } catch (FileNotFoundException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    }

3、存入數據庫,這里就不多說了。

 

關於ftp下載和讀取excle其實也是常規的操作,只是需要 認真些就可以,當然可以把相關操作封裝為util文件,使用的時候直接調用會更方便些。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM