2019独角兽企业重金招聘Python工程师标准>>>

开发背景:

最近一直在忙一个任务调度系统,需求一直没定下来,需求一直变更,调度一直改,往往复复。。。

等这波忙完了可以写一下关于BI这边调度任务的相关问题,从今天开始陆陆续续的写调度中的事儿了。这个需求是这样的,业务部门有导出excel的需求,然而现在BI的展示用了一个号称BI界前50强的第三方,竟然不支持分页,所以数据导出就成了问题,落我头上了,所以我的这个需求就是根据sql来生成csv文件。我把我写这个需求的demo传上来。

package com.****.common.util;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.*;/*** @author liyang*/
public class TestTables {public static void main(String args[]) {Connection con = null;// 创建一个数据库连接PreparedStatement pre = null;// 创建预编译语句对象,一般都是用这个而不用StatementResultSet dataset = null;// 创建一个结果集对象ResultSet insertResult = null;List list = new ArrayList();try {Class.forName("oracle.jdbc.driver.OracleDriver");// 加载Oracle驱动程序System.out.println("开始尝试连接数据库!");String url = "jdbc:oracle:" + "thin:@101.95.139.62:1521:anebidev";// 127.0.0.1是本机地址,XE是精简版Oracle的默认数据库名String user = "ods_lb";// 用户名,系统默认的账户名String password = "ods_lb";// 你安装时选设置的密码con = DriverManager.getConnection(url, user, password);// 获取连接System.out.println("连接成功!");String sql = "select * from s_user";pre = con.prepareStatement(sql);// 实例化预编译语句// pre.setString(1, "刘显安");// 设置参数,前面的1表示参数的索引,而不是表中列名的索引dataset = pre.executeQuery();// 执行查询,注意括号中不需要再加参数while (dataset.next()) {ResultSetMetaData md = dataset.getMetaData();int columnCount = md.getColumnCount();   //获得列数LinkedHashMap<String,Object> rowData = new LinkedHashMap<String,Object>();for (int i = 1; i <= columnCount; i++) {rowData.put(md.getColumnName(i), dataset.getObject(i));}list.add(rowData);}} catch (Exception e) {e.printStackTrace();} finally {try {// 逐一将上面的几个对象关闭,因为不关闭的话会影响性能、并且占用资源// 注意关闭的顺序,最后使用的最先关闭
//                if (result != null)
//                    result.close();if (insertResult != null)insertResult.close();if (pre != null)pre.close();if (con != null)con.close();System.out.println("数据库连接已关闭!");} catch (Exception e) {e.printStackTrace();}}//生成csv文件String dataDate = "20170505";CSVUtils.createCSVFile(list, "D:\\aa\\bb\\cc\\dd", "##DATADATE##", dataDate);}
}
package com.****.common.util;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.AccessController;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;import javax.servlet.http.HttpServletResponse;import sun.security.action.GetPropertyAction;/*** 文件操作* @author liyang* @version $Id: CSVUtils.java, v 0.1
2017年4月22日 下午2:19:59 Exp $*/
public class CSVUtils {/*** 生成为CVS文件 * @param exportData*              源数据List*              csv文件的列表头map* @param outPutPath*              文件路径* @param fileName*              文件名称* @return*/@SuppressWarnings("rawtypes")public static File createCSVFile(List<LinkedHashMap<String,Object>> exportData, /*LinkedHashMap map,*/ String outPutPath,String fileName,String taskDate) {File csvFile = null;BufferedWriter csvFileOutputStream = null;String fileNameNew = null;System.setProperty("sun.jnu.encoding","utf-8");if(fileName.indexOf("##DATADATE##") >= 0){fileNameNew = fileName.replace("##DATADATE##", String.valueOf(Integer.valueOf(taskDate) - 1) + "-" + taskDate);}outPutPath = outPutPath+System.getProperty("file.separator")+taskDate.substring(0,4)+System.getProperty("file.separator")+taskDate.substring(4,6);try {//如果存在,则删除文件File f = generateFile(fileNameNew, ".csv", new File(outPutPath));if(f.exists()&& f.isFile()){f.getAbsoluteFile().delete();}File file = new File(outPutPath);if (!file.exists()) {file.getAbsoluteFile().mkdirs();}//定义文件名格式并创建csvFile = createTempFile(fileNameNew,".csv", new File(outPutPath));// UTF-8使正确读取分隔符","  csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "GBK"), 1024);// 写入文件头部LinkedHashMap<String,Object> map = exportData.get(0);for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator.hasNext();) {java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator.next();csvFileOutputStream.write(propertyEntry.getKey() != null ? new String(((String) propertyEntry.getKey().toString()).getBytes("GBK"), "GBK") : "");if (propertyIterator.hasNext()) {csvFileOutputStream.write(",");}}csvFileOutputStream.write("\r\n");// 写入文件内容for(LinkedHashMap<String,Object> mapData :exportData){for (Iterator dataIterator = mapData.entrySet().iterator(); dataIterator.hasNext();) {java.util.Map.Entry dataEntry = (java.util.Map.Entry) dataIterator.next();csvFileOutputStream.write(dataEntry.getValue() != null ? new String(((String) dataEntry.getValue().toString()).getBytes("GBK"), "GBK") : "");if (dataIterator.hasNext()) {csvFileOutputStream.write(",");}}csvFileOutputStream.write("\r\n");}} catch (Exception e) {e.printStackTrace();} finally {try {csvFileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}return csvFile;}/*** 下载文件* @param response* @param csvFilePath*              文件路径* @param fileName*              文件名称* @throws IOException*/public static void exportFile(HttpServletResponse response, String csvFilePath, String fileName)throws IOException {response.setContentType("application/csv;charset=GBK");response.setHeader("Content-Disposition","attachment;  filename=" + new String(fileName.getBytes("GBK"), "ISO8859-1"));//URLEncoder.encode(fileName, "GBK")InputStream in = null;try {in = new FileInputStream(csvFilePath);int len = 0;byte[] buffer = new byte[1024];response.setCharacterEncoding("GBK");OutputStream out = response.getOutputStream();while ((len = in.read(buffer)) > 0) {//out.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });out.write(buffer, 0, len);}} catch (FileNotFoundException e) {System.out.println(e);} finally {if (in != null) {try {in.close();} catch (Exception e) {throw new RuntimeException(e);}}}}/*** 删除该目录filePath下的所有文件* @param filePath*            文件目录路径*/public static void deleteFiles(String filePath) {File file = new File(filePath);if (file.exists()) {File[] files = file.listFiles();for (int i = 0; i < files.length; i++) {if (files[i].isFile()) {files[i].delete();}}}}/*** 删除单个文件* @param filePath*         文件目录路径* @param fileName*         文件名称*/public static void deleteFile(String filePath, String fileName) {File file = new File(filePath);if (file.exists()) {File[] files = file.listFiles();for (int i = 0; i < files.length; i++) {if (files[i].isFile()) {if (files[i].getName().equals(fileName)) {files[i].delete();return;}}}}}public static File createTempFile(String prefix, String suffix, File directory) throws IOException {if (prefix.length() < 3)throw new IllegalArgumentException("Prefix string too short");if (suffix == null)suffix = ".tmp";File tmpdir = (directory != null) ? directory : location();SecurityManager sm = System.getSecurityManager();File f;f = generateFile(prefix, suffix, tmpdir);if (sm != null) {try {sm.checkWrite(f.getPath());} catch (SecurityException se) {// don't reveal temporary directory locationif (directory == null)throw new SecurityException("Unable to create temporary file");throw se;}}return f;}/* -- Temporary files -- */private static final File tmpdir = new File(AccessController.doPrivileged(new GetPropertyAction("java.io.tmpdir")));static File location() {return tmpdir;}// file name generationstatic File generateFile(String prefix, String suffix, File dir)throws IOException{// Use only the file name from the supplied prefixprefix = (new File(prefix)).getName();String name = prefix + suffix;File f = new File(dir, name);return f;}}

以上我只测试过文件导出功能,文件下载、删除功能没有验证,同时要注意一点的是:生成的文件如果调用file.creatTempFile()方法会在生成文件名和后缀之间加上随机数,api里写明:这个问题是为了避免文件名重复而故意设计成这样的,但是为了项目的需求,我把rt.jar里的file.java拿出来改造了。还有一个要注意的是里面关于“”DATADATE“”的东西,这个是项目里的一个约定参数,你可以根据你主观修改。

转载于:https://my.oschina.net/ytliyang/blog/893264

数据库抽取,生成CSV文件导出,CSVUtils工具类相关推荐

