#jakarta-ee #apache-poi #java
#джакарта-ee #apache-poi #java
Вопрос:
Я очень новичок в этом блоге, а также в области ИТ. У меня проблема с копированием значений из файла csv в существующий файл xls. Я использую Apache POI. У меня есть два csv-файла и два существующих xls-файла output0.xls и output1.xls для соответствующего csv-файла.Я пытаюсь скопировать значения из 1-го файла csv в output0.xls и 2-й файл csv в output1.xls.Я создал код для этого. и он отлично работает
Но проблема в том, что после ввода значения 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;
}
}
}
Ответ №1:
Простая проблема с вашим кодом заключается в том, что вы не повторно инициализируете 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;
}
}
Надеюсь, это поможет.
Комментарии:
1. Большое вам спасибо, Сандип Nubsis……….it работает с arlist.clear(). Большое вам спасибо …….. берегите себя, ребята ….та-та-та
Ответ №2:
Проблема в том, что каждый 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();
может быть, даже лучше…