java csvwriter writecomment_CSVWriter生成文件时writer.writeRecord();方法保存的文件末尾多一个空行...

1 packagecom.sp.ppms.console.finance.CSV;2

3 import java.io.*;4 importjava.lang.reflect.Field;5 importjava.lang.reflect.Method;6 importjava.nio.charset.Charset;7 importjava.util.ArrayList;8 importjava.util.Collections;9 importjava.util.HashMap;10 importjava.util.List;11 importjava.util.Map;12 importjava.util.Map.Entry;13 importorg.apache.commons.lang3.StringUtils;14 importorg.apache.log4j.Logger;15 importorg.springframework.util.ReflectionUtils;16 importcom.csvreader.CsvReader;17 importcom.csvreader.CsvWriter;18

19 /**

20 * CSV工具类21 */

22 public classCSVUtil {23 /**

24 * 日志对象25 **/

26 private static final Logger LOGGER = Logger.getLogger(CSVUtil.class);27

28 /**

29 * 生成CSV文件30 *@paramfilePath 文件保存路径,例如:D:/temp/test.csv31 *@paramheaderBeans 实体对象集合32 *@paramdetailBeans 实体对象集合33 *@paramtrailerBeans 实体对象集合34 *@param35 */

36 public static void createFile(String filePath, List headerBeans, List detailBeans, ListtrailerBeans) {37 CsvWriter writer = null;38 try{39 //创建文件对象

40 File file =createFile(filePath);41 //生成文件

42 writer = new CsvWriter(filePath, ',', Charset.forName("GBK"));43 //获取内容

44 List contents = new ArrayList<>();45 List headerContents =getStringArrayFromBean(headerBeans);46 List detailContents =getStringArrayFromBean(detailBeans);47 List trailerContents =getStringArrayFromBean(trailerBeans);48 contents.addAll(headerContents);49 contents.addAll(detailContents);50 contents.addAll(trailerContents);51 //重组内容

52 String result = "";53 for(String[] each : contents) {54 for(String s : each){55 result +=s ;56 result += ",";57 }58 result = result.substring(0,result.length()-1);59 result += "\r\n";60 }61 result = result.substring(0,result.length()-2);62

63 writeFileContent(filePath,result);//写入

64 } catch(Exception e) {65 LOGGER.error("生成CSV文件失败", e);66 } finally{67 if (writer != null) {68 writer.close();69 }70 }71 }72

73 /**

74 * 向文件中写入内容75 *76 *@paramfilepath 文件路径与名称77 *@paramnewstr 写入的内容78 *@return

79 *@throwsIOException80 */

81 public static boolean writeFileContent(String filepath, String newstr) throwsIOException {82 Boolean bool = false;83 String temp = "";84 FileInputStream fis = null;85 InputStreamReader isr = null;86 BufferedReader br = null;87 FileOutputStream fos = null;88 PrintWriter pw = null;89 try{90 /*File file = new File(filepath);*///文件路径(包括文件名称)91 //将文件读入输入流

92 fis = newFileInputStream(filepath);93 isr = newInputStreamReader(fis);94 br = newBufferedReader(isr);95

96 //StringBuffer buffer = new StringBuffer();97 // //文件原有内容98 //for (int i = 0; (temp = br.readLine()) != null; i++) {99 //buffer.append(temp);100 // //行与行之间的分隔符 相当于“\n”101 //buffer = buffer.append(System.getProperty("line.separator"));102 //}103 //buffer.append(newstr);

104

105 fos = newFileOutputStream(filepath);106 pw = newPrintWriter(fos);107 pw.write(newstr.toCharArray());108 pw.flush();109 bool = true;110 } catch(Exception e) {111 //TODO: handle exception

112 e.printStackTrace();113 throwe;114 } finally{115 //不要忘记关闭

116 if (pw != null) {117 pw.close();118 }119 if (fos != null) {120 fos.close();121 }122 if (br != null) {123 br.close();124 }125 if (isr != null) {126 isr.close();127 }128 if (fis != null) {129 fis.close();130 }131 }132 returnbool;133 }134

135 /**

136 * 读取CSV文件内容137 *138 *@paramfilePath 文件存放的路径,如:D:/csv/xxx.csv139 *@parambean 类类型140 *@returnList141 */

142 public static List readFile(String filePath, Classbean) {143 List dataList = new ArrayList();144 CsvReader reader = null;145 try{146 //创建CSV读对象 例如:CsvReader(文件路径,分隔符,编码格式);

147 reader = new CsvReader(filePath, ',', Charset.forName("GBK"));148 if (reader != null) {149 //跳过表头,如果需要表头的话,这句可以忽略150 //reader.readHeaders();151 //逐行读入除表头的数据

152 while(reader.readRecord()) {153 dataList.add(reader.getValues());154 }155 if (!dataList.isEmpty()) {156 //数组转对象

157 returngetBeanFromStringArray(dataList, bean);158 }159 }160 } catch(Exception e) {161 LOGGER.error("读取CSV文件失败", e);162 } finally{163 if (reader != null) {164 reader.close();165 }166 }167 returnCollections.emptyList();168 }169

170 /**

171 * 删除该目录下所有文件172 *173 *@paramfilePath 文件目录路径,如:d:/test174 */

175 public static booleandeleteFiles(String filePath) {176 File file = newFile(filePath);177 if(file.exists()) {178 File[] files =file.listFiles();179 if (files != null && files.length > 0) {180 for(File f : files) {181 if (f.isFile() &&f.delete()) {182 LOGGER.info("删除" + f.getName() + "文件成功");183 }184 }185 return true;186 }187 }188 return false;189 }190

191 /**

192 * 删除单个文件193 *194 *@paramfilePath 文件目录路径,如:d:/test195 *@paramfileName 文件名称,如:110.csv196 */

197 public static booleandeleteFile(String filePath, String fileName) {198 File file = newFile(filePath);199 if(file.exists()) {200 File[] files =file.listFiles();201 if (files != null && files.length > 0) {202 for(File f : files) {203 if (f.isFile() &&f.getName().equals(fileName)) {204 returnf.delete();205 }206 }207 }208 }209 return false;210 }211

212 /**

213 * 泛型实体转换为数组214 *215 *@parambeans216 *@returnList217 */

218 private static List getStringArrayFromBean(Listbeans) {219 List result = new ArrayList();220 Class extends Object> cls = beans.get(0).getClass();221 Field[] declaredFields =cls.getDeclaredFields();222 List annoFields = new ArrayList();223 //筛选出标有注解的字段

224 for(Field field : declaredFields) {225 CSVField anno = field.getAnnotation(CSVField.class);226 if (anno != null) {227 annoFields.add(field);228 }229 }230 //获取注解的值,即内容标题

231 String[] title = newString[annoFields.size()];232 /*for (int i = 0; i < annoFields.size(); i++) {233 title[i] = annoFields.get(i).getAnnotation(CSVField.class).name();234 }235 result.add(title);*/

236 try{237 //获取内容

238 for(T t : beans) {239 String[] item = newString[annoFields.size()];240 int index = 0;241 for(Field field : annoFields) {242 String fieldName =field.getName();243 String methodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);244 Method method =ReflectionUtils.findMethod(t.getClass(), methodName);245 if (method != null) {246 Object value =ReflectionUtils.invokeMethod(method, t);247 if (value == null) {248 item[index] = "";249 } else{250 item[index] =value.toString();251 }252 }253 index++;254 }255 result.add(item);256 }257 } catch(Exception e) {258 LOGGER.info("实体对象转数组失败", e);259 }260 returnresult;261 }262

