How to serialize object to CSV file?

前端 未结 8 1250
执念已碎
执念已碎 2020-11-27 17:14

I want to write a Object into CSV file. For XML we have XStream like this
So if i want to convert object to CSV do we have any such library ?

EDIT: I w

相关标签:
8条回答
  • 2020-11-27 18:15

    It would be interesting to have a csv serializer as it would take up the minimal space compared to other serializing method.

    The closest support for java object to csv is stringutils provided by spring utils project

    arrayToCommaDelimitedString(Object[] arr) but it is far from being a serializer.

    Here is a simple utility which uses reflection to serialize value objects

    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;
    }
    

    }

    Here is an example value object

    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;
    }
    

    }

    and the code to run the 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);
    }
    
    }
    

    Output:

    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
    
    0 讨论(0)
  • 2020-11-27 18:17

    Though its very late reply, I have faced this problem of exporting java entites to CSV, EXCEL etc in various projects, Where we need to provide export feature on UI.

    I have created my own light weight framework. It works with any Java Beans, You just need to add annotations on fields you want to export to CSV, Excel etc.

    Link: https://github.com/abhisoni96/dev-tools

    0 讨论(0)
提交回复
热议问题