【问题标题】:Creating a CSV File in java from a HashMap从 HashMap 在 Java 中创建 CSV 文件
【发布时间】:2010-08-15 11:15:27
【问题描述】:

我在java中有一个hashMap,其中每个键都表示一个流。然后每个显示每个数据包的静态值的值都属于该流。

我需要做的是,根据这些值为每个流绘制图表。例如:

  Flow1: {[length, time],[],[],...}
  Flow2: {[length, time],[length, time],[],...}

我需要创建一个 CSV 文件,然后可以从 MS excel 中读取。谁能给我一些线索吗?

编辑: 这是我的 hashMap:

    Iterator<Flows> iterator =  myHashMap.keySet().iterator();
    String fileName = ((args.length > 0) ? args[0] : "jexcel.xls");
    Map<String, ArrayList> csv = new HashMap<String, ArrayList>();
    int i=0;

    while(iterator.hasNext()){
        Flows key = iterator.next();
        ArrayList value = myHashMap.get(key);
        csv.put("Flow["+i+"]", value);


    }

【问题讨论】:

    标签: java excel csv hashmap


    【解决方案1】:

    您可以使用以下 API。

    兴趣点:http://poi.apache.org

    javacsv : http://sourceforge.net/projects/javacsv

    JExcel:http://jexcelapi.sourceforge.net/

    opencsv : http://opencsv.sourceforge.net/

    以下是使用 supercsv api 写入 csv example

    import java.io.FileWriter;
    import java.util.HashMap;
    import org.supercsv.io.*;
    import org.supercsv.prefs.CsvPreference;
    
    public class CSVWriteExample {
    
        /**
         * @param args
         */
        public static void main(String[] args) throws Exception{  
    
          ICsvMapWriter writer = new CsvMapWriter(new FileWriter("person.csv"), CsvPreference.EXCEL_PREFERENCE);  
          try {  
            final String[] header = new String[] { "name", "city", "pin" };  
            // set up some data to write  
            final HashMap<string, ?="" super="" object=""> data1 = new HashMap<string, object="">();  
            data1.put(header[0], "Raj");  
            data1.put(header[1], "Vijayawada");  
            data1.put(header[2], 500026);  
            final HashMap<string, ?="" super="" object=""> data2 = new HashMap<string, object="">();  
            data2.put(header[0], "Suneel");  
            data2.put(header[1], "Tenali");  
            data2.put(header[2], 522202);  
    
            // the actual writing  
            writer.writeHeader(header);  
            writer.write(data1, header);  
            writer.write(data2, header);  
    
            System.out.println("Writing Completed...!");  
          } finally {  
            writer.close();  
          }  
     }
    }
    

    还可以找到有关 stackoverflow 的相关问题:

    Can you recommend a Java library for reading (and possibly writing) CSV files?

    CSV API for Java

    【讨论】:

    • 谢谢。我很困惑,阅读你建议的链接。我会看看你现在提供的代码。
    • @Red Lion Ya 写入 CSV 的选项太多。对于像您这样的简单案例,您实际上可以毫无问题地使用其中任何一个:)。
    • @Red Lion 您的代码看起来不正确。我不能从这里自己做。查看 supercsv 示例 supercsv.sourceforge.net/codeExamples_general.html supercsv.sourceforge.net/…
    【解决方案2】:

    如果你真的想要一个 Excel 文件,创建一个最好的库是Andy Khan's JExcel

    我认为每个流程需要一个工作表,每个工作表都有 .csv 对,按时间排序。

    如果这些是变量与时间的关系图,“时间”不是每对中的第一个值吗?

    我会这样做。它非常适合我提供的简单测试用例——它是您可以扩展的工作代码。

    package jexcel;
    
    import jxl.Workbook;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;
    import jxl.write.WriteException;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class JExcelUtils
    {
        public static void main(String[] args)
        {
            String fileName = ((args.length > 0) ? args[0] : "jexcel.xls");
            Map<String, List<Pair>> csv = new HashMap<String, List<Pair>>()
            {{
                put("Flow1", fromArrayToList(new double[][]
                {
                    { 0.0, 0.0 },
                    { 0.1, 1.0 },
                    { 0.2, 2.0 },
                    { 0.3, 3.0 },
                    { 0.4, 4.0 },
                    { 0.5, 5.0 },    
                }));
                put("Flow2", fromArrayToList(new double[][]
                {
                    { 0.0, 0.0 },
                    { 0.1, 1.0 },
                    { 0.2, 4.0 },
                    { 0.3, 9.0 },
                    { 0.4, 16.0 },
                    { 0.5, 25.0 },
                }));
            }};
            WritableWorkbook excelContents = null;
    
            try
            {
                File excelFile = new File(fileName);
                excelContents = createExcel(excelFile, csv);
                excelContents.write();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            catch (WriteException e)
            {
                e.printStackTrace();
            }
            finally
            {
                try { if (excelContents != null) excelContents.close(); } catch (Exception e) { e.printStackTrace(); }
            }
        }
    
    
        public static List<Pair> fromArrayToList(double [][] input)
        {
            List<Pair> result = new ArrayList<Pair>();
    
            for (int i = 0; i < input.length; ++i)
            {
                result.add(new Pair(input[i][0], input[i][1]));            
            }
    
            return result;
        }
    
        public static WritableWorkbook createExcel(File excelFile, Map<String, List<Pair>> worksheets) throws IOException, WriteException
        {
            WritableWorkbook result = Workbook.createWorkbook(excelFile);
    
            int order = 0;
            for (String worksheetName : worksheets.keySet())
            {
                WritableSheet worksheet = result.createSheet(worksheetName, order++);
                List<Pair> worksheetValues = worksheets.get(worksheetName);
                for (int row = 0; row < worksheetValues.size(); ++row)
                {
                    worksheet.addCell(new jxl.write.Number(0, row, worksheetValues.get(row).getX()));
                    worksheet.addCell(new jxl.write.Number(1, row, worksheetValues.get(row).getY()));
                }
            }
    
            return result;
        }
    
    }
    
    
    class Pair
    {
        private double x;
        private double y;
    
        Pair(double x, double y)
        {
            this.x = x;
            this.y = y;
        }
    
        public double getX()
        {
            return x;
        }
    
        public double getY()
        {
            return y;
        }
    }
    

    【讨论】:

    • 是的,完全正确。每个流程我需要一张纸。我可以更改订单,一点也不难。
    • 首先非常感谢您。其次,如何在 excel 中查看该程序的输出?
    • @duffymo:我的值是一个数组列表,通过这个映射,我的值应该是 double[][]。
    • @RedLion - 打开它默认创建的“jexcel.xls”文件,或者在命令行中输入您选择的文件的路径。您应该能够将保存您的值的数据结构更改为您想要的任何内容。如果你需要帮助,我可以为你做。
    • @RedLion:如果您的值在 List 中一起流式传输,而不是使用 Pair 辅助类,您只需更改代码以逐步执行并将奇数值设为“x”甚至重视“y”。应该很容易做到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 2018-02-17
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多