如何使用Java基于CSV文件创建Excel文件?

7

我有一个需求,需要使用Java基于CSV文件创建XLS文件。

请建议我使用哪个API来创建Excel文件。

谢谢

5个回答

25
我建议您使用Apache POI框架(特别是HSSF / XSSF API)来编写XLS文件。
对于读取CSV文件,我建议您使用OpenCSV,因为它会为您处理转义字符等问题。
此处的POI示例和此处的OpenCSV示例组合在一起,即可得到以下内容:
import java.io.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import au.com.bytecode.opencsv.CSVReader;

class Test {
    public static void main(String[] args) throws IOException {
        Workbook wb = new HSSFWorkbook();
        CreationHelper helper = wb.getCreationHelper();
        Sheet sheet = wb.createSheet("new sheet");

        CSVReader reader = new CSVReader(new FileReader("data.csv"));
        String[] line;
        int r = 0;
        while ((line = reader.readNext()) != null) {
            Row row = sheet.createRow((short) r++);

            for (int i = 0; i < line.length; i++)
                row.createCell(i)
                   .setCellValue(helper.createRichTextString(line[i]));
        }

        // Write the output to a file
        FileOutputStream fileOut = new FileOutputStream("workbook.xls");
        wb.write(fileOut);
        fileOut.close();
    }
}

enter image description here enter image description here


2
当你的CSV文件超过10万行时,使用这种方法会非常慢。 - whd
以上代码可以运行,但是数字列显示了一些消息“单元格中的数字格式为文本”,日期列也从4/25/2022更改为04-25-2022。请问有人可以帮忙吗? - Prashant Naik

6

Apache POI 是一个库,可以处理各种 Microsoft Office 文档,包括 MS Excel。您可以使用简单的 Java 代码读取 CSV 文件的内容,并使用该库创建和保存 MS Excel 文档。


1

0
使用Groovy,我会这样做:
// groovy to generate large csv file
def GROOVY_HOME = new File( System.getenv('GROOVY_HOME') )
if ( !GROOVY_HOME.canRead() ) {
  println( "Missing environment variable GROOVY_HOME: '${GROOVY_HOME}'" )
  System.exit(0)
}

File file = new File("csv.csv")
if ( file.exists() ) {
    assert file.delete()
    assert file.createNewFile()
}

boolean append = true
FileWriter fileWriter = new FileWriter(file, append)
BufferedWriter buffWriter = new BufferedWriter(fileWriter)

buffWriter.write "sdiType=ReferenceValue,,,\n"
buffWriter.write "ListName,ListStartDate,Value,ValueStartDate\n"
println( "Writing to file 'csv.csv'" )

def y = 5000
while ( y-- > 0 ) {
    buffWriter.write "test" + y + ",1/1/2001,2008,1/1/2001\n"
}

buffWriter.flush()
buffWriter.close()

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接