java中生成了一个csv文件,通过excel打开csv,数据没有分列,如何在就java语言里实现。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中生成了一个csv文件,通过excel打开csv,数据没有分列,如何在就java语言里实现。相关的知识,希望对你有一定的参考价值。

ps:csv中数据以“,”作为分割,不要在excel里面进行分列的操作,我需要生成的csv打开后自动分好列。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;

/**
 * CSV文件示例程序
 * @version 1.0 2014/10/30
 */
public class CsvFileCreator 
    public static void main(String[] args) 
        CsvFileCreator example = new CsvFileCreator();
        example.createCsv();
    
    
    /**
     * 创建CSV文件
     */
    public void createCsv()
        //换行符
        final String NEW_LINE = "\\n";
        //文件名称
        String fileName = "D:\\\\MyCsv.csv";
        
        try 
            //标题头
            String title = "序号,姓名,年龄,身高";
            
            StringBuilder csvStr = new StringBuilder();
            csvStr.append(title).append(NEW_LINE);
            
            //数据行
            for(String csvData : getCsvRows())
                csvStr.append(csvData).append(NEW_LINE);
            
            
            //写文件
            Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(fileName)), "GB2312"));
            writer.write(csvStr.toString());
            writer.flush();
            writer.close();
            
         catch (Exception e) 
            e.printStackTrace();
        
        
    
    
    /**
     * 获取CSV行数据,各个值之间使用英文逗号分隔
     * @return List<String>
     */
    private List<String> getCsvRows()
        List<String> result = new ArrayList<String>();
        result.add("1,Mr Zhang,20,170");
        result.add("2,Mrs Wang,18,175");
        result.add("3,Li,30,178");
        result.add("4,Zhao,19,175");
        result.add("5,Ms Feng,18,165");
        return result;
    

参考技术A 字段之间用“,”分隔即可。注意是英文的逗号。追问

能写个关键部分的代码给我看看么,学习一下

参考技术B 用制表符分更好吧?

通过 Excel 使用 UTF-8 BOM 打开 CSV

【中文标题】通过 Excel 使用 UTF-8 BOM 打开 CSV【英文标题】:Opening CSV with UTF-8 BOM via Excel 【发布时间】:2013-12-15 01:01:45 【问题描述】:

我通过java创建带有数据的csv文件。我遇到了以下众所周知的问题:葡萄牙语中的字母在 Excel 中以错误的方式显示(双击打开时)。

我通过 UTF-16LE+BOM 解决了这个问题,但 excel 开始将制表符识别为列分隔符而不是逗号。

所以我寻找另一个解决方案并看到很多帖子,其中人们说只需添加 UTF-8 BOM 并以 UTF-8 写入文件就可以为 Excel 2007 及更高版本完成工作。我在我的工作计算机上尝试了最简单的示例,但它失败了。但是当我在家里的电脑上尝试这个时,它就像一个魅力。

两台计算机都安装了相同版本的 java 和操作系统 Windows 7。 我很迷惑。谁能说出是什么导致了这种奇怪的行为?

您可以在下面查看我最简单的示例:

String filename = "D:/check/test_with_bom.csv";
        FileOutputStream fos = new FileOutputStream(filename);
        byte[] bom = new byte[]  (byte)0xEF, (byte)0xBB, (byte)0xBF ; 
        fos.write(bom);
        OutputStreamWriter osw = new OutputStreamWriter(fos , "UTF-8");
        PrintWriter printWriter = new PrintWriter(osw);

        printWriter.print("Hello,Olá,ão,ção");
        printWriter.close();

【问题讨论】:

Excel 版本是否相同? 你为什么要创建那个过时的PrintWriter?在Writer 上调用write 比在PrintWriter 上调用print 更难吗? Robin Green,我猜是的 - 两台机器都有 2007 Excel。我看到的明显区别是在工作机器上我有俄语 excel。 Holger,将 print 更改为 write 不会改变结果。这只是一个测试样本,我写它是为了证明这种方法的可能性。 【参考方案1】:

您应该知道 Excel 不会“打开”csv 文件。它使用默认值即时将它们转换为 Excel 文件。这些默认值可能因您的区域设置而异。正因为如此,it's never a good idea to let Excel open csv files using the defaults,因为你永远无法确定你最终会得到什么。

更安全的方法是使用“从文本导入”方法,并明确指定分隔符、编码等...但是,请注意,在 Excel 中“另存为 csv”是一个更糟糕的主意,因为它确实不允许您指定编码、分隔符或任何其他详细信息。访问。

在美国 Windows 版本的 Excel 中,默认的列分隔符是逗号。在欧洲 Windows 版本中,逗号是为十进制符号保留的,为了避免冲突,默认情况下使用分号作为列分隔符。

如果您 -rely- -rely- -have- 使用 CSV,您可以考虑在 csv 文件的顶部添加 "sep=," indicator。但是,请注意,这可能会导致其他应用程序出现问题。

【讨论】:

是的,我知道通过 excel 打开它们不是一个好主意,但是客户希望通过双击在 excel 中打开 csv 并希望逗号作为列分隔符。无论如何,我停止使用 UTF-8 BOM。你说的是区域设置,你到底是什么意思?感谢您的意见。 嘿,我在答复中添加了两段。但是,当使用 CSV 时,客户端将添加或更改数据并保存文件,请务必向他们解释在 CSV 文件上使用“保存”的限制,而不是明确执行导出。

以上是关于java中生成了一个csv文件,通过excel打开csv,数据没有分列,如何在就java语言里实现。的主要内容,如果未能解决你的问题,请参考以下文章

关于excel保存为csv格式后,重新打开文本型数字变为科学计数,且15位后面变成0??

通过 Excel 使用 UTF-8 BOM 打开 CSV

如何批量读取csv格式的文件名及文件内容到新的Excel中?

java生成csv格式文件后,用excel打开,单元格显示问题

java导出csv文件使用Excel打开乱码问题

java中把列表用流生成了Excel表格中的时间显示问题