Apache poi를 사용하여 중앙 셀 병합 및 정렬
Apache poi를 사용하여 excel로 데이터를 내보내고 싶습니다.
제가 직면한 문제는 행을 병합하고 중앙에 정렬할 수 없다는 것입니다.
내보내기 데이터의 코드는 다음과 같습니다.
List<LinkedHashMap<String,Object>> lstReportHeader = null;
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
//Set Header Font
HSSFFont headerFont = wb.createFont();
headerFont.setBoldweight(headerFont.BOLDWEIGHT_BOLD);
headerFont.setFontHeightInPoints((short) 12);
//Set Header Style
CellStyle headerStyle = wb.createCellStyle();
headerStyle.setFillBackgroundColor(IndexedColors.BLACK.getIndex());
headerStyle.setAlignment(headerStyle.ALIGN_CENTER);
headerStyle.setFont(headerFont);
headerStyle.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
int rowCount= 0;
Row header;
header = sheet.createRow(0);//its for header
Cell cell ;//= header.createCell(0);
for(int j = 0;j < 4; j++) {
cell = header.createCell(j);
if(j == 0) {
cell.setCellValue("ItemWise List");
}
cell.setCellStyle(headerStyle);
}
sheet.addMergedRegion(new CellRangeAddress(rowCount, rowCount, 0, lstReportFormHeader.size()-1));
header = sheet.createRow(0);
cell = header.createCell(0);
cell.setCellValue("Sr. No");
cell = header.createCell(1);
cell.setCellValue("Item Name");
cell = header.createCell(2);
cell.setCellValue("Qty");
cell = header.createCell(3);
cell.setCellValue("Rate");
이제 ItemWise 목록을 병합하여 가운데에 정렬합니다.
제 솔루션은 셀을 위치별로 병합한 다음 셀(합병된 셀의 첫 번째 블록 참조)을 만들어 값을 할당한 다음 CellUtil을 통해 정렬을 설정하는 것이었습니다.
// Merges the cells
CellRangeAddress cellRangeAddress = new CellRangeAddress(start, start, j, j + 1);
sheet.addMergedRegion(cellRangeAddress);
// Creates the cell
Cell cell = CellUtil.createCell(row, j, entry.getKey());
// Sets the allignment to the created cell
CellUtil.setAlignment(cell, workbook, CellStyle.ALIGN_CENTER);
다음과 같이 병합:::
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
Row row = sheet.createRow((short) 1);
Cell cell = row.createCell((short) 1);
cell.setCellValue("This is a test of merging");
sheet.addMergedRegion(new CellRangeAddress(
1, //first row (0-based)
1, //last row (0-based)
1, //first column (0-based)
2 //last column (0-based)
));
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
정렬에 대해서도 Apache poi:::의 아래 공식 링크를 확인하십시오.
http://poi.apache.org/spreadsheet/quick-guide.html#Alignment
연구 결과 7개의 셀을 병합한 후 병합된 셀 id가 0이 되는 것을 발견하여 다음 스타일을 사용하여 셀 id 0에 적용하였습니다.
headerStyle.setAlignment(headerStyle.ALIGN_CENTER);
이것은 저에게 효과가 있었고 저는 이것이 더 깨끗하다고 생각합니다.
/**
* Merge and center the cells specified by range
* @param startCell the first cell in the cells to be merged
* @param range the range of the cells to be merged
*/
private static void mergeAndCenter(Cell startCell, CellRangeAddress range) {
startCell.getSheet().addMergedRegion(range);
CellStyle style = startCell.getSheet().getWorkbook().createCellStyle();
style.setAlignment(CellStyle.ALIGN_CENTER);
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
startCell.setCellStyle(style);
}
제가 알기로는 병합을 위한 시작 셀과 끝 셀이 있으며 셀 범위를 병합하고 셀 내용을 정렬하려고 합니다.내 말이 맞다면, 당신은 다음 방법을 사용할 수 있습니다.
/**
* @param startCell: first cell of merging area
* @param endCell: last cell of merging area
*/
public static void mergeAndAlignCenter(HSSFCell startCell, HSSFCell endCell){
//finding reference of start and end cell; will result like $A$1
CellReference startCellRef= new CellReference(startCell.getRowIndex(),startCell.getColumnIndex());
CellReference endCellRef = new CellReference(endCell.getRowIndex(),endCell.getColumnIndex());
// forming string of references; will result like $A$1:$B$5
String cellRefernce = startCellRef.formatAsString()+":"+endCellRef.formatAsString();
//removing $ to make cellRefernce like A1:B5
cellRefernce = cellRefernce.replace("$","");
//passing cellRefernce to make a region
CellRangeAddress region = CellRangeAddress.valueOf(cellRefernce);
//use region to merge; though other method like sheet.addMergedRegion(new CellRangeAddress(1,1,4,1));
// is also available, but facing some problem right now.
startCell.getRow().getSheet().addMergedRegion( region );
//setting alignment to center
CellUtil.setAlignment(startCell, wb, CellStyle.ALIGN_CENTER);
}
저는 병합된 모든 셀의 셀 스타일을 CENTER ALIGN으로 설정했습니다.으로 설정한 것입니다.XSSFheet.addMergedRegion() 메서드를 cellstyle 값을 center(중앙)로 설정하기 전이나 후에 배치할지는 중요하지 않습니다.
private void insertXlsHeader(XSSFSheet sheet){
....
//first cell for row1
cell = row1.createCell(colstart);
cell.setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING);
cell.setCellValue("COURSES");
setHeaderCellStyle(sheet,cell);
//first cell for row2
cell = row2.createCell(colstart);
setHeaderCellStyle(sheet,cell);
//first cell for row3
cell = row3.createCell(colstart);
setHeaderCellStyle(sheet,cell);
//merged the first cells of rows 1 to 3
sheet.addMergedRegion(new CellRangeAddress(ROW1, ROW3, colstart, colstart));
...
}
private void setHeaderCellStyle(XSSFSheet sheet,org.apache.poi.ss.usermodel.Cell cell) {
CellStyle s = null;
s = sheet.getWorkbook().createCellStyle();
cell.setCellStyle(s);
Font f = sheet.getWorkbook().createFont();
f.setBoldweight(Font.BOLDWEIGHT_BOLD);
s.setBorderBottom(CellStyle.BORDER_THIN);
s.setBorderLeft(CellStyle.BORDER_THIN);
s.setBorderRight(CellStyle.BORDER_THIN);
s.setBorderTop(CellStyle.BORDER_THIN);
s.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
s.setAlignment(CellStyle.ALIGN_CENTER);
s.setFont(f);
}
위에서 답변한 것처럼 셀 병합은 다음을 사용하여 수행할 수 있습니다.
sheet.addMergedRegion(new CellRangeAddress(frstRow, lastRow, firstColumnIndex, lastColumnIndex));
하지만 세포를 수직으로 정렬하기 위해, 저는 최근에 비슷한 문제에 직면했고 위의 답을 시도했지만, 사용했습니다.
CellUtil.setAlignment(dataCell, workbook, CellStyle.VERTICAL_CENTER);
aligned 포맷된 셀을 Horizontal Left로 정렬합니다.그래서 셀 내용의 수직 정렬만 설정하기 위해 다음 방법을 사용했습니다.
CellUtil.setCellStyleProperty(dataCell, workbook,CellUtil.VERTICAL_ALIGNMENT,CellStyle.VERTICAL_CENTER);
이것이 도움이 되길 바랍니다!!
해피 코딩
사용하다
style.setVerticalAlignment()
대신 수직 정렬을 설정합니다.
style.setAlignment().
세로 및 가로 정렬과 함께 열을 병합할 수 있습니다.
저는 A열의 2열부터 10열까지 같은 값을 가지고 있었습니다.
아래 코드를 사용하여 변수가 있는 데이터를 병합했습니다.sheet
이라XSSFSheet
의 매개 변수CellRangeAddress
매개 변수가 시작 행, 마지막 행, 시작 열 및 마지막 열이 되도록 합니다.내 예에서, 그 가치는USA
두 번째 행(인덱스는 1)과 마지막 값으로 시작합니다.USA
는 10번째 행에 있고 열은 첫 번째 열입니다.
CellRangeAddress ca = new CellRangeAddress(1,9,0,0);
sheet.addMergedRegion(ca);
위 코드를 실행했을 때 셀은 병합되었지만 텍스트는 중앙에 정렬되지 않았습니다.
문제를 을 이용했습니다.CellStyle
그리고.Cell
열의 두 을 첫번열텍스트두번행가다져로 .cell
, 을 '자'자로 합니다.cellStyle
그리고 이 스타일을 다음으로 설정합니다.cell
텍스트를 가운데에 정렬할 수 있습니다.
Cell cell = sheet.getRow(1).getCell(0);
CellStyle cellStyle = workbook.createCellStyle();
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cell.setCellStyle(cellStyle);
다음은 최종 결과입니다.
추가 참조:
- 사용된 jar 파일
언급URL : https://stackoverflow.com/questions/20093813/merge-and-align-center-cell-using-apache-poi
'programing' 카테고리의 다른 글
postgres 기본 표준 시간대 (0) | 2023.05.24 |
---|---|
가독성은 URL에서 텍스트를 추출하는 데 어떤 알고리즘을 사용합니까? (0) | 2023.05.24 |
Google Colab에서 여러 파일 또는 전체 폴더를 다운로드하려면 어떻게 해야 합니까? (0) | 2023.05.24 |
new Array(count)를 통해 생성된 배열에서 map(지도) 메서드가 작동하지 않는 이유는 무엇입니까? (0) | 2023.05.24 |
Githook 스크립트를 저장소와 함께 관리할 수 있습니까? (0) | 2023.05.24 |