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

我已经可以管理CSV文件,并且需要其他程序的额外兼容性。

除了程序包名称外,示例代码始终受到人们的赞赏。

非常感谢,

贾斯汀

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

该代码是从互联网上修改的,目前有点困惑。您可能会注意到一些过时的方法(如2004年编写的),请确保忽略可怕的return语句。我目前仅使用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 "";
    }
}

最佳答案

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

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

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

    如果您是在Windows计算机上进行此转换,则另一种选择可能是Jacob,它是Java-COM桥,可让您从Java程序有效地远程控制Excel,以执行打开文件并保存到其他文件中格式,甚至可以应用一些格式更改等。

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

    编辑:

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

    如果确实如此,那会很烂,因为前进的道路将是您
  • 要么识别不完整的行,然后将它们粘贴到一起
  • 或编写您自己的替代readLine()。一种简单的方法是逐字符读取字符,替换CSV字符串中的CR,并在StringBuilder中累积文本,直到您感觉到完整的一行为止。

  • 这两种选择都是您可能不希望看到的工作。

    关于java - 在Java中将.csv转换为.xls,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3189308/

    10-12 00:05
    查看更多