在Java中将.csv转换为.xls

时间:2010-07-06 18:55:45

标签: java csv xls xlsx

6 个答案:

答案 0 :(得分:7)

不知道你是否已经知道这一点,但是:

  • Excel(如果这是你真正的目标)可以轻松直接阅读.csv个文件,所以你所做的任何转换只会对你那个不那么“有天赋”的用户有礼貌。
  • CSV是最常见的分母格式。任何转换器都不可能向.csv文件中添加的信息添加信息,这将使其更有用。换句话说,CSV是一种“哑”格式,将其转换为.xls将(可能)增加文件大小,但不会使格式变得更聪明。

柯蒂斯对POI的建议也是我想到的第一件事。

如果你在Windows机器上进行这种转换,另一个替代方案可能是Jacob,这是一个Java-COM桥,它允许你从Java程序中有效地远程控制Excel,以便做一些像开放的事情一个文件并以不同的格式保存,甚至可能应用一些格式更改等。

最后,我在通过JDBC-ODBC桥访问的Excel工作表中将SQL INSERT(通过JDBC)取得了一些成功。即ODBC可以使Excel文件看起来像数据库。但它不是很灵活,你不能要求DB创建任意命名的.XLS文件。


编辑:

在我看来readLine()已经没有给你全部了。怎么知道回车不是线路终结者?您应该能够在readLine()之后使用debug print语句验证这一点。

如果确实如此,它会很糟糕,因为前进的方向是

  • 识别不完整的行并在事后将它们粘贴在一起,
  • 或编写自己的readLine()替代品。一个简单的方法是逐个字符地读取,替换CSV字符串中的CR并在StringBuilder中累积文本,直到您觉得有完整的行。

这两种选择都是你可能不期待的工作。

答案 1 :(得分:5)

答案 2 :(得分:4)

复制粘贴下面的程序,我运行程序,它运行正常,如果您对此程序有任何疑虑,请告诉我。(您需要Apache POI Jar来运行此程序)

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;


public class CSVToExcelConverter {

    public static void main(String args[]) throws IOException
    {
        ArrayList arList=null;
        ArrayList al=null;
        String fName = "test.csv";
        String thisLine;
        int count=0;
        FileInputStream fis = new FileInputStream(fName);
        DataInputStream myInput = new DataInputStream(fis);
        int i=0;
        arList = new ArrayList();
        while ((thisLine = myInput.readLine()) != null)
        {
            al = new ArrayList();
            String strar[] = thisLine.split(",");
            for(int j=0;j<strar.length;j++)
            {
                al.add(strar[j]);
            }
            arList.add(al);
            System.out.println();
            i++;
        }

        try
        {
            HSSFWorkbook hwb = new HSSFWorkbook();
            HSSFSheet sheet = hwb.createSheet("new sheet");
            for(int k=0;k<arList.size();k++)
            {
                ArrayList ardata = (ArrayList)arList.get(k);
                HSSFRow row = sheet.createRow((short) 0+k);
                for(int p=0;p<ardata.size();p++)
                {
                    HSSFCell cell = row.createCell((short) p);
                    String data = ardata.get(p).toString();
                    if(data.startsWith("=")){
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        data=data.replaceAll("\"", "");
                        data=data.replaceAll("=", "");
                        cell.setCellValue(data);
                    }else if(data.startsWith("\"")){
                        data=data.replaceAll("\"", "");
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                        cell.setCellValue(data);
                    }else{
                        data=data.replaceAll("\"", "");
                        cell.setCellType(Cell.CELL_TYPE_NUMERIC);
                        cell.setCellValue(data);
                    }
                    //*/
                    // cell.setCellValue(ardata.get(p).toString());
                }
                System.out.println();
            }
            FileOutputStream fileOut = new FileOutputStream("test.xls");
            hwb.write(fileOut);
            fileOut.close();
            System.out.println("Your excel file has been generated");
        } catch ( Exception ex ) {
            ex.printStackTrace();
        } //main method ends
    }
}

答案 3 :(得分:1)

Excel中的工具不足以满足OP的要求。他在那里正确的轨道。 Excel无法将多个CSV文件导入同一文件中的不同工作表,这就是您希望在代码中执行此操作的原因。我的建议是使用OpenCSV读取CSV,因为它可以自动纠正数据和缺失列中的换行符,并且它是免费和开源的。它实际上非常非常强大,可以处理各种不同的非标准CSV文件。

答案 4 :(得分:0)

您写道:

  

我有办法管理csv文件   已经到位,我需要额外的   其他程序的兼容性。

那些其他节目是什么?他们是需要通过Excel文件访问您的数据,还是可以使用JDBC或ODBC连接到数据库?使用数据库作为中心位置,您可以根据需要将数据提取为CSV文件或其他格式。

答案 5 :(得分:0)

我创建了一个名为csv2xls的小软件。它需要Java。