  1. java导出csv文件_java导出生成csv文件的方法

    本文实例为大家分享了java导出生成csv文件的具体代码,供大家参考,具体内容如下 首先我们需要对csv文件有基础的认识,csv文件类似excel,可以使用excel打开,但是csv文件的本质是逗号分 ...

  2. java导出csv文件乱码_记一次java生成csv文件乱码的解决过程 (GB2312编码)

    系统:win7 (格式:中文(简体,中国)) 工具:Eclipse (默认编码utf-8) 服务两个:[restful接口]  和 [服务*** server]. 场景:[服务*** server]多 ...

  3. POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解...

    http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...

  4. java后台使用opencsv生成csv文件,并返回给前端下载(附前后端代码)

    最近有一个需求,需要 前端页面选择相应条件,后端根据条件查询数据库,将查出的实体类集合转换为csv文件返回给前端,随后前端进行下载. 找了挺多的资料,现在进行一个整理和分享. 1.Controller ...

  5. Java生成CSV文件

    1.新CSVUtils.java文件: package com.saicfc.pmpf.internal.manage.utils;import java.io.BufferedWriter; imp ...

  6. csv文件 java_Java生成CSV文件实例详解

    本文实例主要讲述了Java生成CSV文件的方法,具体实现步骤如下: 1.新建CSVUtils.java文件: package com.saicfc.pmpf.internal.manage.utils ...

