TopDev

Xuất file sử dung OpenCSV hay Apache POI, cái nào tối ưu hơn

minhu 📖 10 phút đọc 💬 2 phản hồi

So sánh giữa OpenCSV và Apache POI về tốc độ và hiệu suất phụ thuộc vào nhu cầu cụ thể của bạn khi xuất dữ liệu ra file CSV hoặc Excel. Dưới đây là một số điểm khác biệt chính giữa hai thư viện này:

1. OpenCSV#

  • Định dạng: OpenCSV chuyên dùng để làm việc với file CSV.

  • Tốc độ: Vì CSV là định dạng văn bản thuần túy và không có cấu trúc phức tạp như Excel, OpenCSV thường nhanh hơn khi ghi hoặc đọc dữ liệu lớn.

  • Đơn giản: Sử dụng OpenCSV để tạo file CSV rất đơn giản và yêu cầu ít cấu hình hơn so với Apache POI.

2. Apache POI#

  • Định dạng: Apache POI hỗ trợ các định dạng file của Microsoft Office, bao gồm cả Excel (.xls và .xlsx).

  • Tốc độ: Việc ghi và đọc file Excel với Apache POI có thể chậm hơn so với CSV do cấu trúc phức tạp của file Excel. Tuy nhiên, POI rất mạnh mẽ và linh hoạt, cho phép bạn thực hiện các thao tác phức tạp trên file Excel.

  • Tính năng: Apache POI cung cấp nhiều tính năng mạnh mẽ hơn so với OpenCSV, bao gồm định dạng ô, công thức, biểu đồ, và nhiều hơn nữa.

So sánh hiệu suất cơ bản#

Dưới đây là một ví dụ về cách so sánh tốc độ của hai thư viện khi ghi 500,000 dòng dữ liệu.

Mã sử dụng OpenCSV:

` import com.opencsv.CSVWriter;

import java.io.FileWriter; import java.io.IOException; import java.util.Random;

public class CSVExporter { public static void main(String[] args) { String csvFile = "data.csv"; int numberOfRows = 500000;

    long startTime = System.currentTimeMillis();

    try (CSVWriter writer = new CSVWriter(new FileWriter(csvFile))) {
        String[] header = {"ID", "Name", "Age"};
        writer.writeNext(header);

        Random random = new Random();
        for (int i = 1; i <= numberOfRows; i++) {
            String[] data = {
                String.valueOf(i),
                "Name" + i,
                String.valueOf(random.nextInt(100))
            };
            writer.writeNext(data);
        }
        System.out.println("File CSV đã được tạo thành công!");
    } catch (IOException e) {
        e.printStackTrace();
    }

    long endTime = System.currentTimeMillis();
    System.out.println("OpenCSV runtime: " + (endTime - startTime) + " ms");
}

} `

Mã sử dụng Apache POI:

` import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream; import java.io.IOException; import java.util.Random;

public class ExcelExporter { public static void main(String[] args) { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Demo"); int numberOfRows = 500000;

    long startTime = System.currentTimeMillis();

    // Tạo tiêu đề cột
    Row headerRow = sheet.createRow(0);
    headerRow.createCell(0).setCellValue("ID");
    headerRow.createCell(1).setCellValue("Name");
    headerRow.createCell(2).setCellValue("Age");

    // Tạo dữ liệu mẫu
    Random random = new Random();
    for (int i = 1; i <= numberOfRows; i++) {
        Row row = sheet.createRow(i);
        row.createCell(0).setCellValue(i);
        row.createCell(1).setCellValue("Name" + i);
        row.createCell(2).setCellValue(random.nextInt(100));
    }

    // Xuất file Excel
    try (FileOutputStream outputStream = new FileOutputStream("demo.xlsx")) {
        workbook.write(outputStream);
    } catch (IOException e) {
        e.printStackTrace();
    }

    // Đóng workbook
    try {
        workbook.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    long endTime = System.currentTimeMillis();
    System.out.println("Apache POI runtime: " + (endTime - startTime) + " ms");
}

} `

Kết quả so sánh:#

  • OpenCSV: Sẽ nhanh hơn vì việc ghi file CSV là ghi văn bản thuần túy.

  • Apache POI: Sẽ chậm hơn vì file Excel có cấu trúc phức tạp hơn và yêu cầu nhiều thao tác hơn để tạo.

