当前位置: 首页 > 面试题库 >

带列标题的StatefulBeanToCsv

欧阳乐生
2023-03-14
问题内容

我正在opencsv-4.0编写一个csv文件,我需要在输出文件中添加列标题。

这是我的代码。

public static void buildProductCsv(final List<Product> product,
        final String filePath) {

    try {

        Writer writer = new FileWriter(filePath);

        // mapping of columns with their positions
        ColumnPositionMappingStrategy<Product> mappingStrategy = new ColumnPositionMappingStrategy<Product>();
        // Set mappingStrategy type to Product Type
        mappingStrategy.setType(Product.class);
        // Fields in Product Bean
        String[] columns = new String[] { "productCode", "MFD", "EXD" };
        // Setting the colums for mappingStrategy
        mappingStrategy.setColumnMapping(columns);

        StatefulBeanToCsvBuilder<Product> builder = new StatefulBeanToCsvBuilder<Product>(writer);

        StatefulBeanToCsv<Product> beanWriter = builder.withMappingStrategy(mappingStrategy).build();
        // Writing data to csv file
        beanWriter.write(product);
        writer.close();

        log.info("Your csv file has been generated!");

    } catch (Exception ex) {
        log.warning("Exception: " + ex.getMessage());
    }

}

上面的代码用数据创建一个csv文件。但该文件中不包括列标题。

如何添加列标题以输出csv?


问题答案:

ColumnPositionMappingStrategy#generateHeader返回空数组

/**
 * This method returns an empty array.
 * The column position mapping strategy assumes that there is no header, and
 * thus it also does not write one, accordingly.
 * @return An empty array
 */
@Override
public String[] generateHeader() {
    return new String[0];
}

如果从BeanToCsv构建器中删除MappingStrategy

// replace 
StatefulBeanToCsv<Product> beanWriter = builder.withMappingStrategy(mappingStrategy).build();
// with
StatefulBeanToCsv<Product> beanWriter = builder.build();

它将产品的类成员写为CSV标头

如果您的产品类成员名称是

"productCode", "MFD", "EXD"

这应该是正确的解决方案

否则,添加@CsvBindByName批注

import com.opencsv.bean.CsvBindByName;
import com.opencsv.bean.StatefulBeanToCsv;
import com.opencsv.bean.StatefulBeanToCsvBuilder;

import java.io.FileWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

public class CsvTest {

    public static void main(String[] args) throws Exception {
        Writer writer = new FileWriter(fileName);

        StatefulBeanToCsvBuilder<Product> builder = new StatefulBeanToCsvBuilder<>(writer);
        StatefulBeanToCsv<Product> beanWriter = builder.build();

        List<Product> products = new ArrayList<>();
        products.add(new Product("1", "11", "111"));
        products.add(new Product("2", "22", "222"));
        products.add(new Product("3", "33", "333"));
        beanWriter.write(products);
        writer.close();
    }

    public static class Product {
        @CsvBindByName(column = "productCode")
        String id;
        @CsvBindByName(column = "MFD")
        String member2;
        @CsvBindByName(column = "EXD")
        String member3;

        Product(String id, String member2, String member3) {
            this.id = id;
            this.member2 = member2;
            this.member3 = member3;
        }

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String getMember2() {
            return member2;
        }

        public void setMember2(String member2) {
            this.member2 = member2;
        }

        public String getMember3() {
            return member3;
        }

        public void setMember3(String member3) {
            this.member3 = member3;
        }
    }

}

输出:

“ EXD”,“ MFD”,“ PRODUCTCODE”

“ 111”,“ 11”,“ 1”

“ 222”,“ 22”,“ 2”

“ 333”,“ 33”,“ 3”

请注意; 班级,由于OpenCSV库使用了Reflection,所以getter和setter程序需要公开



 类似资料:
  • 我有一个有多个列的数据框。我想遍历这些列,计算每列有多少空值,并生成一个新的数据框,在列标题名称旁边显示值的总和。 如果我这样做: 我得到每个列的空计数列表: 我想做的是创建一个新的数据帧,它的列标题和空计数并列,例如。

  • 我有以下代码。当我保存它的时候。列的标题不保存。你能给我指路吗?

  • 我正在我的flutter应用程序中实现一个DraggableScrollableSheet,并希望有一个粘性头,即只有列表视图滚动,工作表的顶部部分始终保持不变。我的小部件如下所示: 基本功能可以工作,但是,只有在拖动/滚动列表视图项时,工作表才是可拖动和可滚动的。我需要做什么更改来使列中的其他小部件也是可滚动的。我尝试了滚动和拖动小部件没有解决方案。 感谢任何帮助。

  • 问题内容: 我如何使用pandas读取.csv文件(无标题),并且只希望使用列的子集(比如说20列中的第4和第7列)?我似乎无法做 问题答案: 为了读取其中没有标题的csv,仅对于某些列,您需要传递params以及第4列和第7列: 查看文档

  • 本文向大家介绍twitter-bootstrap 带标题面板,包括了twitter-bootstrap 带标题面板的使用技巧和注意事项,需要的朋友参考一下 示例 使用轻松将标题容器添加到面板中.panel-heading。您也可以<h1>-<h6>在.panel-title类中添加任何内容以添加预样式的标题。但是,的字体大小<h1>-<h6>被覆盖.panel-heading。 为使链接颜色正确,