导出csv文件

当接到业务需求为为每张表的内容导出到csv文件时,导出功能其实并不难做,这里可以参考Java导出CSV文件 - 废物大师兄 - 博客园。

问题是,当有大量的表需要导出时,对每张表起一个线程进行操作实际上是很复杂的,而且不具备很高的复用性,因此能将导出的方法再进行一次封装,使其具备更高的重用性是有必要的。


ResultSetMetaData resultSetMetaData =resultSet.getMetaData();

int a = resultSetMetaData.getColumnCount();//返回字段数

resultSetMetaData.getColumnTypeName(i+1));返回字段类型


FileOutputStream fos =new FileOutputStream("文件地址");

OutputStreamWriter osw =new OutputStreamWriter(fos,"GBK");

CSVFormat csvFormat = CSVFormat.DEFAULT.withHeader(replace);//注意,这里的replace实际上是一个String数组类型,因为withHeader方法内的参数实际上不固定,这个方法是为我们写的csv文件表头,因为我们每张表的字段不一样,所以用数组存字段,再将其放入参数是一个好办法。

CSVPrinter csvPrinter =new CSVPrinter(osw,csvFormat);



//设置初始的数组,目前包含的表最多有四十个字段左右

            String[]  s = new String[42];

            //初始化数组

            for(int i = 0; i

                s[i] = "";

            }

            //将字段名与字段类型相对应

            Map map = new HashMap<>();//这里的map是为了将字段名和字段类型做一个对应


for(int i = 0;i

                s[i]=resultSetMetaData.getColumnName(i+1);

                map.put(s[i],resultSetMetaData.getColumnTypeName(i+1));

            }


//截取数组,多余的值不要,否则会报CSV栏目名重复错误

String[] replace =new String[a+1];

for(int i =0;i

replace[i] = s[i];

}

while(resultSet.next()) {

for (int i =0; i < a; i++) {

if (map.get(replace[i]) =="VARCHAR") {

replace[i] =resultSet.getString(replace[i]);

        }else if (map.get(replace[i]) =="INT") {

replace[i] = String.valueOf(resultSet.getInt(replace[i]));

        }else if (map.get(replace[i]) =="DATETIME")

replace[i] =resultSet.getString(replace[i]);

    }

csvPrinter.printRecord(replace);

    System.out.println("导出一条数据");

}

//碰到一个大坑,记录一下

在while(resultset.next){

}中,应该将数组新建在循环内部,要不然只会得到第一条数据

你可能感兴趣的:(导出csv文件)