14

这里有没有人知道在java中将csv文件转换为xls或xlsx文件的任何快速、干净的方法?

我有一些东西可以管理已经到位的 csv 文件,我需要其他程序的额外兼容性。

除了包名称之外的示例代码总是很受欢迎。

非常感谢,

贾斯蒂安

到目前为止,这是我的代码。我需要从行中删除返回(“\n”)。我的一些单元格包含多行信息(一个列表),因此我可以在 csv 中使用“\n”来表示一个单元格中的多行,但 xls 将这些视为我的意思是将它们放在一个新上。

代码是从网上修改的,目前有点乱。您可能会注意到一些不推荐使用的方法,因为它是在 2004 年编写的,并且一定要忽略可怕的 return 语句。我现在只是使用 Sop 进行测试,稍后我会清理它。

package jab.jm.io;

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;

public class FileConverter {

    public static String ConvertCSVToXLS(String file) throws IOException {

        if (file.indexOf(".csv") < 0)
            return "Error converting file: .csv file not given.";

        String name = FileManager.getFileNameFromPath(file, false);
        ArrayList<ArrayList<String>> arList = new ArrayList<ArrayList<String>>();
        ArrayList<String> al = null;

        String thisLine;
        DataInputStream myInput = new DataInputStream(new FileInputStream(file));

        while ((thisLine = myInput.readLine()) != null) {
            al = new ArrayList<String>();
            String strar[] = thisLine.split(",");

            for (int j = 0; j < strar.length; j++) {
                // My Attempt (BELOW)
                String edit = strar[j].replace('\n', ' ');
                al.add(edit);
            }

            arList.add(al);
            System.out.println();
        }

        try {
            HSSFWorkbook hwb = new HSSFWorkbook();
            HSSFSheet sheet = hwb.createSheet("new sheet");

            for (int k = 0; k < arList.size(); k++) {
                ArrayList<String> ardata = (ArrayList<String>) arList.get(k);
                HSSFRow row = sheet.createRow((short) 0 + k);

                for (int p = 0; p < ardata.size(); p++) {
                    System.out.print(ardata.get(p));
                    HSSFCell cell = row.createCell((short) p);
                    cell.setCellValue(ardata.get(p).toString());
                }
            }

            FileOutputStream fileOut = new FileOutputStream(
                    FileManager.getCleanPath() + "/converted files/" + name
                            + ".xls");
            hwb.write(fileOut);
            fileOut.close();

            System.out.println(name + ".xls has been generated");
        } catch (Exception ex) {
        }

        return "";
    }
}
4

6 回答 6

9

不知道你是否已经知道了,但是:

  • Excel(如果那是您的真正目标)可以轻松地.csv直接读取文件,因此您所做的任何转换都只是对您不太“有天赋”的用户的礼貌。
  • CSV 是最低公分母格式。任何转换器都不太可能将信息添加到.csv文件中的信息以使其更有用。换句话说,CSV 是一种“哑”格式,将其转换为.xls(可能)会增加文件大小,但不会使格式更智能。

Curtis 对 POI 的建议也是我首先想到的。

如果您在 Windows 机器上进行此转换,另一种选择可能是Jacob,这是一个 Java-COM 桥,可让您从 Java 程序有效地远程控制 Excel,以便执行诸如打开文件并保存在不同的格式,甚至可能应用一些格式更改等。

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


编辑:

在我看来,它readLine()已经没有给你整行了。如何知道回车不是行终止符?您应该能够在 readLine() 之后使用调试打印语句来验证这一点。

如果确实如此,那就糟透了,因为前进的方向是你

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

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

于 2010-07-06T19:14:21.260 回答
7

如果您想在 Java 中读取或写入 XLS 或 XLSX 文件,Apache POI 是一个不错的选择: http: //poi.apache.org/

于 2010-07-06T18:57:51.207 回答
7

复制粘贴下面的程序,我运行了这个程序,它运行良好,如果你对这个程序有任何疑虑,请告诉我。(你需要 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
    }
}
于 2014-07-22T13:57:04.977 回答
2

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

于 2013-06-11T19:54:39.180 回答
0

你写了:

我有一些东西可以管理已经到位的 csv 文件,我需要其他程序的额外兼容性。

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

于 2010-07-06T19:26:32.827 回答
0

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

于 2014-07-11T07:27:57.993 回答