1

Excelから複数のcsvファイルにすべてのデータを書き込むプログラムを作成しようとしています。

現在、私のプログラムはn個のファイルを作成し、Excelの最後の行だけが最後のcsvファイルに書き込まれています。

プログラミングの背景観察:

ファイルが書き込んでいるようです。しかし、書き込まれた行ごとに、どういうわけか同じファイルが250回作成されます。最後に書き込まれた行を消去します。

OutputStreamまたはBufferedWriterの使用に問題がある可能性があります。私はそれが何であるかを理解することができません。

writeRow()メソッド:

public static void writeRow(BufferedWriter bw, Cell[] row) throws IOException { 
    if (row.length > 0) {
        bw.write(row[0].getContents());
        for (int j = 1; j < row.length; j++) {
            bw.write(',');
            bw.write(row[j].getContents());
        }
    }
}

setFile()メソッド:

public static BufferedWriter setFile (int i) throws IOException {
    i=i/250;
    File f = new File(dir + "file-" + (i+1) + ".csv");
    // If i has changed, create a new file. Else, append to current file.
    String encoding = "UTF8";
    OutputStream os = null;
    OutputStreamWriter osw = null;
    BufferedWriter bw = null;
    Boolean append = null;
    try {
        // If i has changed, create a new file, else append.
        if (i%250==0) {
            append = new Boolean("TRUE");
            os = new FileOutputStream(f,append);
        } else {
            append = new Boolean("FALSE");
            os = new FileOutputStream(f, append);
        }
        osw = new OutputStreamWriter(os, encoding);
        bw = new BufferedWriter(osw);

    } finally {
        os.close();
        osw.close();
    }
    return bw;
}

例外は次のとおりです。

Exception in thread "main" java.io.IOException: Stream closed
at sun.nio.cs.StreamEncoder.ensureOpen(Unknown Source)
at sun.nio.cs.StreamEncoder.write(Unknown Source)
at java.io.OutputStreamWriter.write(Unknown Source)
at java.io.BufferedWriter.flushBuffer(Unknown Source)
at java.io.BufferedWriter.flush(Unknown Source)
at Main.main(Main.java:46)

以下は、コードへのリンクの一部です。

私は何が間違っているのですか?

これがsvnトランクです:

https://franz-opensource.googlecode.com/svn/trunk/ExcelToCsv- _

4

1 に答える 1

1

重要なアドバイス:同じバッファーに書き込む代わりに、 n 番目のレコード ごとに行を停止します。次に、ワークシートをもう一度読みます。次に、別のファイルにバッファを出力します。同じバッファへの書き込み中にファイルを変更することはできません。

ソリューション全体を少しずつ示します。

静的変数:

public static int maxRecords = 250;
public static String directory = "C:\\Users\\User02\\workspace\\ExcelToCsv\\src\\";
public static String inputFile = directory + "inventory.xls";

主要:

public static void main(String[] args) throws BiffException, IOException {
Sheet s = getSheet();
    int countRows = s.getRows(); // counts the number of rows in the sheet.
    int numberOfFiles = (countRows/maxRecords)+1;

    for(int file=0; file<numberOfFiles; file++) {
        System.out.println("Create file number " + (file+1));
        int fileNumber = file+1;
        System.out.println("Start number: " + ((file*maxRecords)+1));
        int startNumber = (file*maxRecords);
        populateFile(fileNumber,startNumber);
        System.out.println("");
    }
}

移入リスト:

public static void populateFile(int fileNumber, int startNumber) 
    throws IOException, BiffException {
        BufferedWriter bw = setFile(fileNumber);
        Sheet s = getSheet();
        Cell[] row = null;
        writeRow(bw,s.getRow(0));
        bw.newLine(); 
        int limit = getLimit(s,startNumber);
        System.out.println("End Number:" + limit);
        System.out.println();
        for (int i = startNumber; i < limit ; i++) {
            row = s.getRow(i); 
            //System.out.println(i);
            writeRow(bw,row);
            bw.newLine();
        }
        bw.flush();
        bw.close();
    }

シートを取得します。

public static Sheet getSheet() throws BiffException, IOException {
    WorkbookSettings ws = new WorkbookSettings();
    ws.setLocale(new Locale("en", "EN"));
    Workbook w = Workbook.getWorkbook(new File(inputFile),ws);
    Sheet s = w.getSheet(0);
    return s;
}

書き込むファイルの設定:

public static BufferedWriter setFile(int fileNumber) throws IOException {
    String csvFilename = directory + "file-"+ fileNumber +".csv";
    FileWriter csvFile = new FileWriter(csvFilename);
    BufferedWriter bw = new BufferedWriter(csvFile);
    return bw;
}

制限を取得する:

public static int getLimit(Sheet s, int startNumber) {
    int limit;
    int countRows = s.getRows();
    if (startNumber+maxRecords<=countRows) {
        limit = startNumber + maxRecords;
    } else {
        limit = startNumber + (countRows-startNumber);
    }
    return limit;
}

行をファイルに書き込みます。

public static void writeRow(BufferedWriter bw, Cell[] row) throws IOException { 
    if (row.length > 0) {
        bw.write(row[0].getContents());
        for (int j = 1; j < row.length; j++) {
            bw.write(',');
            bw.write(row[j].getContents());
        }
    }
}
于 2012-10-02T17:56:23.047 に答える