使用Apache POI编写excel文件,但FileOutput只包含一列

我写了一个代码,它从一个inputexcel文件中获取数据,并用所需的组织编写一个新的输出文件。 我遇到的问题是,当我打开Java文件时,只有for循环中最新的列才有数据。 我已经testing过,看看我的for循环在不同的时间通过打开for循环是错误的。 testing显示它确实在正确的列中写入了正确的数据。 我不知道为什么它select删除前一列。 有没有一条线,我想保存单元格的值,我刚才保持在我正在工作的工作表上的数据?

import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.SheetConditionalFormatting; import org.apache.poi.ss.usermodel.ConditionalFormattingRule; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.ComparisonOperator;//compare two different values import org.apache.poi.ss.usermodel.PatternFormatting; import org.apache.poi.ss.usermodel.IndexedColors; import java.util.Iterator; import java.io.*; import javax.swing.JFileChooser; public class Reorganizer { public static void main(String[] args) { /*File Chooser*/ JFileChooser fileChooser = new JFileChooser();//lets user choose file int returnValue = fileChooser.showOpenDialog(null);//null bc we don't have parent classes, lets user choose through an open window if(returnValue == JFileChooser.APPROVE_OPTION) { try { Workbook wb= new HSSFWorkbook(new FileInputStream(fileChooser.getSelectedFile()));//setting the input file as a workbook Sheet inputSheet = wb.getSheetAt(0);//the sheet from the input file Workbook wb1 = new HSSFWorkbook();//creating a new workbook to later be put into the output file Sheet outputSheet = wb1.createSheet("Sheet 1");//creates new sheet on the output excel file //first need something to find cell# of the file Row idRow = inputSheet.getRow(0); int cellCounter=0; for(Iterator<Cell> cit = idRow.cellIterator(); cit.hasNext();)//goes down the row, until there is nothing { Cell cell = cit.next(); cellCounter++; } //finds the number of rows int rowCounter=0; for(Iterator<Row> rit = inputSheet.rowIterator();rit.hasNext();)//goes down the column, until there is nothing { Row row = rit.next(); rowCounter++; } //The first row of the document should be the labeling process //Set the row(0) and the cells(9) Row labelRow = outputSheet.createRow(0); //for loop to make 9 cells with labels String[] cellValues = new String[]{"Chr","Pos","Olfr","Subfamily","Cluster","OP6u","OP6d","OP27u","OP27d"}; for(int i=0; i<=9;i++) { Cell labelCells = labelRow.createCell(i); if(i<=8) { labelCells.setCellValue(cellValues[i]); for(Iterator<Cell> cit = idRow.cellIterator(); cit.hasNext(); ) { Cell cell = cit.next(); cell.setCellType(Cell.CELL_TYPE_STRING); if(cellValues[i].equals(cell.getStringCellValue())) { for(int j=1;j<rowCounter;j++) { int cellnum = cell.getColumnIndex(); Cell inputCell = inputSheet.getRow(j).getCell(cellnum); inputCell.setCellType(Cell.CELL_TYPE_STRING); String data = inputCell.getStringCellValue(); Cell outputCell = outputSheet.createRow(j).createCell(i); outputCell.setCellValue(data); System.out.println(cellnum);//tells me where the input column was from System.out.println(i);////tells me what row cell I'm writing on System.out.println(j);//tells me what row number System.out.println(data);//tells me the data being inputed into file //used the above prints to find out what it was doing, //this is the code used to write the data } } } } else { labelCells.setCellValue(""); } } FileOutputStream output = new FileOutputStream("Reorganized.xls"); wb1.write(output); output.flush(); output.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch(Exception e) { e.printStackTrace(); } } } } 

看起来像你的问题在这里。 当你调用createRow()时,它将清除现有的数据。

 Cell outputCell = outputSheet.createRow(j).createCell(i); 

您可以在填充数据之前预先创build所有行,也可以调用getRow()来testing该行是否已经存在。 你需要这样的东西:

 Row row = outputSheet.getRow(j); if (row == null) { row = outputSheet.createRow(j); } Cell outputCell = row.createCell(i);