2010-08-15 9 views
1

J'ai une hashMap en Java en termes de clés que chaque clé indique un flux. Ensuite, chaque valeur indiquant la statique de chaque paquet appartient à ce flux.Création d'un fichier CSV dans Java à partir d'un HashMap

Ce que je dois faire est de dessiner des graphiques pour chaque flux basé sur ces valeurs. par exemple:

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

J'ai besoin de créer un fichier CSV qui peut ensuite être lu à partir de MS Excel. Quelqu'un peut-il avoir l'idée de me donner des indices s'il vous plaît?

Modifié: voici mon 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); 


    } 

Répondre

2

Vous pouvez utiliser de suivre des API.

POI: http://poi.apache.org

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

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

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

Après est ÉCRITURE à l'aide csv example supercsv api:

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

également les questions realted sur stackoverflow se trouvent:

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

CSV API for Java

+0

merci. Je suis si confus, en lisant les liens que vous avez suggérés. Je vais regarder le code que vous avez fourni maintenant. –

+0

@Red Lion Ya il y a trop d'options pour écrire en CSV. Pour les cas simples comme le vôtre, vous pouvez utiliser n'importe lequel d'entre eux sans aucun problème :). – YoK

+0

pouvez-vous s'il vous plaît regarder mon code, j'ai édité mon poste. –

2

Si vous voulez vraiment un fichier Excel, la meilleure bibliothèque pour créer un est Andy Khan's JExcel.

Je pense que vous auriez besoin d'une feuille de calcul par flux, avec des paires .csv pour chacun, triées par temps.

Si ce sont des graphiques d'une variable en fonction du temps, le "temps" ne serait-il pas la première valeur de chaque paire?

Voici comment je le ferais. Cela fonctionne parfaitement pour le cas de test simple que j'ai fourni - c'est le code de travail que vous pourrez étendre.

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

oui, exactement. J'ai besoin d'une feuille pour chaque flux. Je peux changer la commande ce n'est pas difficile du tout. –

+0

tout d'abord merci beaucoup. Deuxièmement, comment puis-je voir la sortie de ce programme dans Excel? –

+0

@ duffymo: mes valeurs sont arrayList et par cette carte mes valeurs devraient être doubles [] []. –

Questions connexes