Проблема копирования нескольких CSV-файлов в XLS-файлы в Java с помощью Apache POI - PullRequest
0 голосов
/ 10 июня 2011

Я очень новичок в этом блоге, а также в области ИТ. У меня проблема с копированием значений из файла CSV в существующий файл XLS. Я использую Apache POI. У меня есть два CSV-файла и два существующих xls-файла output0.xls и output1.xls для соответствующего CSV-файла. Я пытаюсь скопировать значения из 1-го CSV-файла в output0.xls и 2-го CSV-файла в output1.xls.I ve сделал код для этого. и он отлично работает

Но проблема в том, что после помещения значения 1-го файла CSV в файл output0.xls, когда из 2-го файла CSV я пытаюсь скопировать значения в файл output1.xls, он добавляет значения первого файла CSV со вторым CSV-файл и записывает значения обоих файлов в output1.xls.

Я не могу выяснить, в чем главная проблема. Пожалуйста, кто-нибудь, помогите мне как можно скорее .... В противном случае я столкнусь с большой проблемой.


Код, который использовали

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStreamReader;
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 Demo {

    // FileOutputStream fileOut=null;
     //FileInputStream fis=null;

public static void main(String[] args) throws IOException {

        /*File f=new File("c:\\");
        // return boolean-->System.out.println(f.isDirectory());
        File[]files=f.listFiles();*/
    String thisline;
    ArrayList<String> al = null;
    ArrayList<ArrayList<String>> arlist = new ArrayList<ArrayList<String>>();

    String libRoot=new File(".").getAbsolutePath();       
    libRoot=libRoot.replaceAll("\\\\", "/");
    File f=new File(libRoot+"/result");
    FilenameFilter filter = new FilenameFilter()
    {
        @Override public boolean accept(File dir, String name)
        {
            return name.endsWith(".csv");
        }
    };


    File file[]=f.listFiles(filter);


    for(int r=0;r<file.length;r++){
        File currentFile=file[r];


        FileInputStream fis = new FileInputStream(currentFile);
        //DataInputStream myInput = new DataInputStream(fis);
        BufferedReader br = new BufferedReader(new InputStreamReader(fis));
        while ((thisline = br.readLine()) != null) {
            al = new ArrayList<String>();
            String strar[] = thisline.split(",");

            for (int j = 0; j < strar.length; j++) {


                al.add(strar[j]);
            }

            arlist.add(al);
            //i++;

        } 

        fis.close();


            HSSFWorkbook hwb = new HSSFWorkbook();
            HSSFSheet sheet = hwb.createSheet("new sheet"+r);

            for (int k = 0; k < arlist.size(); k++) {
                ArrayList<String> ardata = (ArrayList<String>) arlist.get(k);
                HSSFRow row = sheet.createRow((short) 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(libRoot+"/result/output"+r+".xls");
            hwb.write(fileOut);
            fileOut.flush();
            fileOut.close();
            br.close();

            //hwb=null;
            }


            }


   }

Ответы [ 2 ]

5 голосов
/ 10 июня 2011

Простая проблема с вашим кодом в том, что вы не инициализируете arlist.

Из-за этого данные CSV1 и CSV2 копируются в файл output1.xls.

Вам необходимо добавить arlist.clear ();как указано в коде ниже.

Код обновления будет выглядеть следующим образом:

for(int r=0;r<file.length;r++){
    arlist.clear();
    File currentFile=file[r];


    FileInputStream fis = new FileInputStream(currentFile);
    //DataInputStream myInput = new DataInputStream(fis);
    BufferedReader br = new BufferedReader(new InputStreamReader(fis));
    while ((thisline = br.readLine()) != null) {
        al = new ArrayList<String>();
        String strar[] = thisline.split(",");

        for (int j = 0; j < strar.length; j++) {


            al.add(strar[j]);
        }

        arlist.add(al);
        //i++;

    } 

    fis.close();


        HSSFWorkbook hwb = new HSSFWorkbook();
        HSSFSheet sheet = hwb.createSheet("new sheet"+r);

        for (int k = 0; k < arlist.size(); k++) {
            ArrayList<String> ardata = (ArrayList<String>) arlist.get(k);
            HSSFRow row = sheet.createRow((short) 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(libRoot+"/result/output"+r+".xls");
        hwb.write(fileOut);
        fileOut.flush();
        fileOut.close();
        br.close();

        //hwb=null;
        }


        }

Надеюсь, это поможет.

4 голосов
/ 10 июня 2011

Проблема в том, что каждый файл CSV-файла, который вы анализируете в цикле while, добавляет данные в «arlist». В следующем цикле вы снова перебираете весь «arlist» и, таким образом, получаете значения из всех предыдущих файлов, которые вы проанализировали. Я бы посоветовал вам добавить строку:

arlist = new ArrayList<ArrayList<String>>();

В начале основного цикла это будет выглядеть примерно так:

for(int r=0;r<file.length;r++){
    File currentFile=file[r];
    arlist = new ArrayList<ArrayList<String>>();

Редактировать: Или вы могли бы сделать arlist.Clear(); Может быть, даже лучше ...

...