由java代码创建的csv将所有数据写入同一行

时间:2017-10-05 14:32:22

标签: java beanshell sailpoint

这是一个beanhell代码,所以可能会有一些东西 对java开发者来说很奇怪。 emailFileAttachment函数是一个sailpoint API,我正在使用的工具。我的问题是我放在我的地图中的数据被放在excel文件中的一行中。我放在地图中的标题(“Application,Num_entitlement”)不会在CSV文件的第一行打印。有谁可以帮助我。这是我的代码:

import sailpoint.object.Application;
import sailpoint.object.Identity;
import java.sql.Connection;
import java.sql.PreparedStatement;
import javax.sql.DataSource;
import java.sql.SQLException;
import sailpoint.server.Environment;
import javax.sql.DataSource;
import java.sql.ResultSet;
import sailpoint.api.SailPointContext;
import java.io.BufferedWriter;
import java.io.IOExceptoin;
import java.io.FileWriter;
import sailpoint.object.EmailTemplate;
import sailpoint.object.EmailOptions;
import java.io.File;
import java.io.FileInputStream;
import sailpoint.object.EmailFileAttachment;
import java.util.HashMap;
import sailpoint.tools.Util;

    String query = "SELECT app.name as application, count(*) as num_entitlements FROM spt_application as app, spt_identity_entitlement as ent WHERE app.id = ent.application GROUP BY app.name"; 
    HashMap info = new HashMap();
    info.put("Application ", "Num_Entitlement");
    PreparedStatement getEntitlement_Num = null;
    Connection conn = null;
    /*
    public static byte[] readFiletoByteArray(File file)   
        {      
            FileInputStream fileInputStream = null;      
            byte[] byteFile = new byte[(int) file.length()];      
            try      
            {              
                fileInputStream = new FileInputStream(file);         
                fileInputStream.read(byteFile);         
                fileInputStream.close();         
            }      
            catch (Exception e)      
            {         
                e.printStackTrace();      
            }      
            return byteFile;   
        } 
    */

    try{
        // Prepared Statements 
        Environment e = Environment.getEnvironment();
        DataSource src = e.getSpringDataSource();
        //System.out.println("DataSource: " + src.toString());
        conn = src.getConnection();
        //System.out.println("Connection: " + conn);
        getEntitlement_Num = conn.prepareStatement(query);
        ResultSet rs = getEntitlement_Num.executeQuery();
        //System.out.println("starting RS");
        while(rs.next()) {
                String appName = rs.getString("application");
                int no_ent = rs.getInt("num_entitlements");
                info.put(appName , no_ent); 
            }
                System.out.println("finished RS");
        }catch(SQLException e){
            log.error( e.toString());
        }  finally {
            if (getEntitlement_Num!= null) { 
                getEntitlement_Num.close(); 
            }
            if(conn != null) {
                conn.close();
               }
            } 
        //I am using sailpoint APIs for the code below. 
                    String emailDest = "//email address here";
        EmailTemplate et = new EmailTemplate();
        et.setFrom("//email address here");
        et.setBody("Please find an attached CSV file that has the list of all applications in IIQ and their number of Entitlements");
        et.setTo(emailDest);
        et.setSubject("Entitlement count for each application in IIQ");
        EmailOptions ops = new EmailOptions(emailDest,null);
        String strInfo = Util.mapToString(info);
        byte[] fileData = strInfo.getBytes();
        EmailFileAttachment attachment = new EmailFileAttachment( "EntitlementCount.csv", EmailFileAttachment.MimeType.MIME_CSV, fileData );
        ops.addAttachment(attachment);
        context.sendEmailNotification(et, ops);
        //System.out.println("email sent");
        return "Success";

3 个答案:

答案 0 :(得分:1)

infoHashMap,这意味着无法保证您可以按照相同的顺序提取数据。因此,您的标题“应用”可能不会出现在CSV文件中。相反,使用维护顺序的东西,例如ArrayListTuple个对象(你自己编写的一个包含两个String变量的类)。

Util.mapToString(info)如何工作?我们需要这样看,以便我们调查换行问题。

答案 1 :(得分:0)

您应该在与记录迭代相同的循环中使用StringBuilder,然后从“字符串”构建器中制定附件。

我认为带有chashma的Utility.MapToString是根本原因。

答案 2 :(得分:0)

Util.mapToString()只会将地图转换为字符串。 尝试将您的收藏更改为列表{app,count}和 迭代列表以生成字符串。 方法Util.listToCsv()或Util.listToQuotedCsv()将有助于准备csv字符串。

希望这有帮助。