package org.e3.common.utils;
import org.apache.commons.beanutils.BeanUtils;
import org.e3.msjw.model.portal.PortalFaqType;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.*;
import java.io.*;
public class ToCsv {
/**
* @param exportData 需要导出的数据
* @param map 标题
* @param outputPath 导出csv路径
* @param filename 文件名
* @return
*/
public static File createCsvFile(List exportData, LinkedHashMap map, String outputPath, String filename){
File csvFile = null;
BufferedWriter csvFileOutputStream = null;
try{
File file = new File(outputPath);
if (!file.exists()){
file.mkdir();
}
//定义文件名格式并创建
csvFile = File.createTempFile(filename, ".csv", new File(outputPath));
//如果生产文件乱码,windows下用gbk,linux用UTF-8
csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "UTF-8"), 1024);
// 写入文件头部
for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator.hasNext();) {
java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator.next();
csvFileOutputStream.write((String) propertyEntry.getValue() != null ? (String) propertyEntry.getValue() : "" );
if (propertyIterator.hasNext()) {
csvFileOutputStream.write(",");
}
}
csvFileOutputStream.newLine();
// 写入文件内容
for (Iterator iterator = exportData.iterator(); iterator.hasNext();) {
Object row = (Object) iterator.next();
for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator.hasNext();) {
java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator.next();
csvFileOutputStream.write((String) BeanUtils.getProperty(row, (String) propertyEntry.getKey()));
if (propertyIterator.hasNext()) {
csvFileOutputStream.write(",");
}
}
if (iterator.hasNext()) {
csvFileOutputStream.newLine();
}
}
csvFileOutputStream.flush();
}catch (Exception e) {
e.printStackTrace();
} finally {
try {
csvFileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//修改文件名
changeFilename(filename,csvFile.getAbsolutePath());
return csvFile;
}
/**
* 修改文件名
*/
public static void changeFilename(String filename, String filePath){
File oldFile = new File(filePath);
String rootPath = oldFile.getParent();
File newFile = new File(rootPath + File.separator + System.currentTimeMillis()+ filename + ".csv");
oldFile.renameTo(newFile);
}
/**
*
* @param model 输入的任意实体类
* 得到实体类的所有setter,并对自身根据输入的@param data进行赋值
* @throws Exception
*/
public static void Reflect2SetValue(Object model, String[] data) throws Exception{
int i =0 ;
for (Field field : model.getClass().getDeclaredFields()) {
field.setAccessible(true);
/**
* setter 实体类跟给出的值的类型必须匹配
* data[i] 应该定义为相应的类型 Date String Long
*/
if (field.getType().getName().equals("java.lang.Integer")){
int value = Integer.parseInt(data[i]);
setter(model,field.getName(),value,field.getType());
}else if (field.getType().getName().equals("java.lang.String")){
String value = (String) data[i];
setter(model,field.getName(),value,field.getType());
}else if (field.getType().getName().equals("java.lang.Long")){
long value = Long.parseLong(data[i]);
setter(model,field.getName(),value,field.getType());
}else if (field.getType().getName().equals("java.util.Date")){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date value = sdf.parse(data[i]);
setter(model,field.getName(),value,field.getType());
}
i++;
}
}
/**
*@param obj 操作的对象
*@param att 操作的属性
*@param value 设置的值
*@param type 参数的类型
*/
public static void setter(Object obj, String att, Object value, Class<?>type){
try {
Method met = obj.getClass().getMethod("set" + initStr(att), type);
met.invoke(obj, value);
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 读取csv 生成List
* @param csvPath
* @param filename
* @param object 操作的实体类
* @return List<Object>
*/
public static List<Object> csv2List(String csvPath, String filename, Object object) throws Exception {
String className = object.getClass().getName();
Class pClass1=Class.forName(className);
//获取构造器
Constructor c = pClass1.getConstructor();
BufferedReader reader = new BufferedReader(new FileReader(csvPath + filename));
String line = null;
List<Object> objects = new ArrayList<>();
int i = 0;
while((line=reader.readLine())!=null){
if (i == 0){
//csvfile的第一行是标题 需要跳过
i++;
continue;
}
//根据构造器,实例化出对象
Object service = c.newInstance();
//CSV格式文件为逗号分隔符文件,这里根据逗号切分
String data[] = line.split(",");
Reflect2SetValue(service,data);
objects.add(service);
}
return objects;
}
public static String initStr(String old){ // 将单词的首字母大写
String str = old.substring(0,1).toUpperCase() + old.substring(1) ;
return str ;
}
/**
* 生成提供的实体类的所有字段
*/
public static LinkedHashMap getAllProperties(Object object){
LinkedHashMap map = new LinkedHashMap<String,String>();
/**
* 获得一个实体类的所有属性
*/
for (Field field : object.getClass().getDeclaredFields()) {
field.setAccessible(true);
map.put(field.getName(),field.getName());
}
/**
* map去掉第一个元素,因为那是实体类里面的serialVersionUID 不去掉会出错
*/
map.remove("serialVersionUID");
return map;
}
/**
* 测试 TODO 不用之后删除掉该测试
* @param args
*/
public static void main(String[] args) throws Exception {
/**
* 使用示例1:从数据库获取数据并生成csv文件
*/
List<PortalFaqType> list = null;
PortalFaqType portalFaqType = new PortalFaqType();
LinkedHashMap map = getAllProperties(portalFaqType);
/**
* list:类似“List<PortalFaqType> list = faqService.queryAllFaqType();”得到的数据
* map:标题
* outputpath:csv文件的根路径
* filename;csv文件名
*/
String outputPath = "F:\\BaiduNetdiskDownload\\";
String fileName ="_yyxxb";
createCsvFile(list,map,outputPath,fileName);
// ============分开测试示例1,2==============
/**
* 使用示例2:从csv文件获取数据,返回类似“List<PortalFaqType> list”
*/
String path = "F:\\BaiduNetdiskDownload\\";
String filename = "yyxxb_4003411711105834723.csv";
//dkinfo:你想操作的实体类
Dkinfo dkinfo = new Dkinfo();
//dkinfos:用来保存从csv文件获取的数据
List<Dkinfo> dkinfos = new ArrayList<>();
List<Object> objects = csv2List(path,filename,dkinfo);
for (Object object:objects){
dkinfos.add((Dkinfo) object);
}
//dkinfos至此获得了csv的所有行数据
}
}
有问题联系qq:1393467612 或者评论留言