Easypoi解析FTP服务器的Excel文件

news/2024/7/21 4:09:12 标签: excel, java, ftp

Easypoi 解析 FTP 文件服务器指定目录下的 Excel 文件,并将解析的数据入库。

依赖

<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-spring-boot-starter</artifactId>
    <version>4.4.0</version>
</dependency>

<!--主要实现ftp文件的相关操作-->
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk16</artifactId>
    <version>1.46</version>
</dependency>

FTP 连接工具类

java">package com.demo.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.IOException;

/**
 * @ClassName: FtpUtils.java
 * @ClassPath: com.demo.utils.FtpUtils.java
 * @Description: ftp链接
 * @Author: tanyp
 * @Date: 2023/1/6 9:36
 **/
@Slf4j
public class FtpUtils {

	/**
	 * ftp链接
	 *
	 * @return
	 * @throws IOException
	 */
	public static FTPClient ftpConnection(String ip, int port, String username, String password) throws IOException {
		FTPClient ftpClient = new FTPClient();
		try {
			ftpClient.connect(ip, port);
			ftpClient.login(username, password);
			// 是否成功登录服务器
			int replyCode = ftpClient.getReplyCode();
			if (!FTPReply.isPositiveCompletion(replyCode)) {
				ftpClient.disconnect();
				log.info("--ftp连接失败--");
				System.exit(1);
			} else {
				log.info("--ftp连接成功--");
			}
		} catch (Exception e) {
			log.error("ftp连接异常:{}", e);
		}
		return ftpClient;
	}

	/**
	 * 断开FTP连接
	 *
	 * @param ftpClient 初始化的对象
	 * @throws IOException
	 */
	public static void close(FTPClient ftpClient) {
		try {
			if (ftpClient != null && ftpClient.isConnected()) {
				ftpClient.logout();
				ftpClient.disconnect();
			}
		} catch (IOException e) {
			log.error("断开FTP连接异常:{}", e);
		}
	}

}

解析数据实体

java">package com.demo.vo;

import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * @ClassName: TestVo.java
 * @ClassPath: com.demo.vo.TestVo.java
 * @Description: 测试
 * @Author: tanyp
 * @Date: 2023/1/6 09:24
 **/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TestVo implements Serializable {

	@Excel(name = "手机号", width = 30, orderNum = "0")
	private String phone;

	@Excel(name = "名称", width = 30, orderNum = "0")
	private String name;

	@Excel(name = "时间", width = 30, importFormat ="yyyy-MM-dd HH:mm:ss", exportFormat = "yyyy-MM-dd HH:mm:ss", orderNum = "0")
	private LocalDateTime dateTime;

	@Excel(name = "数据", width = 50, orderNum = "0")
	private String data;

}

解析示例

java">package com.demo.service.impl;

import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.demo.utils.FtpUtils;
import com.demo.entity.TestFtp;
import com.demo.vo.TestVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.InputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Objects;

/**
 * @ClassName: TestService.java
 * @ClassPath: com.demo.service.impl.TestService.java
 * @Description: 解析数据
 * @Author: tanyp
 * @Date: 2023/1/6 11:13
 **/
@Slf4j
@Service
public class TestService {

	@Autowired
	private TestFtpService testFtpService;

	@Autowired
	private TestDataService testDataService;

	@Override
	public void test() {
		log.info("FTP拉取数据....开始.....");
		FTPClient ftpClient = null;
		try {
			// FTP信息
			ftpClient = FtpUtils.ftpConnection("127.0.0.1", 21, "ftp_test", "ftp_test");
			// 按天创建文件夹,获取目录下的所有文件
			String remotePath = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
			boolean isExist = ftpClient.changeWorkingDirectory(remotePath);
			if (!isExist) {
				log.info("{} 该目录不存在!", remotePath);
				return;
			}

			// 不加此句获取不到文件
			ftpClient.enterLocalPassiveMode();
			// 设置文件类型
			ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
			FTPFile[] files = ftpClient.listFiles();
			if (files != null && files.length > 0) {
				log.info("文件数:{}", files.length);
				for (FTPFile file : files) {
					log.info("开始检查当前文件是否已被解析过:{}", file.getName());

					/**
					 * TODO
					 * 保存解析记录,防止重复解析
					 */
					Integer count = testFtpService.count(
							Wrappers.<TestFtp>query().lambda()
									.eq(TestFtp::getFileName, file.getName())
									.eq(TestFtp::getFilePath, remotePath + "/" + file.getName())
					);
					if (Objects.nonNull(count) && count > 0) {
						log.info("此文件已经解析过:{}", file.getName());
						continue;
					}

					log.info("解析数据===开始===:{}", file.getName());
					InputStream inputStream = ftpClient.retrieveFileStream(file.getName());

					// 解析数据
					ImportParams params = new ImportParams();
					List<TestVo> result = ExcelImportUtil.importExcel(inputStream, TestVo.class, params);

					inputStream.close();
					if (Objects.nonNull(result) && result.size() > 0) {
						log.info("保存已解析的数据,条数:{}", result.size());
						testDataService.saveBatch(result);

						log.info("保存文件记录:{}", file.getName());
						testFtpService.save(
								TestFtp.builder()
										.fileName(file.getName())
										.filePath(remotePath + "/" + file.getName())
										.rowCount(result.size())
										.updateTime(LocalDateTime.now())
										.createTime(LocalDateTime.now())
										.build()
						);
					}
					log.info("解析数据===结束===:{}", file.getName());
				}
			} else {
				log.info("FTP拉取数据中...{}..该目录下未检测到文件....", remotePath);
			}
			log.info("FTP拉取数据...结束......");
		} catch (Exception e) {
			log.error("FTP拉取数据{}", e);
		} finally {
			FtpUtils.close(ftpClient);
		}
	}

}

