jakarta ee-使用Apache POI在java中复制多个csv到xls文件的问题



我是这个博客和IT领域的新手。我在将值从csv文件复制到现有的xls文件时遇到问题。我正在使用Apache POI。我有两个csv文件和两个现有的xls文件output0.xls和output1.xls用于各自的csv文件。我正在尝试将第一个csv文件中的值复制到output0.xls,并将第二个csv文档复制到outut1.xls。我已经为此编写了代码。它可以很好地进行

但问题是,在将第一个csv文件的值放入output0.xls后,当我试图从第二个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;
            }

            }

   }

代码的简单问题是您没有重新初始化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;
        }

        }

希望这能有所帮助。

问题是,在while循环中解析的每个文件csv文件都会将数据附加到"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();可能会更好。。。

相关内容

  • 没有找到相关文章

最新更新