263 /**

264 * 数组转为对象集合265 *266 *@paramdataList267 *@parambean268 *@returnList269 */

270 private static List getBeanFromStringArray(List dataList, Classbean) {271 List list = new ArrayList<>();272 List> titles =getTitles(dataList);273 Map fields =getFields(bean);274 try{275 for (Mapmap : titles) {276 T t =bean.newInstance();277 for (Entryentry : map.entrySet()) {278 if(fields.containsKey(entry.getKey())) {279 Field field =fields.get(entry.getKey());280 Class> valType =field.getType();281 String fieldName =field.getName();282 String methodName = "set" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);283 Method method =ReflectionUtils.findMethod(bean, methodName, valType);284 if (method != null) {285 ReflectionUtils.invokeMethod(method, t, entry.getValue());286 }287 }288 }289 list.add(t);290 }291 } catch(Exception e) {292 LOGGER.error("创建实体失败", e);293 }294 returnlist;295 }296

297 /**

298 * 数组标题与值的对应关系299 *300 *@paramdataList301 *@return

302 */

303 private static List> getTitles(ListdataList) {304 List> list = new ArrayList<>();305 String[] titles = dataList.get(0);306 dataList.remove(0);307 for(String[] values : dataList) {308 Map titleMap = new HashMap<>();309 for (int i = 0; i < values.length; i++) {310 titleMap.put(titles[i], values[i]);311 }312 list.add(titleMap);313 }314 returnlist;315 }316

317 /**

318 * 注解名称与字段属性的对应关系319 *320 *@paramclazz 实体对象类类型321 *@param 泛型类型322 *@returnMap323 */

324 private static Map getFields(Classclazz) {325 Map annoMap = new HashMap<>();326 Field[] fileds =clazz.getDeclaredFields();327 for(Field filed : fileds) {328 CSVField anno = filed.getAnnotation(CSVField.class);329 if (anno != null) {330 //获取name属性值

331 if(StringUtils.isNotBlank(anno.name())) {332 annoMap.put(anno.name(), filed);333 }334 }335 }336 returnannoMap;337 }338

339 /**

340 * 创建文件对象341 *342 *@paramfilePath 文件路径,例如:temp/test.csv343 *@returnFile344 */

345 private staticFile createFile(String filePath) {346 File file = null;347 try{348 //创建文件目录

349 file = new File(filePath.substring(0, filePath.lastIndexOf('/')));350 if (!file.exists()) {351 file.mkdirs();352 }353 //创建文件对象

354 file = newFile(filePath);355 if (!file.exists() &&file.createNewFile()) {356 LOGGER.info("创建文件对象成功");357 }358 } catch(IOException e) {359 LOGGER.error("创建文件对象失败", e);360 }361 returnfile;362

363 }364 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值