代码之家  ›  专栏  ›  技术社区  ›  Diwas

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

  •  0
  • Diwas  · 技术社区  · 7 年前

    这是一个beanshell代码,所以有些东西看起来 对于java开发人员来说很奇怪。emailFileAttachment函数是一个sailpoint API,我正在使用这个工具。我的问题是,我放在地图中的数据被放在excel文件的一行中。我放在地图中的标题(“应用程序,Num_权限”)没有打印在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 回复  |  直到 7 年前
        1
  •  1
  •   Stefan    7 年前

    info 是一个 HashMap 这意味着不能保证您可以按照放入数据的相同顺序提取数据。因此,在CSV文件中,标题“应用程序”可能不在第一位。相反,使用一些维持秩序的东西,例如 ArrayList 属于 Tuple 对象(您自己编写的包含两个字符串变量的类)。

    Util是如何实现的。映射字符串(信息)工作?我们需要看到它,这样我们才能研究换行问题。

        2
  •  1
  •   user3438137    7 年前

    Util。mapToString()只会将映射转换为字符串。 迭代列表以生成字符串。 方法Util。listToCsv()或Util。listToQuotedCsv()将有助于准备csv字符串。

    希望这有帮助。

        3
  •  0
  •   Soumen Mukherjee David F    7 年前

    您应该在与记录迭代相同的循环中使用StringBuilder,然后从StringBuilder制定附件。

    我认为这很有用。MapToString和chashma是根本原因。