>source

입력 폴더에서 사용할 수있는 2 개의 xlsx 파일을 병합하려고합니다. 두 파일 모두 데이터가 있습니다. 여전히 newRownumber가 값 -1로 할당되고 있으며이 오류가 발생하는 것 같습니다. 파일이 비어 있으면 -1이 할당됩니다. 스레드 "main"의 예외 java.lang.IllegalArgumentException : 허용 범위 (0..1048575)를 벗어난 잘못된 행 번호 (-1) org.apache.poi.xssf.usermodel.XSSFRow.setRowNum (XSSFRow.java:423) org.apache.poi.xssf.usermodel.XSSFSheet.createRow (XSSFSheet.java:788) MergeMultipleXlsFilesInDifferentSheet.copySheets (MergeMultipleXlsFilesInDifferentSheet.java:58) MergeMultipleXlsFilesInDifferentSheet.copySheets (MergeMultipleXlsFilesInDifferentSheet.java:48) MergeMultipleXlsFilesInDifferentSheet.mergeExcelFiles (MergeMultipleXlsFilesInDifferentSheet.java:31) MergeMultipleXlsFilesInDifferentSheet.main (MergeMultipleXlsFilesInDifferentSheet.java:122)

여기에서 무엇이 잘못되었는지 알려주세요 아래는 내 코드입니다

   import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class MergeMultipleXlsFilesInDifferentSheet{
 public static void mergeExcelFiles(File file) throws IOException {
    XSSFWorkbook book = new XSSFWorkbook();
    System.out.println(file.getName());
    String directoryName = "C:\\input";
    File directory = new File(directoryName);
    //get all the files from a directory
    File[] fList = directory.listFiles();
    for (File file1 : fList){
        if (file1.isFile()){
            String ParticularFile = file1.getName();
       FileInputStream fin = new FileInputStream(new File(directoryName+"\\"+ParticularFile));
      XSSFWorkbook b = new XSSFWorkbook(fin);
      for (int i = 0; i < b.getNumberOfSheets(); i++) {
          XSSFSheet sheet = book.createSheet(b.getSheetName(i));
        copySheets(book, sheet, b.getSheetAt(i));
        System.out.println("Copying..");
      }
    }
    try {
      writeFile(book, file);
    }catch(Exception e) {
        e.printStackTrace();
    }
   }
  }
  protected static void writeFile(XSSFWorkbook book, File file) throws Exception {
    FileOutputStream out = new FileOutputStream(file);
    book.write(out);
    out.close();
  }
  private static void copySheets(XSSFWorkbook newWorkbook, XSSFSheet newSheet, XSSFSheet sheet){     
    copySheets(newWorkbook, newSheet, sheet, true);
  }     
  private static void copySheets(XSSFWorkbook newWorkbook, XSSFSheet newSheet, XSSFSheet sheet, boolean copyStyle){     
    int newRownumber = newSheet.getLastRowNum();
    int maxColumnNum = 0;     
    Map<Integer, XSSFCellStyle> styleMap = (copyStyle) ? new HashMap<Integer, XSSFCellStyle>() : null;    
    for (int i = sheet.getFirstRowNum(); i <= sheet.getLastRowNum(); i++) {     
      XSSFRow srcRow = sheet.getRow(i);     
      XSSFRow destRow = newSheet.createRow(i + newRownumber);     
      if (srcRow != null) {     
        copyRow(newWorkbook, sheet, newSheet, srcRow, destRow, styleMap);     
        if (srcRow.getLastCellNum() > maxColumnNum) {     
            maxColumnNum = srcRow.getLastCellNum();     
        }     
      }     
    }     
    for (int i = 0; i <= maxColumnNum; i++) {     
      newSheet.setColumnWidth(i, sheet.getColumnWidth(i));     
    }     
  }     
  public static void copyRow(XSSFWorkbook newWorkbook, XSSFSheet srcSheet, XSSFSheet destSheet, XSSFRow srcRow, XSSFRow destRow, Map<Integer, XSSFCellStyle> styleMap) {     
    destRow.setHeight(srcRow.getHeight());
    for (int j = srcRow.getFirstCellNum(); j <= srcRow.getLastCellNum(); j++) {     
      XSSFCell oldCell = srcRow.getCell(j);
      XSSFCell newCell = destRow.getCell(j);
      if (oldCell != null) {     
        if (newCell == null) {     
          newCell = destRow.createCell(j);     
        }     
        copyCell(newWorkbook, oldCell, newCell, styleMap);
      }     
    }                
  }
  public static void copyCell(XSSFWorkbook newWorkbook, XSSFCell oldCell, XSSFCell newCell, Map<Integer, XSSFCellStyle> styleMap) {      
    if(styleMap != null) {     
      int stHashCode = oldCell.getCellStyle().hashCode();     
      XSSFCellStyle newCellStyle = styleMap.get(stHashCode);     
      if(newCellStyle == null){     
        newCellStyle = newWorkbook.createCellStyle();     
        newCellStyle.cloneStyleFrom(oldCell.getCellStyle());     
        styleMap.put(stHashCode, newCellStyle);     
      }     
      newCell.setCellStyle(newCellStyle);   
    }     
    switch(oldCell.getCellType()) {     
      case STRING:     
        newCell.setCellValue(oldCell.getRichStringCellValue());     
        break;     
      case NUMERIC:     
        newCell.setCellValue(oldCell.getNumericCellValue());     
        break;     
      case BLANK: 
          //return null;
        newCell.setCellType(null);     
        break;     
      case BOOLEAN:     
        newCell.setCellValue(oldCell.getBooleanCellValue());     
        break;     
      case ERROR:     
        newCell.setCellErrorValue(oldCell.getErrorCellValue());     
        break;     
      case FORMULA:     
        newCell.setCellFormula(oldCell.getCellFormula());     
        break;     
      default:     
        break;     
    }
  }
  public static void main(String[] args) {
      try {
        mergeExcelFiles(new File("C:\\DataWillBeMerged.xlsx"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

  • 답변 # 1

    포럼에 오신 것을 환영합니다.

    예외가 발생합니다. newSheet.getLastRowNum(); 요구된다 newSheet 행이 없습니다. 아마도 당신은 바꾸고 싶어 newSheet ...에 sheet 여기서 마지막 행 번호는 소스 시트에서 가져옵니다.

  • 답변 # 2

    사용하던 최신 버전 대신 Apache poi 3.16을 사용해보십시오. 일부 기능은 업데이트로 수정됩니다.

관련 자료

  • 이전 javascript - 입력 필드에서 삭제 된 값을 거부하기 위해 BootstrapVue에서 상태 및 잘못된 피드백 속성 처리
  • 다음 Ajax laravel 업데이트 함수에서 열은 null 일 수 없습니다