zoukankan      html  css  js  c++  java
  • 【java】opencsv导出csv之后的数字格式问题解决

    问题:某列其实你用记事本打开还是0001, 但是用excel打开是1,而且长数字比如身份证之类的,会变成十六位科学计算法,搞得很难看,而且csv的字符串左对齐,数字右对齐对于某些领导来说是不被看好的,所以如下文字解决此状况。opencsv导出csv之后的数字0消失的格式问题解决。


    解决办法有两种: 
       1、在生成csv的时候,在数字的前面或后面加上"\t"制表符,再用excel打开问题解决!如 “1234567890”

       2、在生成csv的时候,在数字的前面加上"=",再用excel打开问题解决!如 ="9876543210",=“1234567890”,

      3 、对于EXCEL文件, 在禁止转义的内容前,加上一个半角单引号,' 符号

    例子:

    //测试

    public  void writeCsvWithRs (CsvHead head, CsvTitle title, ResultSet rs, String fname) throws IOException {

        File tempFile = new File (fname);

        CSVWriter writer = new CSVWriter (new FileWriter (tempFile) );

        CsvField[] csvFields = null;

        String[] titles = null;


        try {

            if (head != null) {

                writer.writeNext (new String[] { head.getCompanyName() }); //公司号

                writer.writeNext (new String[] { head.getDocDescription() }); //当前文档名

            }


            if (title != null) { //对传入的title做空值处理,表头

                csvFields = title.getcsvFields();

                titles = new String[csvFields.length];//这是我自己实现的逻辑,你可以不加这个


                for (int i = 0, j = csvFields.length; i < j; i++) {

                    titles[i] = csvFields[i].getDescription();//获得描述

                }


                writer.writeNext ( (titles) ); //表头字段

            }

            writer.writeAll ( rsToList (rs) ); //数据体

            writer.close();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    /**

    *  rsToList (rs) 将结果集转成一个list<String[]> 

    */

    public List<String[]> rsToList (ResultSet rs) {

        List<String> fields = null;//每一行

        List<String[]> x = new ArrayList<String[]>();//存放每一行的总list,里面有N行

        ResultSetMetaData rsmd;


        try {

            rsmd = rs.getMetaData();//rsmd你懂的

            int columnCount = rsmd.getColumnCount();  //拿到多少列


            // 输出数据   列的值

            while (rs.next() ) {

                fields = new ArrayList<String>();//rs的每一行结果集 生成一个list


                for (int i = 1; i <= columnCount; i++) {

                    fields.add ("\t" + rs.getString (i) ); //把一行数据放入list,前面加入 \t 

                }


              String[] fidldSt = (String[]) fields.toArray (new String[fields.size()]);//将list转成数组,方便写入csv

              x.add (fidldSt);//加入总list中

            }


        } catch (SQLException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }


        return x;//将存放所有数据行rs转化成String[]的x返回上去

    }


    ps : 另,今天老领导要求需要对csv里面的数据进行求和等二次处理,那么对于这种压榨程序员的工作,我们唯一的办法还是满足他们。。讲一下处理思路,对于这种csv还需要计算数字列,就要采取在数据库里面设置一个标志位是否是数字,isNumber 设置为true的话,就不处理,前面不加"\t",如果不是数字列,那么就是文本列,不需要参与计算,就处理一下,前面加"\t",程序如下:

     public List<String[]> rsToList(ResultSet rs, CsvField[] csvFields) {
            List<String> fields = null;
            List<String[]> x = new ArrayList<String[]>();
            ResultSetMetaData rsmd;
            try {
                rsmd = rs.getMetaData();
                int columnCount = rsmd.getColumnCount(); // 拿到多少列
                // 输出列名
                // for (int i=1; i<=columnCount; i++){
                // System.out.print(rsmd.getColumnName(i)); //拿到列名,属性
                // System.out.print("(" + rsmd.getColumnTypeName(i) +
                // ")");//拿到对应的列的type
                // }
                // System.out.println();
                // 输出数据 列的值
                while (rs.next()) {
                    fields = new ArrayList<String>();
                    for (int i = 1; i <= columnCount; i++) {
                        log.info("csvFields[i].isNumber() = " + csvFields[i-1].isNumber());//数组从0开始读,rs从1开始的,所以 i-1 
                        String data = rs.getString(i)==null?"":rs.getString(i);//空值处理
                        if(csvFields[i-1].isNumber()){//自己从数据库设置的字段判断是否数字列
                            fields.add(data);
                        }
                        else{
                            fields.add("\t"+data);// 把一行数据放入list
                        }
                        // System.out.print(rs.getString(i) + " | ");
                    }
                    // System.out.println("fields.size() = "+fields.size());
                    String[] fidldSt = (String[]) fields.toArray(new String[fields.size()]);
                    x.add(fidldSt);
                    // System.out.println();
                }
                /*
                 * for(int i=0;i<x.size();i++){ for(int j=0;j<
                 * x.get(i).size();j++){ // System.out.println(x.get(i).get(j)); }
                 * System.out.println(" "); }
                 */

            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return x;

        }


     

    效果图:




    不知道怎么搞的就联系我 

    ---------------------------------------------------

    qq 394263788 


    专业java报表开发

  • 相关阅读:
    【WebSocket】Qt客户端
    【WebSocket】入门教程(JS)
    【C++ 压缩&解压缩 开源库】ZIP入门使用总结
    【C++ JSON 开源库】nlohmann入门使用总结
    OSS C++ SDK使用总结
    解决Element中table文字过多换行问题
    Xmind安装报错
    Object.assign()
    mousedown、mouseup、click
    el-table 动态控制表格高度
  • 原文地址:https://www.cnblogs.com/ae6623/p/4416629.html
Copyright © 2011-2022 走看看