Kết luận:#

  • Nếu bạn cần tốc độ và chỉ làm việc với dữ liệu văn bản đơn giản, OpenCSV là lựa chọn tốt hơn.

  • Nếu bạn cần các tính năng và định dạng phức tạp của Excel, Apache POI là lựa chọn phù hợp hơn mặc dù sẽ chậm hơn.

Tùy vào nhu cầu cụ thể của bạn mà lựa chọn thư viện phù hợp.

2 phản hồi

  1. minhu #1

    Ngoài OpenCSV và Apache POI, còn có một số thư viện khác hỗ trợ xuất file CSV hoặc Excel một cách nhanh chóng và hiệu quả. Dưới đây là một số thư viện nổi bật:

    1. Super CSV#

    Super CSV là một thư viện Java khác để đọc và ghi file CSV. Nó cung cấp hiệu suất tốt và đơn giản để sử dụng.

    Ví dụ sử dụng Super CSV: <dependency> <groupId>net.sf.supercsv</groupId> <artifactId>super-csv</artifactId> <version>2.4.0</version> </dependency>

    ` import org.supercsv.io.CsvBeanWriter; import org.supercsv.io.ICsvBeanWriter; import org.supercsv.prefs.CsvPreference;

    import java.io.FileWriter; import java.io.IOException; import java.util.Random;

    public class SuperCSVExporter { public static void main(String[] args) { String csvFile = "data_supercsv.csv"; int numberOfRows = 500000;

        long startTime = System.currentTimeMillis();
    
        try (ICsvBeanWriter beanWriter = new CsvBeanWriter(new FileWriter(csvFile), CsvPreference.STANDARD_PREFERENCE)) {
            // Tạo tiêu đề cột
            String[] header = {"ID", "Name", "Age"};
            beanWriter.writeHeader(header);
    
            // Tạo dữ liệu mẫu
            Random random = new Random();
            for (int i = 1; i <= numberOfRows; i++) {
                String[] data = {
                    String.valueOf(i),
                    "Name" + i,
                    String.valueOf(random.nextInt(100))
                };
                beanWriter.write(data, header);
            }
            System.out.println("File CSV đã được tạo thành công!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        long endTime = System.currentTimeMillis();
        System.out.println("SuperCSV runtime: " + (endTime - startTime) + " ms");
    }
    

    } `

    2. FlatBuffers#

    FlatBuffers là một thư viện hiệu suất cao của Google cho việc tuần tự hóa dữ liệu (serialization) có thể được sử dụng để xuất dữ liệu rất nhanh, nhưng không dành riêng cho file CSV hoặc Excel. Nó chủ yếu được sử dụng trong các ứng dụng yêu cầu hiệu suất cao như game.

    3. Jackson CSV#

    Jackson là một thư viện nổi tiếng để xử lý JSON, nhưng nó cũng hỗ trợ CSV thông qua các module mở rộng.

    Ví dụ sử dụng Jackson CSV: <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-csv</artifactId> <version>2.13.3</version> </dependency>

    ` import com.fasterxml.jackson.dataformat.csv.CsvMapper; import com.fasterxml.jackson.dataformat.csv.CsvSchema;

    import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random;

    class Person { public int ID; public String Name; public int Age;

    public Person(int ID, String Name, int Age) {
        this.ID = ID;
        this.Name = Name;
        this.Age = Age;
    }
    

    }

    public class JacksonCSVExporter { public static void main(String[] args) { String csvFile = "data_jackson.csv"; int numberOfRows = 500000;

        long startTime = System.currentTimeMillis();
    
        List<Person> persons = new ArrayList<>();
        Random random = new Random();
        for (int i = 1; i <= numberOfRows; i++) {
            persons.add(new Person(i, "Name" + i, random.nextInt(100)));
        }
    
        CsvMapper mapper = new CsvMapper();
        CsvSchema schema = mapper.schemaFor(Person.class).withHeader();
    
        try {
            mapper.writer(schema).writeValue(new File(csvFile), persons);
            System.out.println("File CSV đã được tạo thành công!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        long endTime = System.currentTimeMillis();
        System.out.println("Jackson CSV runtime: " + (endTime - startTime) + " ms");
    }
    

    } `

    4. JOOQ#

    JOOQ là một thư viện Java để truy vấn SQL, nhưng nó cũng có thể xuất dữ liệu ra file CSV. Đây là một lựa chọn tốt nếu bạn đã sử dụng JOOQ cho các thao tác cơ sở dữ liệu và muốn xuất dữ liệu trực tiếp.

    Ví dụ sử dụng JOOQ: <dependency> <groupId>org.jooq</groupId> <artifactId>jooq</artifactId> <version>3.15.6</version> </dependency>

    ` import org.jooq.lambda.Unchecked; import java.io.FileWriter; import java.io.IOException; import java.util.Random;

    public class JOOQCSVExporter { public static void main(String[] args) { String csvFile = "data_jooq.csv"; int numberOfRows = 500000;

        long startTime = System.currentTimeMillis();
    
        try (FileWriter writer = new FileWriter(csvFile)) {
            // Tạo tiêu đề cột
            writer.append("ID,Name,Age\n");
    
            // Tạo dữ liệu mẫu
            Random random = new Random();
            for (int i = 1; i <= numberOfRows; i++) {
                writer.append(i + ",Name" + i + "," + random.nextInt(100) + "\n");
            }
            System.out.println("File CSV đã được tạo thành công!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        long endTime = System.currentTimeMillis();
        System.out.println("JOOQ CSV runtime: " + (endTime - startTime) + " ms");
    }
    

    } `

    Kết luận#

    Nếu bạn chỉ cần xuất file CSV nhanh chóng và hiệu quả, Super CSVJackson CSV là hai thư viện đáng để xem xét. Chúng cung cấp hiệu suất tốt và dễ dàng sử dụng. FlatBuffers và JOOQ cũng có thể là lựa chọn tùy thuộc vào nhu cầu cụ thể của bạn.

  2. minhu #2

    Khi xuất file với số lượng dòng lớn như 1,000,000 dòng, yếu tố tốc độ và hiệu suất trở nên rất quan trọng. Các thư viện Java được đề cập trước đó như OpenCSV, Apache POI, Super CSV, và Jackson CSV đều có khả năng xử lý số lượng dòng này, nhưng chúng có sự khác biệt về tốc độ và cách sử dụng. Dưới đây là một số gợi ý và so sánh:

    1. OpenCSV#

    OpenCSV là thư viện hiệu quả và dễ sử dụng để xuất file CSV. Với định dạng CSV đơn giản, OpenCSV thường có tốc độ tốt khi xử lý dữ liệu lớn.

    Ví dụ sử dụng OpenCSV: ` import com.opencsv.CSVWriter;

    import java.io.FileWriter; import java.io.IOException; import java.util.Random;

    public class OpenCSVExporter { public static void main(String[] args) { String csvFile = "data_opencsv.csv"; int numberOfRows = 1000000;

        long startTime = System.currentTimeMillis();
    
        try (CSVWriter writer = new CSVWriter(new FileWriter(csvFile))) {
            String[] header = {"ID", "Name", "Age"};
            writer.writeNext(header);
    
            Random random = new Random();
            for (int i = 1; i <= numberOfRows; i++) {
                String[] data = {
                    String.valueOf(i),
                    "Name" + i,
                    String.valueOf(random.nextInt(100))
                };
                writer.writeNext(data);
            }
            System.out.println("File CSV đã được tạo thành công!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        long endTime = System.currentTimeMillis();
        System.out.println("OpenCSV runtime: " + (endTime - startTime) + " ms");
    }
    

    } `

    2. Super CSV#

    Super CSV cũng là một lựa chọn tốt khi làm việc với dữ liệu CSV lớn. Nó cung cấp nhiều tính năng hơn OpenCSV, nhưng tốc độ không chênh lệch nhiều.

    Ví dụ sử dụng Super CSV: ` import org.supercsv.io.CsvBeanWriter; import org.supercsv.io.ICsvBeanWriter; import org.supercsv.prefs.CsvPreference;

    import java.io.FileWriter; import java.io.IOException; import java.util.Random;

    public class SuperCSVExporter { public static void main(String[] args) { String csvFile = "data_supercsv.csv"; int numberOfRows = 1000000;

        long startTime = System.currentTimeMillis();
    
        try (ICsvBeanWriter beanWriter = new CsvBeanWriter(new FileWriter(csvFile), CsvPreference.STANDARD_PREFERENCE)) {
            String[] header = {"ID", "Name", "Age"};
            beanWriter.writeHeader(header);
    
            Random random = new Random();
            for (int i = 1; i <= numberOfRows; i++) {
                String[] data = {
                    String.valueOf(i),
                    "Name" + i,
                    String.valueOf(random.nextInt(100))
                };
                beanWriter.write(data, header);
            }
            System.out.println("File CSV đã được tạo thành công!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        long endTime = System.currentTimeMillis();
        System.out.println("SuperCSV runtime: " + (endTime - startTime) + " ms");
    }
    

    } `

    3. Jackson CSV#

    Jackson CSV có hiệu suất tốt và dễ sử dụng khi xuất file CSV lớn. Nó hỗ trợ việc chuyển đổi đối tượng Java thành CSV một cách dễ dàng.

    Ví dụ sử dụng Jackson CSV: ` import com.fasterxml.jackson.dataformat.csv.CsvMapper; import com.fasterxml.jackson.dataformat.csv.CsvSchema;

    import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random;

    class Person { public int ID; public String Name; public int Age;

    public Person(int ID, String Name, int Age) {
        this.ID = ID;
        this.Name = Name;
        this.Age = Age;
    }
    

    }

    public class JacksonCSVExporter { public static void main(String[] args) { String csvFile = "data_jackson.csv"; int numberOfRows = 1000000;

        long startTime = System.currentTimeMillis();
    
        List<Person> persons = new ArrayList<>();
        Random random = new Random();
        for (int i = 1; i <= numberOfRows; i++) {
            persons.add(new Person(i, "Name" + i, random.nextInt(100)));
        }
    
        CsvMapper mapper = new CsvMapper();
        CsvSchema schema = mapper.schemaFor(Person.class).withHeader();
    
        try {
            mapper.writer(schema).writeValue(new File(csvFile), persons);
            System.out.println("File CSV đã được tạo thành công!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        long endTime = System.currentTimeMillis();
        System.out.println("Jackson CSV runtime: " + (endTime - startTime) + " ms");
    }
    

    } `

    4. Univocity Parsers#

    Univocity Parsers là một thư viện nhanh chóng và mạnh mẽ để xử lý file CSV. Nó cung cấp hiệu suất tốt hơn so với nhiều thư viện khác.

    Ví dụ sử dụng Univocity Parsers: <dependency> <groupId>com.univocity</groupId> <artifactId>univocity-parsers</artifactId> <version>2.9.1</version> </dependency>

    ` import com.univocity.parsers.csv.CsvWriter; import com.univocity.parsers.csv.CsvWriterSettings;

    import java.io.FileWriter; import java.io.IOException; import java.util.Random;

    public class UnivocityCSVExporter { public static void main(String[] args) { String csvFile = "data_univocity.csv"; int numberOfRows = 1000000;

        long startTime = System.currentTimeMillis();
    
        CsvWriterSettings settings = new CsvWriterSettings();
        try (CsvWriter writer = new CsvWriter(new FileWriter(csvFile), settings)) {
            writer.writeHeaders("ID", "Name", "Age");
    
            Random random = new Random();
            for (int i = 1; i <= numberOfRows; i++) {
                writer.writeRow(i, "Name" + i, random.nextInt(100));
            }
            System.out.println("File CSV đã được tạo thành công!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        long endTime = System.currentTimeMillis();
        System.out.println("Univocity CSV runtime: " + (endTime - startTime) + " ms");
    }
    

    } `

    Kết luận#

    • OpenCSV và Super CSV: Đơn giản và hiệu quả cho việc xuất file CSV lớn.

    • Jackson CSV: Tiện lợi cho việc chuyển đổi đối tượng Java thành CSV.

    • Univocity Parsers: Cung cấp hiệu suất tốt nhất khi xử lý file CSV lớn.

    Nếu mục tiêu chính của bạn là tốc độ, Univocity Parsers thường là lựa chọn tốt nhất. Tuy nhiên, nếu bạn đã quen thuộc với một thư viện cụ thể và nó đáp ứng đủ nhu cầu của bạn, bạn có thể tiếp tục sử dụng thư viện đó.

Bài liên quan trong #Java

✓ Đã sao chép link