当前位置: 首页 > 编程日记 > 正文

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

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

开发背景:

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

等这波忙完了可以写一下关于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

相关文章:

Matlab与线性代数 -- Pascal矩阵

本文主要介绍利用Matlab实现pascal矩阵的相关知识。

java加密算法

java加密算法 本篇内容简要介绍BASE64、MD5、SHA、HMAC几种加密算法。 BASE64编码算法不算是真正的加密算法。 MD5、SHA、HMAC这三种加密算法&#xff0c;可谓是非可逆加密&#xff0c;就是不可解密的加密方法&#xff0c;我们称之为单向加密算法。我们通常只把他们作为加密的基…

在多台FMS服务器之间共享流

FMS有一个非常重要的功能,那就是可以在多台服务器之间共享流. 利用这一功能,我们可以把源服务器上的流分发到其它的服务器,这些获得流的服务器同样可以作为新的源服务器使用.这个功能有点象FMS集群. 我们都知道,利用WMP插件可以获取网上的流媒体地址制作网络电视台,其实利用Fla…

linux实现nat转发和内部端口映射

路由机 eth0:114.114.114.114(公网ip) eth1:192.168.1.1(内网ip) pc1 eth0:192.168.1.2(内网ip) eth1(拨号ip) pc2 eth0:192.168.1.3(内网ip) eth1(拨号ip) 1.配置路由机网卡信息 vim /etc/sysconfig/network-scripts/ifcfg-eth1 TYPEEthernet BOOTPROTOstati…

15级团队学习成果汇报 -- 利用C#语言实现展览厅

本图文主要是15级团队学习成果的汇报“ 利用C#语言实现展览厅”。

我所理解的Spring AOP的基本概念

Spring AOP中的概念晦涩难懂&#xff0c;读官方文档更是像读天书&#xff0c;看了很多例子后&#xff0c;写一些自己理解的一些spring的概念。要理解面向切面编程&#xff0c;要首先理解代理模式和动态代理模式。 假设一个OA系统中的一个功能是查看考勤信息&#xff0c;那么我…

你需要的大概不是 enumerated

作者&#xff1a;KHANLOU&#xff0c;原文链接&#xff0c;原文日期&#xff1a;2017-03-28译者&#xff1a;四娘&#xff1b;校对&#xff1a;Cwift&#xff1b;定稿&#xff1a;CMBSwift 标准库里最容易被滥用的就是 Sequence 的 enumerated() 函数。这个函数会返回一个新的序…

Matlab与线性代数 -- 正态分布的随机矩阵

本图文介绍了如何利用Matlab实现正态分布的随机矩阵。

修改maven本地仓库的位置及疑惑

maven的默认仓库在~/.m2/repository下&#xff0c;这个是在c盘下&#xff0c;很多系统程序都在c盘&#xff0c;而且c盘的空间有时候不够大&#xff0c;所以经常要修改本地repository的位置&#xff0c;我做的修改如下&#xff1a; 在D盘建立一个repository&#xff1a;D:\mave…

值得FS去的英雄副本

1) 奥金尼地穴腰带 18耐23智19精 22法爆28法伤2) 塞泰克大厅法杖 40耐42智 37法爆168法伤3) 暗影迷宫腰带 31耐27智 17法爆34法伤4) 奴隶围栏饰品 37法伤一定几率使施法加速320,持续6秒5) 盘牙洞穴魔杖 10智 11法爆20法伤转载于:https://www.cnblogs.com/Evanescence/archive/2…

利用C#语言实现小闹钟

本图文主要是15级团队学习成果的汇报“ 利用C#语言实现小闹钟”。

Windows和linux双系统——改动默认启动顺序

电脑上装了Windows 7和Ubantu双系统&#xff0c;因为Linux系统用的次数比較少而且还是默认的启动项对此非常不能容忍&#xff0c;因此得改动Windows为默认的启动项。 因为电脑上的系统引导程序是GRUB&#xff0c;因此改动当然也就落到Linux系统上啦。改动/boot/grub/grub.cfg该…

ThreadLocal的使用方法

ThreadLocal的含义是Thread Local Variable&#xff0c;它可以声明一个字段&#xff0c;使得不同的线程访问这个字段时&#xff0c;获取的都是不同的副本&#xff0c;互不影响。 ThreadLocal的作用和在每个Thread类声明一个字段相同&#xff0c;那么什么时候使用它呢&#xff1…

如何实现对象交互

在本篇随笔中&#xff0c;我们学习下什么是对象选择&#xff0c;投影和反投影是如何工作的&#xff0c;怎样使用Three.js构建可使用鼠标和对象交互的应用。例如当鼠标移到对象&#xff0c;对象变成红色&#xff0c;鼠标移走&#xff0c;对象又恢复原来的颜色。 本篇随笔的源代码…

Matlab与线性代数 -- 矩阵的大小

本图文介绍了如何利用Matlab求矩阵的大小。

最近做了一个小小的系统,收获挺大的....我想总结一下

首先我要感谢老许,是他给了我这次机会.以后我会把我的经验一点一点总结出来....为那些在编程之路上的迷茫者找到方向活着让人兴奋...总觉的应该去做点什么做工程开发吧----我的老师阿温说过一句话让我记忆尤新:"坚持成就传奇".我想用他去勉力每一个在人生路上奋斗的人…

Hibernate和iBATIS 优缺点比较

选择Hibernate还是iBATIS都有它的道理&#xff1a;Hibernate的特点&#xff1a;Hibernate功能强大&#xff0c;数据库无关性好&#xff0c;O/R映射能力强&#xff0c;如果你对Hibernate相当精通&#xff0c;而且对Hibernate进行了适当的封装&#xff0c;那么你的项目整个持久层…

Matlab与线性代数 -- 矩阵的秩

本图文详细介绍了利用Matlab求矩阵秩的方法。

iOS开发 最近开发了蓝牙模块,在此记录总结一下

为什么80%的码农都做不了架构师&#xff1f;>>> 1.基本概念 <1>中心者模式&#xff1a;常用的&#xff08;其实99.99%&#xff09;就是使用中心者模式作为开发&#xff0c;就是我们手机作为主机&#xff0c;连接蓝牙外设。由于开发只用到了中心者模式&#x…

asp.net实现在网页上自动显示超链接以及Email地址

人们总喜欢在帖子中加上各种有用的URL链接或Email地址。而笔者当初设计时没有考虑到这一点&#xff0c;使得这些URL链接或Email地址只能以文字的形式而并不是以超链接的形式显示&#xff0c;其它浏览帖子的人还必须把这些URL链接拷贝到浏览器中或把Email地址拷贝到Outlook中才能…

用开放地址法中的线性探查法解决冲突实现哈希表的运算

为了更深的理解哈希算法&#xff0c;自己写了用开放地址法中的线性探查法解决冲突实现哈希表的运算。 /*** Created by lirui on 14-8-13.* 用开放地址法中的线性探查法解决冲突实现哈希表的运算。*/ public class MyHashSearch {public static final int SIZE 10;public sta…

Re: 求助:5道算法题

http://www.newsmth.net/frames.html发信人: cutepig (cutepig), 信区: Algorithm标 题: 求助&#xff1a;5道算法题发信站: 水木社区 (Sat Nov 10 18:25:06 2007), 站内1)given a integer, output its previous and next neighbor number which has the same number of bit 1…

Linux下des对称性加密

最近对接公安审计一些经历 对方的需求&#xff1a; 打成zip包对zip包进行des-cbc对称性加密&#xff0c;使用约定好的 -K和-iv值比如 -K "abcd$#!" -iv "efgh$#!"加密后做base64编码起初是想尝试用 php 去做&#xff0c;经过一阵折腾之后发现&#xff0c;p…

在软件中常用的“撤销”操作,其本质是“栈”!

本文介绍了栈的定义与操作并利用顺序表和链表实现了栈这种常用的数据结构。

用拉链法实现哈希算法的运算

package lirui.find;import java.util.LinkedList;/*** Created by lirui on 14-8-13.* 用拉链法实现哈希算法的运算*/ public class MyHashSearch2 {public static final int SIZE 10;public static MyHashElement[] hashtable new MyHashElement[SIZE];// 记录hash表中的数…

C#图片处理常见方法性能比较

在.NET编程中&#xff0c;由于GDI的出现&#xff0c;使得对于图像的处理功能大大增强。在文通过一个简单黑白处理实例介绍在.NET中常见的图片处理方法和原理并比较各种方法的性能。 黑白处理原理&#xff1a;彩色图像处理成黑白效果通常有3种算法&#xff1b; (1).最大值法: 使…

软件中常用的“发送邮件”、“打印文档”,其本质是“队列”!

本图文详细介绍了顺序队列、循环队列、链队列的实现过程。

二分查找的循环实现和递归实现

自己实现了二分查找的循环实现和递归实现 说明&#xff1a;二分查找适用于顺序存储结构&#xff0c;不适于链式存储结构&#xff0c;是一个高效的查找方法。虽然折半查找效率高&#xff0c;但是要排序&#xff0c;排序本身是一种很费时的运算。要求传入的表是有序的。二分查找的…

CentOS6.8 编译安装LNMP

思路&#xff1a;根据Linux系统以及公司网站系统的信息&#xff0c;选择合适的安装包进行安装 一、查看系统信息 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # grep MemTotal /proc/meminfo # 查看内…

js入门·循环与判断/利用函数的简单实例/使用对象/列举对象属性的名称

1,列举对象属性的名称<script language"javascript">varobjnewObject();obj.a"您好&#xff0c;我是田洪川";obj.b"你是田洪川咋的&#xff0c;不得了啊&#xff1f;";obj.c"西西&#xff0c;哈哈&#xff0c;我是属性 c ";//上…