文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

CSV导出(通过读取数据字节流直接上传文件到服务器)

2023-09-01 19:09

关注

文件之前读取大多数都是用前端点击相应传入后端,通过HttpServletResponse response得输入输出流进行导入导入导出数据。

近期碰到得需求是定时查询数据库数据并通过csv文件上传至系统。所以不能使用HttpServletResponse,因为对应文件流比较熟悉所以最开始使用文件流进行读写数据。

思路:将数据查出来,创建本地文件,在将数据一行一行写入,在读取本地文件获取输入流上传到服务器上后在把本地生成的文件删掉。

代码演示:

 @Override    public void userInfo(BaseRequest baseRequest) {        UserDto userDto1 = new UserDto();        List data = userAtom.selectByExample(userDto1);        String[] titles = new String[]{"ID","姓名"};        String[] propertys = new String[]{"userNo","userName"};        ByteArrayOutputStream stream = new ByteArrayOutputStream();        DataOutputStream outputStream = new DataOutputStream(stream);        for(Object obj : data){            //利用反射获取所有字段            Field[] fields = obj.getClass().getDeclaredFields();            for(String property : propertys){                for(Field field : fields){                    //设置字段可见性                    field.setAccessible(true);                    if(property.equals(field.getName())){                        try {outputStream.write(field.get(obj).toString().getBytes("gbk"));                        } catch (IOException e) {e.printStackTrace();                        } catch (IllegalAccessException e) {e.printStackTrace();                        }                        try {outputStream.writeBytes(",");                        } catch (IOException e) {e.printStackTrace();                        }                        continue;                    }                }            }            //写完一行换行            try {                outputStream.write("\r\n".getBytes("gbk"));            } catch (IOException e) {                e.printStackTrace();            }        }        Integer curDt = busiDateService.viewBusiDate().getWorkday();        byte dataStream[] = new byte[1024];         UploadFileReq uploadFileReq = new UploadFileReq();            //设置文件名称           uploadFileReq.setFileName(Constant.FILE_NAME_PREFX+curDt+ Constant.FILE_NAME_SUFFIX);                //业务类型                uploadFileReq.setBusiType("userInfo");                uploadFileReq.setIsUploadOutside("1");                uploadFileReq.setContent(stream.toByteArray());                //上传到服务器                Long attachId = attachService.uploadFile(uploadFileReq);                 }}

写入删除

 @Override    public void userInfo(BaseRequest baseRequest) {        UserDto userDto1 = new UserDto();        List data = userAtom.selectByExample(userDto1);        String[] titles = new String[]{"ID","姓名"};        String[] propertys = new String[]{"userNo","userName"};         Integer curDt = busiDateService.viewBusiDate().getWorkday();        //配置路径        String localDirPath = "E:\\";        String fileName = localDirPath+Constant.FILE_NAME_PREFX+curDt+ Constant.FILE_NAME_SUFFIX;        try {            ExportCsv.exportCsv(titles,propertys, data,fileName);        } catch (IOException e) {            e.printStackTrace();      } catch (IllegalAccessException e) {            e.printStackTrace();        }         FileInputStream inputStream = new FileInputStream(fileName);                inputStream.read(dataStream);          UploadFileReq uploadFileReq = new UploadFileReq();                uploadFileReq.setFileName(FabBankAcptConstant.FILE_NAME_PREFX+curDt+ FabBankAcptConstant.FILE_NAME_SUFFIX);                //上传到服务器                Long attachId = attachService.uploadFile(uploadFileReq);           inputStream.close();        Path path = Paths.get(fileName);       try {            //删除生成的文件            boolean result = Files.deleteIfExists(path);        } catch (IOException e) {            e.printStackTrace();        }

csv导出工具类

public class ExportCsv {    public static  String exportCsv(String[] titles, String[] propertys, List list,String fileName) throws IOException, IllegalArgumentException, IllegalAccessException{        File file = new File(fileName);        //构建输出流,同时指定编码        OutputStreamWriter ow = new OutputStreamWriter(new FileOutputStream(file), "gbk");        //csv文件是逗号分隔,除第一个外,每次写入一个单元格数据后需要输入逗号        for(String title : titles){            ow.write(title);            ow.write(",");        }        //写完文件头后换行        ow.write("\r\n");        //写内容        for(Object obj : list){            //利用反射获取所有字段            Field[] fields = obj.getClass().getDeclaredFields();            for(String property : propertys){                for(Field field : fields){                    //设置字段可见性                    field.setAccessible(true);                    if(property.equals(field.getName())){                        ow.write(field.get(obj).toString());                        ow.write(",");                        continue;                    }                }            }            //写完一行换行            ow.write("\r\n");        }        ow.flush();        ow.close();        return "0";    }}

显然这么写多了一个没用的步骤,然后准备将查出来的数据直接转成字节流进行传递,这里要注意DataOutputStream容易出现乱码,所以使用时候一定要设置好编码例如:outputStream.write("内容".getBytes("gbk"));

 @Override    public void userInfo(BaseRequest baseRequest) {        UserDto userDto = new UserDto();        //查出对应数据        List list = userAtom.selectByExample(userDto);        ArrayList data = UserInfoTaskUtil.userInfoDtosToTaskInfo(list);        Integer curDt = busiDateService.viewBusiDate().getWorkday();        String[] propertys = new String[]{"appName","loginID"};        ByteArrayOutputStream stream = new ByteArrayOutputStream();        DataOutputStream outputStream = new DataOutputStream(stream);        String[] titles = new String[]{"AppName","LoginID"};        for (int i = 0; i < titles.length; i++) {            try {                outputStream.write(titles[i].getBytes("gbk"));            } catch (IOException e) {                e.printStackTrace();            }            if (i != titles.length-1){                try {                    outputStream.write("|".getBytes("gbk"));                } catch (IOException e) {                    e.printStackTrace();                }            }        }        try {            outputStream.write(System.getProperty("line.separator").getBytes("gbk"));        } catch (IOException e) {            e.printStackTrace();        }        for(Object obj : data){            //利用反射获取所有字段            Field[] fields = obj.getClass().getDeclaredFields();            for(String property : propertys){                for(Field field : fields){                    //设置字段可见性                    field.setAccessible(true);                    if(property.equals(field.getName())){                        try {if (field.get(obj)!=null){    if (!StringUtils.isEmpty(field.get(obj).toString())){        if (!field.get(obj).toString().equals("null")){            outputStream.write(field.get(obj).toString().getBytes("gbk"));        }    }}                        } catch (IOException e) {e.printStackTrace();                        } catch (IllegalAccessException e) {e.printStackTrace();                        }                        try {if (!property.equals("accountStatus")){    outputStream.writeBytes("|");}                        } catch (IOException e) {e.printStackTrace();                        }                        continue;                    }                }            }            //写完一行换行            try {                outputStream.write(System.getProperty("line.separator").getBytes("gbk"));            } catch (IOException e) {                e.printStackTrace();            }        }        byte dataStream[] = new byte[1024];                UploadFileReq uploadFileReq = new UploadFileReq();            uploadFileReq.setFileName(FabBankAcptConstant.FILE_NAME_PREFX+curDt+ FabBankAcptConstant.FILE_NAME_SUFFIX);                //业务类型                uploadFileReq.setBusiType("userInfo");                uploadFileReq.setIsUploadOutside("1");                uploadFileReq.setContent(stream.toByteArray());                Long attachId = attachService.uploadFile(uploadFileReq);    }

 最后通过字节流便可直接上传到服务器。

来源地址:https://blog.csdn.net/weixin_52210557/article/details/127540052

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