001 /*
002 * Copyright (c) 2005 Einar Pehrson <einar@pehrson.nu>.
003 *
004 * This file is part of
005 * CleanSheets - a spreadsheet application for the Java platform.
006 *
007 * CleanSheets is free software; you can redistribute it and/or modify
008 * it under the terms of the GNU General Public License as published by
009 * the Free Software Foundation; either version 2 of the License, or
010 * (at your option) any later version.
011 *
012 * CleanSheets is distributed in the hope that it will be useful,
013 * but WITHOUT ANY WARRANTY; without even the implied warranty of
014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015 * GNU General Public License for more details.
016 *
017 * You should have received a copy of the GNU General Public License
018 * along with CleanSheets; if not, write to the Free Software
019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020 */
021 package csheets.io;
022
023 import java.io.BufferedReader;
024 import java.io.BufferedWriter;
025 import java.io.IOException;
026 import java.io.InputStream;
027 import java.io.InputStreamReader;
028 import java.io.OutputStream;
029 import java.io.OutputStreamWriter;
030 import java.io.PrintWriter;
031 import java.io.Reader;
032 import java.util.LinkedList;
033 import java.util.List;
034
035 import csheets.core.Spreadsheet;
036 import csheets.core.Workbook;
037
038 /**
039 * A codec for comma-separated files.
040 * @author Einar Pehrson
041 */
042 public class CSVCodec implements Codec {
043
044 /** The string used to separate the content of different cells */
045 public static final String SEPARATOR = ";";
046
047 /**
048 * Creates a new CSV codec.
049 */
050 public CSVCodec() {}
051
052 public Workbook read(InputStream stream) throws IOException {
053 // Wraps stream
054 Reader streamReader = new InputStreamReader(stream);
055 BufferedReader reader = new BufferedReader(streamReader);
056
057 // Reads content of rows
058 String line;
059 int columns = 0;
060 List<String[]> rows = new LinkedList<String[]>();
061 while ((line = reader.readLine()) != null) {
062 String[] row = line.split(SEPARATOR);
063 rows.add(row);
064 if (row.length > columns)
065 columns = row.length;
066 }
067
068 // Builds content matrix
069 String[][] content = new String[rows.size()][columns];
070 int i = 0;
071 for (String[] row : rows)
072 content[i++] = row;
073
074 // Frees resources
075 reader.close();
076 streamReader.close();
077 stream.close();
078
079 return new Workbook(content);
080 }
081
082 public void write(Workbook workbook, OutputStream stream) throws IOException {
083 System.out.println("Writing!");
084 // Wraps stream
085 PrintWriter writer = new PrintWriter(new BufferedWriter(
086 new OutputStreamWriter(stream)));
087
088 // Writes content of rows
089 Spreadsheet sheet = workbook.getSpreadsheet(0);
090 for (int row = 0; row < sheet.getRowCount(); row++) {
091 for (int column = 0; column < sheet.getColumnCount(); column++)
092 if (column + 1 < sheet.getColumnCount())
093 writer.print(sheet.getCell(column, row).getContent()
094 + SEPARATOR);
095 if (row + 1 < sheet.getRowCount())
096 writer.println();
097 }
098
099
100 // Frees resources
101 writer.close();
102 stream.close();
103 System.out.println("Done!");
104 }
105 }