java는 여러 개의 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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.