5

我知道我们可以使用 Apache POI 来解析 Excel 文件并获取数据。但我听说一个奇怪的事情是,excel 文件可以以类似于我们解析 CSV 的方式传递(就像只是从文件 Stream 中读取文件并用“逗号”分隔符分隔每个列值)。当我们解析 Excel 时,我们必须使用制表符作为分隔符。是否可以?如果是,那么为什么 Apache 会提出如此复杂的框架。我很困惑。有人能帮我吗?

4

4 回答 4

5

CSV 是一种文本格式,因此可以使用分隔符对其进行解析。旧 Excel 是一种二进制和专有格式,因此需要巧妙的解码。新的 Excel 格式是压缩的 XML,但在将其转换为像逐个读取单元格这样简单的东西之前,还应该了解该文档的结构。所以你的问题的答案是否定的,你需要使用 Apache POI,而且 - 这没有任何问题。

附带说明一下,在成为一名优秀开发人员的道路上,您需要在寻求帮助之前学会做一些自己的研究。弄脏你的手是学习东西的最好方法。

于 2012-04-20T15:19:27.233 回答
2

您可能对所听到的内容感到困惑,或者告诉您的人感到困惑。

Excel 文件的某些部分可以(某种程度上)存储为 CSV 文件,因为表格数据结构非常适合 CSV 文件格式。但是,如果您以 CSV 格式保存,那么您只会在每个单元格中获得纯文本 - 您会丢失所有格式信息、任何图表、多个工作表等。

本机 XLS excel 格式是 Apache POI 使用的,因此可以处理 excel 中的所有内容,而不仅仅是某些单元格中的限制性纯文本。CSV 文件有其用途,但它们绝对不是普通 Excel 文件的直接替代品。

于 2012-04-20T15:14:29.227 回答
0

我尝试在不使用任何外部 JAR(如 POI 或任何其他 JAR)的情况下读取/写入 excel 文件。我能够将文件写入 xls 格式。这是我的代码

FileWriter fwriter = new FileWriter(file,true);
writer = new BufferedWriter(fwriter);
writer.newLine();
writer.write("a"    + "\t");
writer.write("b"    + "\t");
writer.write("c"    + "\t");
writer.write("d"    + "\t");
writer.write("e"    + "\t");
writer.write("f"    + "\t");

在这里阅读文件是我的阅读代码

if(file != null) {
            BufferedReader reader = null;
            try {
                reader = new BufferedReader(new FileReader(file));
                String line;
                while((line = reader.readLine()) != null) {
                    String[] component = line.split("\\t");
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(reader != null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
于 2014-05-03T21:08:14.380 回答
0
InputStream is = new FileInputStream(new File(filepath));
        StreamingReader reader=null;
        try {
            reader = StreamingReader.builder()
                    .rowCacheSize(100)     
                    .bufferSize(4096)     
                    .sheetIndex(0)        
                    .read(is);
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }finally{
            is.close();
        }
        //pass here to reader and itrate it 
          for (Row row : reader) {
            if (row.getRowNum()!=0){
                for (Cell cell : row) {
              // write ur logic to store ur value 
                }

            }
        }
于 2018-03-08T07:46:47.577 回答