Java实现导出数据到csv文件的示例代码
项目中很多情况会遇到需要导出数据到csv文件,代码如下:
package com.elane.common.utils.poi; import Javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.util.List; public class CandroidSVUtil { /** * 导出csv文件 * @param response 导出文件需要的设置在response 中设置好 * @param head 英文逗号分隔的数据表头 * @param dataList 英文逗号分隔的数据 * @param filename 导出后的文件名称 */ public static void createCSVFile(HttpServletResponse response, List<String> head, List<String> dataList, String filename) { File csvFile = null; Bufferedwriter csvWtriter = null; InputStream in = null; OutputStream out = null; try { csvFile=new File(filename); // GB2312使正确读取分隔符"," FileOutputStream fileOutputStream=new FileOutputStream(csvFile); OutputStreamWriter outputStreamWriter=new OutputStreamWriter(fileOutputStream); // outputStreamWriter.write(new String(new byte[]{(byte) 0xEF, (byte) 0xBB, (bythttp://www.devze.come) 0xBF})); csvWtriter = new BufferedWriter(outputStreamWriter); // 写入文件头部 if (head.size()>0){ csvWtriter.write(head.get(0)); csvWtriter.newLine(); } // 写入文件内容 for (String item:dataList){ csvWtriter.write(item); csvWtriter.newLine(); } csvWtriter.flush(); in = new FileInputStream(csvFile); int len = 0; byte[] buffer = new byte[1024*1024*5]; out = response.getOutputStream(); // 设置此response为文件下载响应 response.setContentType("application/csv;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(csvFile.getName(), "UTF-8")); response.setCharacterEncoding("UTF-8"); // 先写UTF-8文件标志头 out.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }); while ((len = in.read(buffer)) > 0) { out.write(buffer, 0, len); } out.flush(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); } if (out != null) { out.close(); } if (csvFile != null) { csvFile.delete(); } if (csvWtriter != null) { csvWtriter.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 保存至csv文件,不导出 * @param fileName 保存的文件名 * @param tempDir 文件保存路径 * @param head 英文逗号分隔的数据表头 * @param dataList 英文逗号分隔的数据 */ public static void SaveTxtFile(String fileName, String tempDir,List<String> head,List<String> dataList) { String filePath=tempDir+"/"+fileName; try{ FileOutputStream fileOutputStream=new FileOutputStream(filePath); OutputStreamWriter outputStreamWriter=new OutputStreamWriter(fileOutputStream); outputStreamWriter.write(new String(new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF})); BufferedWriter writer=new BufferedWriter(outputStreamWriter); writer.write(head.get(0)); writer.newLine(); for (String item:dataList){ writer.write(item)); writer.newLine(); } writer.close(); } catch (IOException e){ System.err.println(e.getMessage()); } } }
方法补充
1.java导出csv格式文件
导出csv格式文件的本质是导出以逗号为分隔的文本数据
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.net.URLEncoder; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRespwww.devze.comonse; import com.alibaba.druid.util.StringUtils; /** * 文件操作 */ public class CSVUtils { /** * 功能说明:获取UTF-8编码文本文件开头的BOM签名。 * BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记。例:接收者收到以EF BB BF开头的字节流,就知道是UTF-8编码。 * @return UTF-8编码文本文件开头的BOM签名 */ public static String getBOM() { byte b[] = {(byte)0xEF, (byte)0xBB, (byte)0xBF}; return new String(b); } /** * 生成CVS文件 * @param exportData * 源数据List * @param map * csv文件的列表头map * @param outPutPath * 文件路径 * @param fileName * 文件名称 * @return */ @SuppressWarnings("rawtypes") 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.mkdirs(); } //定义文件名格式并创建 csvFile =new File(outPutPath+fileName+".csv"); file.createNewFile(); // UTF-8使正确读取分隔符"hnKBnHM," //如果生产文件乱码,Windows下用gbk,linux用UTF-8 csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream( csvFile), "UTF-8"), 1024); //写入前段字节流,防止乱码 csvFileOutputStream.write(getBOM()); // 写入文件头部 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(); String str=row!=null?((String)((Map)row).get( propertyEntry.getKey())):""; if(StringUtils.isEmpty(str)){ str=""; }else{ str=str.replaceAll("\"","\"\""); if(str.indexOf(",")>=0){ str="\""+str+"\""; } } csvFileOutputStream.write(str); 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(); } } return csvFile; } /** * 生成并下载csv文件 * @param response * @param exportData * @param map * @param outPutPath * @param fileName * @throws IOException */ @SuppressWarnings("rawtypes") public static void exportDataFile(HttpServletResponse response,List exportData, LinkedHashMap map, String outPutPath,String fileName) throws IOException{ File csvFile = null; BufferedWriter csvFileOutputStream = null; try { File file = new File(outPutPath); if (!file.exists()) { file.mkdirs(); } //定义文件名格式并创建 csvFile =new File(outPutPath+fileName+".csv"); if(csvFile.exists()){ csvFile.delete(); } csvFile.createNewFile(); // UTF-8使正确读取分隔符"," //如果生产文件乱码,windows下用gbk,linux用UTF-8 csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "UTF-8"), 1024); //写入前段字节流,防止乱码 csvFileOutputStream.write(getBOM()); // 写入文件头部 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(); String str=row!=null?((String)((Map)row).get( propertyEntry.getKey())):""; if(StringUtils.isEmpty(str)){ str=""; }else{ str=str.replaceAll("\"","\"\""); if(str.indexOf(",")>=0){ str="\""+str+"\""; 编程客栈 } } csvFileOutputStream.write(str); 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(); } } InputStream in = null; try { in = new FileInputStream(outPutPath+fileName+".csv"); int len = 0; byte[] buffer = new byte[1024]; OutputStream out = response.getOutputStream(); response.reset(); response.setContentType("application/csv;charset=UTF-8"); response.setHeader("Content-Disposition","attachment; filename=" + URLEncoder.encode(fileName+".csv", "UTF-8")); response.setCharacterEncoding("UTF-8"); while ((len = in.read(buffer)) > 0) { out.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }); out.write(buffer, 0, len); } out.close(); } catch (FileNotFoundException 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; } } } } } /** * 测试数据 * @param args */ @SuppressWarnings({ "rawtypes", "unchecked" }) public static void main(String[] args) { List exportData = new ArrayList<Map>(); Map row1 = new LinkedHashMap<String, String>(); row1.put("1", "11"); row1.put("2", "12"); row1.put("3", "13"); row1.put("4", "14"); exportData.add(row1); row1 = new LinkedHashMap<String, String>(); row1.put("1", "21"); row1.put("2", "22"); row1.put("3", "23"); row1.put("4", "24"); exportData.add(row1); LinkedHashMap map = new LinkedHashMap(); //设置列名 map.put("1", "第一列名称"); map.put("2", "第二列名称"); map.put("3", "第三列名称"); map.put("4", "第四列名称"); //这个文件上传到路径,可以配置在数据库从数据库读取,这样方便一些! String path = "E:/"; //文件名=生产的文件名称+时间戳 String fileName = "文件导出"; File file = CSVUtils.createCSVFile(exportData, map, path, fileName); String fileName2 = file.getName(); System.out.println("文件名称:" + fileName2); } }
2.Java实现Csv文件导入导出
导入
/** * 读取crv文件并转换成List * * @param separator crv文件分隔符 * @param file 待读取文件 * @return crv对象list */ public static <T> List<T> read(String separator, File file, Class<T> clazz) { List<T> result = Collections.emptyList(); try { BeanListProcessor<T> rowprocessor = new BeanListProcessor<>(clazz); //设置分隔符 CsvFormat csvFormat = new CsvFormat(); csvFormat.setDelimiter(separator); CsvParserSettings parserSettings = new CsvParserSettings(); parserSettings.setProcessor(rowProcessor); parserSettings.setFormat(csvFormat); CsvParser parser = new CsvParser(parserSettings); InputStream in = Files.newInputStream(file.toPath()); parser.parse(in); //逐行读取 result = rowProcessor.getBeans(); } catch (Exception e) { log.error("Import csv file failed. message: ", e); } return result; }
测试
@Getter @Setter @NoArgsConstructor @AllArgsConstructor @ToString public static class User implements Serializable { @Parsed(filed = "name") private String name; @Parsed(filed = "age") private Integer age; } public static void main(String[] args) { File file = new File("E:\\test.csv"); List<User> users = CsvUtil.read(",", file, User.class); users.forEach(System.out::println); }
导出
直接创建一个工具类使用,把导入导出方法粘贴进去使用即可
/** * csv文件导出 * * @param data 导出数据 * @param file 导出目的文件 * @param separator 分割符 * @param clazz 导出对象 * @param <T> 数据对象泛型 */ public static <T> void export(Collection<T> data, File file, String separator, Class<T> clazz) { try { CsvWriterSettings settings = new CsvWriterSettings(); //设置分隔符 CsvFormat csvFormat = new CsvFormat(); csvFormat.setDelimiter(separator); settings.setFormat(csvFormat); settings.setHeaderWritingEnabled(false); settings.setRowWriterProcessor(new BeanWriterProcessor<>(clazz)); CsvWriter writer = new CsvWriter(Files.newOutputStream(file.toPath()), "utf-8", settings); // 写入header writer.writeHeaders(settings.getHeaders()); data.forEach(writer::processRecord); writer.close(); } catch (Exception e) { log.error("export .csv file failed. message.", e); } }
测试
@Getter @Setter @NoArgsConstructor @AllArgsConstructor @ToString public static class User implements Serializable { @Parsed(filed = "name") private String name; @Parsed(filed = "age") private Integer age; } public static void main(String[] args) { User user1 = new User("张三", 18); User user2 = new User("李四", 19); List<User> users = Arrays.asList(user1, user2); File file = new File("E:\\test.csv"); CsvUtil.export(users, file, ",", User.class); }
到此这篇关于Java实现导出数据到csv文件的示例代码的文章就介绍到这了,更多相关Java导出数据到csv内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论