码迷,mamicode.com
首页 > 数据库 > 详细

数据库信息存储为Excel,利用OSS进行文件上传下载

时间:2021-04-14 12:02:43      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:pix   ldo   init   java   查看   io流   目的   之间   表格   

ps:本篇文章的主要内容为从后端获取数据,并将多条数据以Excel表格的方式存储,并实现基于OSS的上传和下载

主要知识

OSS对象存储,EasyExcel 两者都来自于阿里云,请提前进行两者的基础知识学习

主要内容

1.实体类

实体类需要继承BaseRowModel类,但目前这个类已被禁用,我还没找到替代方式

@Data
public class User extends BaseRowModel {
    @ExcelProperty("编号")
    private int id;
    @ExcelProperty("姓名")
    private String name;
    @ExcelProperty("日期")
    private Date date;
    @ExcelProperty("内容")
    private String content;

}

这里可以用注解来设定Excel表格的表头,同时官网有更多种自定义以及复杂表头的设置,这里照例贴上官方文档路径
https://www.yuque.com/easyexcel/doc/easyexcel

2.Excel工具类

@Component
public class EasyExcelUtil<T extends BaseRowModel>{


    //生成一个读取数据库数据产生的excel字节文件
    //最普通的EasyExcel用法
    public ByteArrayOutputStream easyOut(List<T> list, Class<T> clazz) throws Exception{
        //上传文件的命名规则,暂时没写
        //extension==.xlsx
        String extension = ExcelTypeEnum.XLSX.getValue();

        //建立一个字节数组输出流,将excel文件的内容存入其中
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        /**
         *   这里指定用哪个class去写,然后写到第一个sheet,名字为模板,然后文件流会自动关闭
         *   这里可以定义表格的各种样式
         *   out为字节流
         *   clazz为实体类的反射
         */
        EasyExcel.write(out, clazz).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet("模板").doWrite(list);

        //System.out.println(ExcelTypeEnum.XLSX.getValue());
        return out;
    }
}

这里写了一个非常基础的工具方法,主要的核心代码其实就一句

EasyExcel.write(out, clazz).registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()).sheet("模板").doWrite(list);

EasyExcel:一种最常用的工具类,主要提供了Write()方法
write() : 里面的参数,第一个为Excel表格写入的目的地,目前总结两种填法(更多填法请参考文档)

  • 字符串:直接以字符串内容为名称存储在idea中
  • IO流 : 通常为输出流,这个时候就可以选择以输入流的方式来存储到本地或者远程,比如OSS

registerWriteHandler:表格宽度自适应,这个不精确
sheet :这个方法也有很多传参方式,主要是提供表格的页数和页名
技术图片
doWrite :写入的内容,比如一个以对象方式存储了多条数据的list集合

3.OSS工具类

@Component
public class OSSClientUtil {

    // endpoint是访问OSS的域名。如果您已经在OSS的控制台上 创建了Bucket,请在控制台上查看域名。
    // 如果您还没有创建Bucket,endpoint选择请参看文档中心的“开发人员指南 > 基本概念 > 访问域名”,
    // 链接地址是:https://help.aliyun.com/document_detail/oss/user_guide/oss_concept/endpoint.html?spm=5176.docoss/user_guide/endpoint_region
    // endpoint的格式形如“http://oss-cn-hangzhou.aliyuncs.com/”,注意http://后不带bucket名称,
    // 比如“http://bucket-name.oss-cn-hangzhou.aliyuncs.com”,是错误的endpoint,请去掉其中的“bucket-name”。
    private static String endpoint = "http://oss-cn-shanghai.aliyuncs.com";

    // accessKeyId和accessKeySecret是OSS的访问密钥,您可以在控制台上创建和查看,
    // 创建和查看访问密钥的链接地址是:https://ak-console.aliyun.com/#/。
    // 注意:accessKeyId和accessKeySecret前后都没有空格,从控制台复制时请检查并去除多余的空格。
    private static String accessKeyId = "LTAI5tPjFTLT215QNDVaiNmB";
    private static String accessKeySecret = "bag38d0ldoIhiVW88zPIxDzMEJiPj3";

    // Bucket用来管理所存储Object的存储空间,详细描述请参看“开发人员指南 > 基本概念 > OSS基本概念介绍”。
    // Bucket命名规范如下:只能包括小写字母,数字和短横线(-),必须以小写字母或者数字开头,长度必须在3-63字节之间。
    private static String bucketName = "mytesto";

    // 生成OSSClient,您可以指定一些参数,详见“SDK手册 > Java-SDK > 初始化”,
    // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/init.html?spm=5176.docoss/sdk/java-sdk/get-start
    OSS ossClient = null;
    public void fileUpload(ByteArrayOutputStream out){
        ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        //判断桶名是否存在,如果不存在就新建一个
        //
        if (ossClient.doesBucketExist(bucketName)) {
            System.out.println("您已经创建Bucket:" + bucketName + "。");
        } else {
            System.out.println("您的Bucket不存在,创建Bucket:" + bucketName + "。");
            // 创建Bucket。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
            // 链接地址是:https://help.aliyun.com/document_detail/oss/sdk/java-sdk/manage_bucket.html?spm=5176.docoss/sdk/java-sdk/init
            ossClient.createBucket(bucketName);
        }

        // 查看Bucket信息。详细请参看“SDK手册 > Java-SDK > 管理Bucket”。
        BucketInfo info = ossClient.getBucketInfo(bucketName);
        System.out.println("Bucket " + bucketName + "的信息如下:");
        System.out.println("\t数据中心:" + info.getBucket().getLocation());
        System.out.println("\t创建时间:" + info.getBucket().getCreationDate());
        System.out.println("\t用户标志:" + info.getBucket().getOwner());

        //具体的文件上传,获取Excel文件的数据
        InputStream is = new ByteArrayInputStream(out.toByteArray());

        ossClient.putObject(bucketName, "456.xlsx", is);
        System.out.println("Object:" + "456.xlsx" + "存入OSS成功!!!");
        ossClient.shutdown();
    }


    //获取可以下载的URL
    public String getDownURL(String fileName){

        ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        Date expiration = new Date(new Date().getTime() + 3600l * 1000);//过期时间设为1小时
        // 生成URL
        URL url = ossClient.generatePresignedUrl(bucketName, fileName, expiration);
        if (url != null) {
            return url.toString();
        }
        return null;

    }

这部分内容可见我的另一篇关于OSS对象存储入门的博客,其内容基本相似

4.接口具体执行

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private EasyExcelUtil easyExcelUtil;

    @Autowired
    private OSSClientUtil ossClient;

    @GetMapping("/test")
    public void test() throws Exception {


        List<User> list = userService.findAll();

        //文件上传到OSS
        ossClient.fileUpload(easyExcelUtil.easyOut(list,User.class));
        //根据这个文件的名字获取下载链接,链接有效时长一小时
        String s = ossClient.getDownURL("456.xlsx");


        System.out.println("文件上传成功!!!");
        System.out.println(s);
        //return s;
    }


}

以上完结。

数据库信息存储为Excel,利用OSS进行文件上传下载

标签:pix   ldo   init   java   查看   io流   目的   之间   表格   

原文地址:https://www.cnblogs.com/mlck/p/14654661.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!