  7. java 生成csv文件_Java生成CSV文件实例详解

    本文实例主要讲述了java生成csv文件的方法,具体实现步骤如下: 1.新建csvutils.java文件: package com.saicfc.pmpf.internal.manage.utils ...

  8. Java多线程-将全量用户表70万数据压缩并生成CSV文件和推送到FTP上(最快快方式)

    需求来源 我们系统作为组织用户的数据源, 很多下级单位系统需要不定时的获取用户全量表的数据,因为安全的原因我们不提对外接口,而是将数据读取出来并生成csv文件,然后进行压缩为gz文件之后, 放在他们指 ...

  9. Java 文件下载 csv文件导出特殊字符转义

    需求描述 将从数据库查出的数据以生成csv文件的方式下载下来(导出). 实现方案 最开始的方法是: 将从数据库中查出的数据拼成符合csv文件格式的字符串,然后将字符串转为输入流,最后返回InputSt ...

最新文章

  1. Linux服务器安装JDK、Tomcat配置web网站
  2. Oracle访问远程服务器的数据库
  3. SwiftUI之深入解析高级动画的路径Paths
  4. topic数量是指什么_一个网站的IP、UV和PV到底是什么
  5. spring-data-jpa 的@Query注解的使用
  6. visio2016 数据库模型图_数据库第七章--NoSQL数据库
  7. matlab小波变换学习入门
  8. 自动发送企业微信通知,让我来教你真的超简单
  9. php mysql 博客_基于PHP+MySQL的个人博客系统
  10. 有了LSTM网络,我再也不怕老师让我写作文了
  11. 怎么做三维设计模型轻量化
  12. 如何用java打印1-100_在java中使用10个线程打印1到100
  13. linux如何设置Java环境变量呢?
  14. tvOS游戏开发系列(SpriteKit)之新建tvOS游戏项目(二)
  15. 爱因斯坦 《社会与个人》
  16. 2012 无盘服务器,无盘完美解决Windows Server 2012或2016无法安装.NET Framework3.5的方法...
  17. 分布式.RPC-WebService入门案例(java实现,注解实现,xsd文件解析,wsdl文件解析)
  18. 下载超过 28762W 次的 Java面试题库(附答案)
  19. 排名前十的sql和nosql数据库
  20. pycharm 使用 anaconda 环境

热门文章

  1. 用户至上-阿里马马篇
  2. extjs 4 tab panel得strip在IE下右偏解决办法
  3. 如何使用 UserAccountControl 标志操纵用户帐户属性
  4. linux(armv7/8)下gdb的安装及查看方法
  5. ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页
  6. OpenCV代码提取:Windows上通过DShow获取Camera视频
  7. 提高C++性能的编程技术笔记:标准模板库+测试代码
  8. C++/C++11中头文件iterator的使用
  9. 【FFmpeg】使用过的命令汇总(持续更新中...)
  10. 【FFmpeg】ffmpeg工具源码分析(一):main函数