簡體   English   中英

有沒有辦法使用OpenCSV將對象列表導出到Java中的.CSV?

[英]Is there a way to export List of objects to .CSV in Java using OpenCSV?

我嘗試使用OpenCSV在 Java 中生成 a.csv 文件。 我想在沒有硬編碼的情況下生成結果。

我有一個具有以下字段的實體:Id、Title、Overview 等。在電影列表中,我存儲數據庫中的所有數據。

我想在.csv 中寫這個列表,而不告訴標題或其他東西。

例子。

...writeToCSV(Movie.class)不是 writeToCSV(“ID”、“標題”等)

第一步,我使用了 Apache POI,但他不能正常工作。

@Slf4j
@Setter
@NoArgsConstructor
public class CSVHelper {
    private CSVFormat csvFormat;
    private PrintWriter printWriter;
    private CSVPrinter csvPrinter;


    public void writeHeader(Class<?> c) {
        List<String> headers = getHeaders(c);
        try {
            setCsvPrinter(new CSVPrinter(printWriter, csvFormat));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        headers.forEach(header -> {
            try {
                csvPrinter.print(header);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        });
    }

    public void writeToCsv(List<?> list, Class<?> c) {
        writeHeader(c);
        List<String> headers = getHeaders(c);
        try {
            setCsvPrinter(new CSVPrinter(printWriter, csvFormat));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        list.forEach(o -> {
            try {
                csvPrinter.println();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            headers.forEach(header -> {
                try {
                    Method method = c.getMethod("get" + header.substring(0, 1).toUpperCase() + header.substring(1));
                    String value = String.valueOf(method.invoke(o));
                    csvPrinter.print(value);

                } catch (Exception e) {
                    throw new RuntimeException(e);
                }
            });
        });
    }

    private static List<String> getHeaders(Class<?> c) {
        List<Field> fields = List.of(c.getDeclaredFields());
        return fields.stream().map(Field::getName).collect(Collectors.toList());
    }
}

我喜歡直接使用 object 方法,無需我提供任何代碼。 此代碼正在運行,但對實體的任何更改都不起作用。

從文檔中:

在大多數情況下,編寫 CSV 文件的最簡單方法是 StatefulBeanToCsv,它最容易使用 StatefulBeanToCsvBuilder 創建,因此命名是因為曾經有一個 BeanToCsv。謝天謝地,沒有更多了。

 // List<MyBean> beans comes from somewhere earlier in your code.
 Writer writer = new FileWriter("yourfile.csv");
 StatefulBeanToCsv beanToCsv = new StatefulBeanToCsvBuilder(writer).build();
 beanToCsv.write(beans);
 writer.close();

來源: http://opencsv.sourceforge.net/#writing_from_a_list_of_beans

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM