1. 程式人生 > >Java下將資料寫入CSV檔案中

Java下將資料寫入CSV檔案中

import java.io.*;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**Created by JYM on 2018/12/26
 * 下面的這段程式是Java將資料寫入CSV檔案中;
 * */

public class CSV
{

    public static void main(String[] args)
    {
        Object[] objects = {1,2,3,4,8,7,9,6,5,11,12};
        ArrayList<Object[]> list = new ArrayList<>();
        list.add(objects);
        list.add(objects);
        list.add(objects);
        boolean Flag=createCsvFile(list,"G:\\CSVDir","csvFile");
        if (Flag == true)
        {
            System.out.print("CSV檔案建立成功!");
        }else {
            System.out.print("CSV檔案建立失敗!");
        }
    }

    public static boolean createCsvFile(List<Object[]> rows, String filePath, String fileName)
    {
        //標記檔案生成是否成功;
        boolean flag = true;

        //檔案輸出流
        BufferedWriter fileOutputStream = null;

        try{
            //含檔名的全路徑
            String fullPath = filePath+ File.separator+fileName+".csv";
            File file = new File(fullPath);
            if (!file.getParentFile().exists())     //如果父目錄不存在,建立父目錄
            {
                file.getParentFile().mkdirs();
            }
            if (file.exists())     //如果該檔案已經存在,刪除舊檔案
            {
                file.delete();
            }
            file = new File(fullPath);
            file.createNewFile();

            //格式化浮點資料
            NumberFormat formatter = NumberFormat.getNumberInstance();
            formatter.setMaximumFractionDigits(10);     //設定最大小數位為10;

            //格式化日期資料
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

            //例項化檔案輸出流
            fileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"GB2312"),1024);

            //遍歷輸出每行
            Iterator<Object[]> ite = rows.iterator();

            while (ite.hasNext())
            {
                Object[] rowData = (Object[])ite.next();
                for(int i=0;i<rowData.length;i++)
                {
                    Object obj = rowData[i];   //當前欄位
                    //格式化資料
                    String field = "";
                    if (null != obj)
                    {
                        if (obj.getClass() == String.class)     //如果是字串
                        {
                            field = (String)obj;
                        }else if (obj.getClass() == Double.class || obj.getClass() == Float.class)   //如果是浮點型
                        {
                            field = formatter.format(obj);   //格式化浮點數,使浮點數不以科學計數法輸出
                        }else if (obj.getClass() == Integer.class || obj.getClass() == Long.class | obj.getClass() == Short.class || obj.getClass() == Byte.class)
                        {
                            //如果是整型
                            field += obj;
                        }else if (obj.getClass() == Date.class)   //如果是日期型別
                        {
                            field = sdf.format(obj);
                        }else {
                            field = " ";   //null時給一個空格佔位
                        }

                        //拼接所有欄位為一行資料
                        if (i<rowData.length-1)     //不是最後一個元素
                        {
//                            System.out.print("\""+field+"\""+",");
                            fileOutputStream.write("\""+field+"\""+",");
                        }else {
                            //最後一個元素
                            fileOutputStream.write("\""+field+"\"");
                        }
                    }
                    //建立一個新行
                    if (ite.hasNext())
                    {
                        //fileOutputStream.newLine();
                    }
                }
                fileOutputStream.newLine();     //換行,建立一個新行;
            }
            fileOutputStream.flush();
        }catch (Exception e)
        {
            flag = false;
            e.printStackTrace();
        }finally {
            try{
                fileOutputStream.close();
            }catch (IOException e)
            {
                e.printStackTrace();
            }
        }
        return flag;
    }
}