示例使用 mybatisplus 的持久层框架,缺失类文件可自行补全。


http://www.niftyadmin.cn/n/856954.html

相关文章

Java编写MD5加密工具类,登录密码加密

MD5加密工具类 md5 是一种常见的加密手段&#xff0c;只有加密方法没有解密方法。可以用做登录密码加密等场景。 import java.security.MessageDigest; /*** MD5工具*/ public class MD5Util {public static final String CHARSET "UTF-8";public final static Stri…

Nginx 做本地图片js等静态资源映射、转发请求、做缓存

nginx 做本地图片js等静态资源映射&#xff0c;转发请求 server_name:监听请求名称root E:\fileServer\uploadFile; 指定本地静态文件路径if (!-f $request_filename) 判断请求的文件是否不存在&#xff0c;不存在则转发请求到。 备注$1、$2…”等变量为请求正则中第几个参数&…

Java反射机制,反射机制原理,学习与记录

JAVA反射机制&#xff0c;先看下百度百科解释 百度百科: JAVA反射机制是在运行状态中&#xff0c;对于任意一个实体类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态…

Java 面试题大集合,2019最新最常见面试题加答案

原文地址&#xff1a;https://blog.csdn.net/zl1zl2zl3/article/details/88048480 又到一年跳槽季&#xff0c;课下不准备&#xff0c;面试徒伤悲。 本文汇总了常见面试题及面试技巧&#xff0c;让百忙中的程序员&#xff0c;少花精力乱找资料&#xff0c;希望对你有帮助。 一…

Java获取项目properties配置文件属性、获取外部配置文件,无需重启系统实现刷新配置文件

目标&#xff1a;springboot打包发布后&#xff0c;可以读取jar外部的配置文件中的属性&#xff0c;并实现不重启更新配置文件。 项目结构&#xff1a; 实现方法&#xff1a; package com.bdxh.fileserver.utils;import java.io.UnsupportedEncodingException; import java.u…

mysql格式化int时间格式_在mysql中,怎样把表“table1”里的字段“addtime“从int类型的时间戳转换成datetime的日期格式?...

展开全部使用mysql自带函数 FROM_UNIXTIME(时间戳,format) &#xff0c;根据format字符串格式化例如SELECT FROM_UNIXTIME(1234567890, %Y-%m-%d %H:%i:%S);对于你的表操作&#xff0c;e5a48de588b662616964757a686964616f31333337613836转化成 年-月-日 小时-分-秒格式updat…

Java后台做 短信验证码、短信通知,阿里云短信服务

Java阿里云短信实现系统登录发送验证码功能 阿里云短信服务器地址&#xff1a;https://dysms.console.aliyun.com/dysms.htm 1、申请签名&#xff0c;等待审核通过 2、按需选择你要的短信类型&#xff0c;创建一个短信模板。 3、等待审核通过&#xff0c;其中“模版CODE”…

电脑连接电视html,电脑HDMI连接电视无信号的解决方法

现在的液晶电视&#xff0c;HDMI(高清晰度多媒体接口)是标配&#xff0c;通常是用PC或是平板电脑输出影像&#xff0c;通过电视屏幕来显示。笔记本HDMI连接电视机显示无信号&#xff0c;怎么处理&#xff1f;那遇到这样的问题要如何解决呢&#xff1f;下面就合大家说一下HDMI连…