如何序列化对象到CSV文件?

我想写一个对象到CSV文件。 对于XML,我们有这样的XStream
所以,如果我想将对象转换为CSV,我们有任何这样的库?

编辑: 我想通过我的Bean的列表到一个方法,应该写入所有的字段的CSV到CSV。

首先,序列化将对象写入一个“按原样”的文件。 AFAIK,你不能select文件格式和所有。 序列化的对象(在一个文件中)有它自己的“文件格式”

如果要将对象(或对象列表)的内容写入CSV文件,可以自己做,不应该很复杂。

看起来像Java CSV库可以做到这一点,但我没有尝试过自己。

编辑 :见下面的例子。 这绝不是万无一失的,但你可以build立在这个基础上。

//European countries use ";" as //CSV separator because "," is their digit separator private static final String CSV_SEPARATOR = ","; private static void writeToCSV(ArrayList<Product> productList) { try { BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("products.csv"), "UTF-8")); for (Product product : productList) { StringBuffer oneLine = new StringBuffer(); oneLine.append(product.getId() <=0 ? "" : product.getId()); oneLine.append(CSV_SEPARATOR); oneLine.append(product.getName().trim().length() == 0? "" : product.getName()); oneLine.append(CSV_SEPARATOR); oneLine.append(product.getCostPrice() < 0 ? "" : product.getCostPrice()); oneLine.append(CSV_SEPARATOR); oneLine.append(product.isVatApplicable() ? "Yes" : "No"); bw.write(oneLine.toString()); bw.newLine(); } bw.flush(); bw.close(); } catch (UnsupportedEncodingException e) {} catch (FileNotFoundException e){} catch (IOException e){} } 

这是产品(隐藏的getter和setter为了便于阅读):

 class Product { private long id; private String name; private double costPrice; private boolean vatApplicable; } 

这就是我testing的方式:

 public static void main(String[] args) { ArrayList<Product> productList = new ArrayList<Product>(); productList.add(new Product(1, "Pen", 2.00, false)); productList.add(new Product(2, "TV", 300, true)); productList.add(new Product(3, "iPhone", 500, true)); writeToCSV(productList); } 

希望这可以帮助。

干杯。

为了便于CSV访问,有一个名为OpenCSV的库。 这真的很容易访问CSV文件的内容。

编辑

根据你的更新,我认为所有以前的答复是不正确的(由于他们的低级别)。 事实上,你可以采用完全不同的方式,hibernate方式!

通过使用CsvJdbc驱动程序,您可以将CSV文件作为JDBC数据源加载,然后直接将您的bean映射到此数据源。

我会和你讨论一下CSVObjects ,但是由于这个网站似乎坏了,所以我担心现在这个lib是不可用的。

有一个csv序列化程序会很有趣,因为与其他序列化方法相比,它将占用最小的空间。

java对象对csv的最近支持是spring utils项目提供的stringutils

arrayToCommaDelimitedString(Object [] arr),但它远不是一个序列化程序。

这是一个简单的实用程序,它使用reflection来序列化值对象

 public class CSVWriter { private static String produceCsvData(Object[] data) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException { if(data.length==0) { return ""; } Class classType = data[0].getClass(); StringBuilder builder = new StringBuilder(); Method[] methods = classType.getDeclaredMethods(); for(Method m : methods) { if(m.getParameterTypes().length==0) { if(m.getName().startsWith("get")) { builder.append(m.getName().substring(3)).append(','); } else if(m.getName().startsWith("is")) { builder.append(m.getName().substring(2)).append(','); } } } builder.deleteCharAt(builder.length()-1); builder.append('\n'); for(Object d : data) { for(Method m : methods) { if(m.getParameterTypes().length==0) { if(m.getName().startsWith("get") || m.getName().startsWith("is")) { System.out.println(m.invoke(d).toString()); builder.append(m.invoke(d).toString()).append(','); } } } builder.append('\n'); } builder.deleteCharAt(builder.length()-1); return builder.toString(); } public static boolean generateCSV(File csvFileName,Object[] data) { FileWriter fw = null; try { fw = new FileWriter(csvFileName); if(!csvFileName.exists()) csvFileName.createNewFile(); fw.write(produceCsvData(data)); fw.flush(); } catch(Exception e) { System.out.println("Error while generating csv from data. Error message : " + e.getMessage()); e.printStackTrace(); return false; } finally { if(fw!=null) { try { fw.close(); } catch(Exception e) { } fw=null; } } return true; } 

}

