在Java中将.csv转换为.xls

2022-09-04 01:02:15

这里有人知道任何快速,干净的方式将csv文件转换为java中的xls或xlsx文件吗?

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

除了包名称之外,示例代码始终值得赞赏。

非常感谢,

贾斯蒂安

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

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

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 "";
    }
}

答案 1

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

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

柯蒂斯关于POI的建议也是我首先想到的。

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

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


编辑:

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

如果确实如此,那将很糟糕,因为前进的道路将是你

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

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


答案 2

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