springboot xls/xslx 表格文件读写上传,(FtpClient+Poi)

    Java文件上传一般使用FtpClient进行操作,前后端使用MultipartFile 交互

;

    Poi对excel文件进行读写操作, 因excel分为 office2003("新建 Microsoft Excel 工作表.xls)和2007两个版本(“新建 Microsoft Excel 工作表.xlsx”),针对两种文件创建不同 Workbook,Workbook是XSSFWorkbook(2007)和HSSFWorkbook(2003)的父类  ,

        1、在使用poi进行操作,先创建Workbook,

        2、然后根据Workbook获取不同的sheet表,

        

        3、再在sheet表中获取Row, row相当于每一个excel的一行

        

       4、 再根据row,getCell(index),cell相当于每一行的一个表格单元

   代码实现     

1、引入依赖:

<!-- office文档组件 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.9</version>
</dependency>
<dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
    <version>2.4.0</version>
</dependency>
<!--ftpClient 文件上传-->
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.2</version>
</dependency>

@Data
public Class S{
  private Stirng A;
  private Stirng B; 
}

2、根据poi获取文件并解析excel

根据controlle层 传入的MultipartFile  fiel,获取InputStream 和fielName

            FileInputStream fileInputStream = file.getInputStream();

            String srcname = file.getOriginalFilename();  

 srcName可以根据后缀进行判断是属于那个版本的excel


public static boolean isExcel2003(String filePath) {

        return filePath.matches("^.+\\.(?i)(xls)$");

    }

    public static boolean isExcel2007(String filePath) {

        return filePath.matches("^.+\\.(?i)(xlsx)$");

    }
针对输入的file转换成响应类型的List
public List<S> read(InputStream inputStream,String fileName){
Workbook workbook = null;
        /** 判断文件的类型,是2003还是2007 */
        if(isExcel2007(fileName)){
            workbook = new XSSFWorkbook(inputStream);
        }else{
            workbook = new HSSFWorkbook(inputStream);
        }
List<Object> list = new ArrayList<>();
for (int i = 0; i < workbook.getNumberOfSheets(); i++) {// 获取每个Sheet表
            sheet = workbook.getSheetAt(i);
            for (int j = 1; j < sheet.getLastRowNum() + 1; j++) {// getLastRowNum,获取最后一行的行标
                Row row = sheet.getRow(j);
                if (row != null) {
                    S obj = new S();
                    for (int k = 0; k < row.getLastCellNum(); k++) {// getLastCellNum,是获取最后一个不为空的列是第几个
                        if (row.getCell(k) != null) { // getCell 获取单元格数据
                            switch (k) {
                                case 0:
                                    if(row.getCell(k)!=null){  //获取第一个单元
                                       obj.setA(row.getCell(k))
                                    }
                                    break;
                                case 1:
                                    obj.setB(row.getCell(k))
                                    break;
                                case 2:
                                    // ...
                            }
                        } else {


                        }
                    }
                   //  list.add
                }


            }
    return list;

}

3、根据List<T>生成表格数据并上传服务器

ftp文件上传工具方法

public static boolean uploadFile(
            String url,//FTP服务器hostname
            int port,//FTP服务器端口
            String username, // FTP登录账号
            String password, //FTP登录密码
            String path, //FTP服务器保存目录
            String filename, //上传到FTP服务器上的文件名
            InputStream input // 输入流
    ) {
        boolean success = false;
        FTPClient ftp = new FTPClient();
        try {
            int reply;
            ftp.connect(url, port);//连接FTP服务器
            //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
            ftp.login(username, password);//登录
            reply = ftp.getReplyCode();
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                log.info("FTP服务器 拒绝连接");
                return success;
            }
            ftp.changeWorkingDirectory(path);
            ftp.storeFile(filename, input);

            input.close();
            ftp.logout();
            success = true;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                }
            }
        }
        return success;
    }

将LIst<Object> 生成excel并双传到服务器上面

List<S> list  ;
public InputStream getFailedExcels(List<S> list) {

        XSSFWorkbook wb = new XSSFWorkbook();
        //创建HSSFSheet对象
        XSSFSheet sheet = wb.createSheet();
        XSSFRow row = sheet.createRow(0);
        XSSFCell cell = row.createCell(0);
        cell.setCellValue("单元格中的中文");

        for (int i = 0; i < list.size(); i++) {
            row = sheet.createRow(i);

            XSSFCell cell0 = row.createCell(0);
            if(list.get(i).getPhone()!=null){
                cell0.setCellValue(list.get(i).getA());
            }
            XSSFCell cell1 = row.createCell(1);
            if(list.get(i).getApplicatRoleId()!=null){
                cell1.setCellValue(list.get(i).getB());
            }
            XSSFCell cell2 = row.createCell(2);
            if(list.get(i).getApplicatContent()!=null){
                cell2.setCellValue(list.get(i).getApplicatContent());
            }

        }
        String url = "";
        ByteArrayInputStream in = null;
        //输出Excel文件
        try {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            wb.write(os);
            byte[] b = os.toByteArray();
             in = new ByteArrayInputStream(b);
            String filename = new Date().getTime()+"role.xlsx";

//             url = ossUtil.getOSSUrl(in, "copy-right/", filename);

            log.info("export failedExcel end ...... result"+url );

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

    }
//使用上面的  uploadFile()方法上传获取到inputStream
this.uploadFile(urlip,22,user,name,path,inputStream,filename);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值