JAVA 生成Excel/CSV 并上传到FTP服务器

首先配置好ftp服务器(windows + Serv-U)

创建FtpUtils

public class FTPUtils {

    private static FTPUtils ftpUtils;
    private FTPClient ftpClient;

    private String port; // 服务器端口
    private String username; // 用户登录名
    private String password; // 用户登录密码

    private InputStream is; // 文件下载输入流

    /**
     * 私有构造方法
     */
    private FTPUtils() {
        initConfig();
        if (null == ftpClient) {
            ftpClient = new FTPClient();
        }
    }

    /**
     * 获取FTPUtils对象实例
     *
     * @return FTPUtils对象实例
     */
    public synchronized static FTPUtils getInstance() {
        if (null == ftpUtils) {
            ftpUtils = new FTPUtils();
        }
        return ftpUtils;
    }

    /**
     * 初始化FTP服务器连接属性
     */
    public void initConfig() {
        // 定义配置文件输入流
        port = "21";
        username = "test";
        password = "test";
    }

    /**
     * 连接(配置通用连接属性)至服务器
     *
     * @param serverName 服务器名称
     * @param remotePath 当前访问目录
     * @return <b>true</b>:连接成功
     * <br/>
     * <b>false</b>:连接失败
     */
    public boolean connectToTheServer(String serverName, String remotePath) {
        // 定义返回值
        boolean result = false;
        try {
            // 连接至服务器,端口默认为21时,可直接通过URL连接
            ftpClient.connect(serverName, Integer.parseInt(port));
            // 登录服务器
            ftpClient.login(username, password);
            // 判断返回码是否合法
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                // 不合法时断开连接
                ftpClient.disconnect();
                // 结束程序
                return result;
            }
            // 设置文件操作目录
            result = ftpClient.changeWorkingDirectory(remotePath);
            // 设置文件类型,二进制
            result = ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            // 设置缓冲区大小
            ftpClient.setBufferSize(3072);
            // 设置字符编码
            ftpClient.setControlEncoding("UTF-8");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 上传文件至FTP服务器
     *
     * @param serverName 服务器名称
     * @param storePath  上传文件存储路径
     * @param fileName   上传文件存储名称
     * @param is         上传文件输入流
     * @return <b>true</b>:上传成功
     * <br/>
     * <b>false</b>:上传失败
     */
    public boolean storeFile(String serverName, String storePath, String fileName, InputStream is) {
        boolean result = false;
        try {
            // 连接至服务器
            result = connectToTheServer(serverName, storePath);
            // 判断服务器是否连接成功
            if (result) {
                // 上传文件
                result = ftpClient.storeFile(fileName, is);
            }
            // 关闭输入流
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 判断输入流是否存在
            if (null != is) {
                try {
                    // 关闭输入流
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 登出服务器并断开连接
            ftpUtils.logout();
        }
        return result;
    }

    /**
     * 下载FTP服务器文件至本地<br/>
     * 操作完成后需调用logout方法与服务器断开连接
     *
     * @param serverName 服务器名称
     * @param remotePath 下载文件存储路径
     * @param fileName   下载文件存储名称
     * @return <b>InputStream</b>:文件输入流
     */
    public InputStream retrieveFile(String serverName, String remotePath, String fileName) {
        try {
            boolean result = false;
            // 连接至服务器
            result = connectToTheServer(serverName, remotePath);
            // 判断服务器是否连接成功
            if (result) {
                // 获取文件输入流
                is = ftpClient.retrieveFileStream(fileName);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return is;
    }

    /**
     * 删除FTP服务器文件
     *
     * @param serverName 服务器名称
     * @param remotePath 当前访问目录
     * @param fileName   文件存储名称
     * @return <b>true</b>:删除成功
     * <br/>
     * <b>false</b>:删除失败
     */
    public boolean deleteFile(String serverName, String remotePath, String fileName) {
        boolean result = false;
        // 连接至服务器
        result = connectToTheServer(serverName, remotePath);
        // 判断服务器是否连接成功
        if (result) {
            try {
                // 删除文件
                result = ftpClient.deleteFile(fileName);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 登出服务器并断开连接
                ftpUtils.logout();
            }
        }
        return result;
    }

    /**
     * 检测FTP服务器文件是否存在
     *
     * @param serverName 服务器名称
     * @param remotePath 检测文件存储路径
     * @param fileName   检测文件存储名称
     * @return <b>true</b>:文件存在
     * <br/>
     * <b>false</b>:文件不存在
     */
    public boolean checkFile(String serverName, String remotePath, String fileName) {
        boolean result = false;
        try {
            // 连接至服务器
            result = connectToTheServer(serverName, remotePath);
            // 判断服务器是否连接成功
            if (result) {
                // 默认文件不存在
                result = false;
                // 获取文件操作目录下所有文件名称
                String[] remoteNames = ftpClient.listNames();
                // 循环比对文件名称,判断是否含有当前要下载的文件名
                for (String remoteName : remoteNames) {
                    if (fileName.equals(remoteName)) {
                        result = true;
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 登出服务器并断开连接
            ftpUtils.logout();
        }
        return result;
    }

    /**
     * 登出服务器并断开连接
     *
     * @return <b>true</b>:操作成功
     * <br/>
     * <b>false</b>:操作失败
     */
    public boolean logout() {
        boolean result = false;
        if (null != is) {
            try {
                // 关闭输入流
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (null != ftpClient) {
            try {
                // 登出服务器
                result = ftpClient.logout();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 判断连接是否存在
                if (ftpClient.isConnected()) {
                    try {
                        // 断开连接
                        ftpClient.disconnect();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        return result;
    }
}

创建ExcelUtils

public class ExcelBuilder<T> {


    public Workbook buildExcelDocument(List<T> data, String[] headers, List<Function<T, String>> funcs) throws Exception {
        int rowIndex = 0;
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = createSheet(workbook, "sheet1");
        CellStyle headStyle = createHeaderStyle(workbook);
        CellStyle contentStyle = createContentStyle(workbook);

        createHeaderCells(sheet, rowIndex++, headStyle, headers);

        for (int i = 0; i < data.size(); i++) {
            createContentCells(sheet, rowIndex++, contentStyle, data.get(i), funcs);
        }

        return workbook;
    }

    private Sheet createSheet(Workbook workbook, String sheetName) {
        Sheet sheet = workbook.createSheet(sheetName);
        sheet.setDefaultColumnWidth(13);
        return sheet;
    }

    private CellStyle createHeaderStyle(Workbook workbook, String fontName, int fontSize, boolean bold) {
        CellStyle headStyle = workbook.createCellStyle();

        Font font = workbook.createFont();
        font.setFontName(fontName);
        font.setBold(bold);
        font.setFontHeightInPoints((short) fontSize);
        headStyle.setFont(font);

        return headStyle;
    }

    private CellStyle createHeaderStyle(Workbook workbook) {
        return createHeaderStyle(workbook, "黑体", 14, true);
    }

    private CellStyle createContentStyle(Workbook workbook) {
        return createHeaderStyle(workbook, "黑体", 10, false);
    }

    private void createHeaderCells(Sheet sheet, Integer rowIndex, CellStyle style, String[] headers) {
        Row totalSheetRow = sheet.createRow(rowIndex);
        for (int i = 0; i < headers.length; i++) {
            Cell cell = totalSheetRow.createCell(i);
            cell.setCellStyle(style);
            cell.setCellValue(headers[i]);
        }
    }

    private void createContentCells(Sheet sheet, Integer rowIndex, CellStyle style, T content, List<Function<T, String>> funcs) {
        Row totalSheetRow = sheet.createRow(rowIndex);
        for (int i = 0; i < funcs.size(); i++) {
            Cell cell = totalSheetRow.createCell(i);
            cell.setCellStyle(style);
            cell.setCellValue(funcs.get(i).apply(content));
        }
    }


}

创建测试接口

@RequestMapping(value = "writeCsv", method = RequestMethod.GET)
    @ResponseBody
    public String writeCsv() throws Exception {

        byte[] data = "表头1,表头2\r\n测试1,测试2".getBytes("UTF-8");
        try (ByteArrayInputStream inputStream = new ByteArrayInputStream(data)) {
            FTPUtils ftpUtils = FTPUtils.getInstance();
            ftpUtils.storeFile("192.168.31.68", "MyDownloads", "test.csv", inputStream);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return "OK";
    }

    @RequestMapping(value = "writeExcel", method = RequestMethod.GET)
    @ResponseBody
    public String exportExcel() throws Exception {

        Workbook workbook = buildExcel();

        try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
            workbook.write(os);
            byte[] data = os.toByteArray();

            try (ByteArrayInputStream inputStream = new ByteArrayInputStream(data)) {
                FTPUtils ftpUtils = FTPUtils.getInstance();
                ftpUtils.storeFile("192.168.31.68", "MyDownloads", "test.xlsx", inputStream);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        return "OK";
    }

    public Workbook buildExcel() throws Exception {
        return new ExcelBuilder<String>().buildExcelDocument(Lists.newArrayList("1月", "2月"), new String[]{"年月"}, Lists.newArrayList(i -> {
            return "2018-" + i;
        }));
    }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容