java는 여러 개의 excel 파일을 하나의 excel 파일로 통합합니다

7335 단어
작업 수요로 인해 수백 개의 excel 파일을 하나의 excel 파일로 통합합니다.
실패 방안 1: 입력 흐름 + 출력 흐름을 반복해서 원본 파일을 읽고 대상 파일에 직접 기록합니다.
이런 방안에는 문제가 하나 있는데, 흐름은 기억이 없다.같은 입력 흐름은 하나의 바늘을 읽고 자동으로 한 자리를 옮기지만, 다른 입력 흐름은 지난 흐름이 무엇을 하는지 전혀 모른다.마지막 결과는 대상 파일의 내용과 순환 중인 마지막 원본 파일의 내용이 같다는 것이다.
시나리오 2: Excel에 기록된 내용이 이전 위치에 이어 계속 기록될 수 있도록 HSSFWorkbook을 사용합니다.
실현된 사고방식은 페이지에서 사용자가 원본 파일 주소, 목표 파일 주소와 목표 파일 이름을 작성하고 제출한 후 백그라운드에 Excel 목표 파일을 만들고 목표 파일과 원본 파일을 모두 HSSFWorkbook으로 포장한 다음에 원본 파일의 모든 셀을 반복해서 읽고 값을 목표 파일인 HSSFWorkbook 대상에 저장하고 최종 데이터를 목표 파일에 기록하는 것이다.이렇게 하면 사용자는 작성한 목표 대상에서 합병 파일을 찾을 수 있다.
하지만 새로 만든 것을 HSSFWorkbook으로 포장하고 있습니다.xlsx 대상 파일을 읽을 때 작은 문제가 발생했습니다: Unable to read entire header;0 bytes read; expected 512bytes, 포장 대상에 표두가 없다는 뜻이다.
질문문: File file=File.createTempFile(targetPath+File.separator+fileName);         FileInputStream fis = new FileInputStream(file);         HSSFWorkbook targetWork = new HSSFWorkbook(fis);//문제 문장
그래서 직접 만들었어요.xlsx는 HSSFWorkbook으로 포장할 수 없습니다. 이런 방법도 안 됩니다.
방안3: 페이지에서 사용자는 원본 파일 주소만 기입하고 제출한 후 파일을 직접 다운로드한다.백그라운드에서 대상 파일을 만들지 않고 대상 HSSFWorkbook 객체를 response 흐름에 직접 기록합니다.코드는 다음과 같습니다.
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
public void excelMerge(HttpServletResponse response, String sourcePath) throws Exception {
      //  HSSFWorkbook, 
      HSSFWorkbook targetWork = new HSSFWorkbook();
      HSSFSheet targetSheet = targetWork.createSheet(" ");
      targetSheet.setDefaultColumnWidth(20);
      targetSheet.setDefaultRowHeightInPoints(20);

      //  targetWork 
      int targetLineIndex = 0;
      //  
      Map styles = createStyles(targetWork);
      // 
      Row titleRow = targetSheet.createRow(targetLineIndex++);
      titleRow.setHeightInPoints(30);
      Cell titleCell = titleRow.createCell(0);
      titleCell.setCellStyle(styles.get("header"));
      titleCell.setCellValue(" " + CreateOrderID.getOrderNo());
      targetSheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(), titleRow.getRowNum(), titleRow.getRowNum(), 4));

      //  
      Row headerRow = targetSheet.createRow(targetLineIndex++);
      headerRow.setHeightInPoints(16);
      List headerList = new ArrayList<>();
      headerList.add(" ");
      headerList.add(" ");
      headerList.add(" ");
      headerList.add(" ");
      headerList.add(" ");
      for (int i = 0; i < headerList.size(); i++) {
         Cell cell = headerRow.createCell(i);
         cell.setCellStyle(styles.get("title"));
         cell.setCellValue(headerList.get(i));
         targetSheet.autoSizeColumn(i);
      }
      for (int i = 0; i < headerList.size(); i++) {
         int colWidth = targetSheet.getColumnWidth(i) * 5;
         targetSheet.setColumnWidth(i, colWidth < 3000 ? 3000 : colWidth);
      }
      
      HSSFWorkbook workbook;
      HSSFSheet sheet;
      File sourcePathFile = new File(sourcePath);
      for (File file : sourcePathFile.listFiles()) {
         if (file.isFile() && file.getName().endsWith(".xlsx")) {
            workbook = new HSSFWorkbook(new FileInputStream(file));
            sheet = workbook.getSheetAt(0);

            for (int i = 2; i < sheet.getLastRowNum(); i++) {
               Row sourceRow = sheet.getRow(i);
               Row targetRow = targetSheet.createRow(targetLineIndex++);
               for (int j = 0; j < sourceRow.getLastCellNum(); j++) {//Cell
                  Cell cell = sourceRow.getCell(j);
                  switch (cell.getCellType()) {
                     case Cell.CELL_TYPE_BLANK:
                        break;
                     case Cell.CELL_TYPE_STRING:
                        System.out.println();
                        targetRow.createCell(j).setCellValue(cell.getStringCellValue());
                        break;
                     case Cell.CELL_TYPE_NUMERIC:
                        targetRow.createCell(j).setCellValue(cell.getNumericCellValue());
                        break;
                     default:
                        targetRow.createCell(j).setCellValue(cell.toString());
                  }
               }
            }
         }
      }
      response.reset();
      response.setContentType("application/octet-stream; charset=utf-8");
      response.setHeader("Content-Disposition", "attachment; filename=" + Encodes.urlEncode(" " + CreateOrderID.getOrderNo() + ".xlsx"));
      targetWork.write(response.getOutputStream());
   }

   //  , Excel 
   private Map createStyles(Workbook wb) {
      Map styles = new HashMap<>();

      CellStyle style = wb.createCellStyle();
      style.setAlignment(CellStyle.ALIGN_CENTER);
      style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
      Font titleFont = wb.createFont();
      titleFont.setFontName("Arial");
      titleFont.setFontHeightInPoints((short) 12);
      titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
      style.setFont(titleFont);
      styles.put("title", style);

      style = wb.createCellStyle();
      style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
      style.setBorderRight(CellStyle.BORDER_THIN);
      style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
      style.setBorderLeft(CellStyle.BORDER_THIN);
      style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
      style.setBorderTop(CellStyle.BORDER_THIN);
      style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
      style.setBorderBottom(CellStyle.BORDER_THIN);
      style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
      Font dataFont = wb.createFont();
      dataFont.setFontName("Arial");
      dataFont.setFontHeightInPoints((short) 10);
      style.setFont(dataFont);
      styles.put("data", style);

      style = wb.createCellStyle();
      style.setAlignment(CellStyle.ALIGN_LEFT);
      style.cloneStyleFrom(styles.get("data"));
      styles.put("data1", style);

      style = wb.createCellStyle();
      style.cloneStyleFrom(styles.get("data"));
      style.setAlignment(CellStyle.ALIGN_CENTER);
      styles.put("data2", style);

      style = wb.createCellStyle();
      style.cloneStyleFrom(styles.get("data"));
      style.setAlignment(CellStyle.ALIGN_RIGHT);
      styles.put("data3", style);

      style = wb.createCellStyle();
      style.cloneStyleFrom(styles.get("data"));
//    style.setWrapText(true);
      style.setAlignment(CellStyle.ALIGN_CENTER);
      style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
      style.setFillPattern(CellStyle.SOLID_FOREGROUND);
      Font headerFont = wb.createFont();
      headerFont.setFontName("Arial");
      headerFont.setFontHeightInPoints((short) 16);
      headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
      headerFont.setColor(IndexedColors.WHITE.getIndex());
      style.setFont(headerFont);
      styles.put("header", style);

      return styles;
   }

좋은 웹페이지 즐겨찾기