读取FTP上的excel文件,并写入数据库

摘要:
今天,我遇到了一些问题。我需要从FTP读取一些Excel文件,并将Excel中的数据写入数据库,以便我可以通过管理页面查看数据。在这里,我使用jxl读取xls结尾的文件,使用XSSF读取xlsx结尾的文件。

今天遇到一些问题,需要从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对象
     * 
     * @paramftpHost
     *            FTP主机服务器
     * @paramftpPassword
     *            FTP 登录密码
     * @paramftpUserName
     *            FTP登录用户名
     * @paramftpPort
     *            FTP端口 默认为21
     * @return
     */
    public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, intftpPort)
    {
    FTPClient ftpClient = newFTPClient();
    try
    {
        ftpClient = newFTPClient();
        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的端口错误,请正确配置。");
    }
    returnftpClient;
    }
public static void main(String [] args) throwsIOException
    {
    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文件
     * 
     * @paramargs
     */
    public static voidreadExcel(File filePath)
    {
    String extString = filePath.getName().substring(filePath.getName().lastIndexOf("."));//读取文件并判断文件类型

    InputStream is = null;
    try
    {
        is = newFileInputStream(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
     * @paramfilePath
     */
    public static voidjxlExcel(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 voidxssfExcel(File filePath)
    {
    try
    {
        XSSFWorkbook xssfworkbook = new XSSFWorkbook(newFileInputStream(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文件,使用的时候直接调用会更方便些。

免责声明:文章转载自《读取FTP上的excel文件,并写入数据库》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇oracle下如何执行一个本地的.sql脚本文件使用SyncNavigator轻松实现数据库异地同步、断点续传、异构同步下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Fody,告别烦人的INotifyPropertyChanged,最简方式实现通知!

INotifyPropertyChanged 我不是针对谁,我是说在座的各位 相信所有学wpf的,都写过类似下面的代码: 实现INotifyPropertyChanged public class MainViewModel : INotifyPropertyChanged { public event PropertyChangedEventHa...

loadrunner之WebServices协议脚本编写(三种请求模式)

以天气预报网站为例:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl   一、web_service_call模式 步骤如下:   经过增加事务和if 判断的脚本如下: Action() { lr_start_transaction("获取天气预报"...

winform使用Barcodex控件预览和打印一维码

1、控件下载。   http://files.cnblogs.com/files/masonblog/barcodex.zip 。   包含barcodex.ocx控件、barcodex帮助文档、两个winform控件的dll文件。 2、控件的注册。 (1)检测控件是否注册(方法不唯一)。   本例使用的是判断注册表中 HKEY_CLASSES_ROOTT...

HTTP调用接口方法

Http调用第三方接口代码: /** * 房融界接口对接 * @return */ public Map<String,Object> frjRequest(){ String url="房融界提供的接口地址"; String result = ""; HttpPost httppost=new HttpPost(...

Google Map 根据坐标 获取地址信息

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Xml; 6 using System.Net; 7 8 namespace Utility 9 { 10 pu...

java 接收 char字符型

import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Scanner;public class GetChar {public static void main(String[] args)throws Exception {//通过扫描类输入Scan...