这是一个示例值对象

 public class Product { private String name; private double price; private int identifier; private boolean isVatApplicable; public Product(String name, double price, int identifier, boolean isVatApplicable) { super(); this.name = name; this.price = price; this.identifier = identifier; this.isVatApplicable = isVatApplicable; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(long price) { this.price = price; } public int getIdentifier() { return identifier; } public void setIdentifier(int identifier) { this.identifier = identifier; } public boolean isVatApplicable() { return isVatApplicable; } public void setVatApplicable(boolean isVatApplicable) { this.isVatApplicable = isVatApplicable; } 

}

以及运行util的代码

 public class TestCSV { public static void main(String... a) { Product[] list = new Product[5]; list[0] = new Product("dvd", 24.99, 967, true); list[1] = new Product("pen", 4.99, 162, false); list[2] = new Product("ipad", 624.99, 234, true); list[3] = new Product("crayons", 4.99,127, false); list[4] = new Product("laptop", 1444.99, 997, true); CSVWriter.generateCSV(new File("C:\\products.csv"),list); } } 

输出:

 Name VatApplicable Price Identifier dvd true 24.99 967 pen false 4.99 162 ipad true 624.99 234 crayons false 4.99 127 laptop true 1444.99 997 

我写了一个使用OpenCSV的简单类,并有两个static public方法。

 static public File toCSVFile(Object object, String path, String name) { File pathFile = new File(path); pathFile.mkdirs(); File returnFile = new File(path + name); try { CSVWriter writer = new CSVWriter(new FileWriter(returnFile)); writer.writeNext(new String[]{"Member Name in Code", "Stored Value", "Type of Value"}); for (Field field : object.getClass().getDeclaredFields()) { writer.writeNext(new String[]{field.getName(), field.get(object).toString(), field.getType().getName()}); } writer.flush(); writer.close(); return returnFile; } catch (IOException e) { Log.e("EasyStorage", "Easy Storage toCSVFile failed.", e); return null; } catch (IllegalAccessException e) { Log.e("EasyStorage", "Easy Storage toCSVFile failed.", e); return null; } } static public void fromCSVFile(Object object, File file) { try { CSVReader reader = new CSVReader(new FileReader(file)); String[] nextLine = reader.readNext(); // Ignore the first line. while ((nextLine = reader.readNext()) != null) { if (nextLine.length >= 2) { try { Field field = object.getClass().getDeclaredField(nextLine[0]); Class<?> rClass = field.getType(); if (rClass == String.class) { field.set(object, nextLine[1]); } else if (rClass == int.class) { field.set(object, Integer.parseInt(nextLine[1])); } else if (rClass == boolean.class) { field.set(object, Boolean.parseBoolean(nextLine[1])); } else if (rClass == float.class) { field.set(object, Float.parseFloat(nextLine[1])); } else if (rClass == long.class) { field.set(object, Long.parseLong(nextLine[1])); } else if (rClass == short.class) { field.set(object, Short.parseShort(nextLine[1])); } else if (rClass == double.class) { field.set(object, Double.parseDouble(nextLine[1])); } else if (rClass == byte.class) { field.set(object, Byte.parseByte(nextLine[1])); } else if (rClass == char.class) { field.set(object, nextLine[1].charAt(0)); } else { Log.e("EasyStorage", "Easy Storage doesn't yet support extracting " + rClass.getSimpleName() + " from CSV files."); } } catch (NoSuchFieldException e) { Log.e("EasyStorage", "Easy Storage fromCSVFile failed.", e); } catch (IllegalAccessException e) { Log.e("EasyStorage", "Easy Storage fromCSVFile failed.", e); } } // Close if (nextLine.length >= 2) } // Close while ((nextLine = reader.readNext()) != null) } catch (FileNotFoundException e) { Log.e("EasyStorage", "Easy Storage fromCSVFile failed.", e); } catch (IOException e) { Log.e("EasyStorage", "Easy Storage fromCSVFile failed.", e); } catch (IllegalArgumentException e) { Log.e("EasyStorage", "Easy Storage fromCSVFile failed.", e); } } 

我想用一些简单的recursion方法可以修改这些方法来处理任何Java对象,但是对于我来说这已经足够了。

虽然它的回复非常晚,但是我还是面临着在各种项目中将java导出到CSV,EXCEL等问题,我们需要在UI上提供导出function。

我已经创build了我自己的轻量级框架。 它适用于任何Java Bean,只需要在要导出为CSV,Excel等的字段上添加注释。

链接: https : //github.com/abhisoni96/export-entity