POI XSSF API kullanıyorum ve bir sayfa aktarmak istiyorum.POI SS/XSSF ile nasıl sayfa aktarılır?
Bunu nasıl yapabilirim?
Teşekkürler.
POI XSSF API kullanıyorum ve bir sayfa aktarmak istiyorum.POI SS/XSSF ile nasıl sayfa aktarılır?
Bunu nasıl yapabilirim?
Teşekkürler.
Transpoze olarak, A2 ile birlikte B1 ve A3 ile C1 (yani sütunlar satır haline gelir) olarak mı aktarılır?
Böyle bir durumda, yerleşik bir şey yoktur, bu yüzden biraz kod yazmanız gerekir. Büyük olasılıkla bir çift hücre kapmak, bir tane (değer ve stil) içeriğini kaydetmek, ikincisini birinciye kopyalamak, sonra da ikincisinin üzerine yazmak istersiniz. Tüm okuma/yazma parçalarından emin değilseniz numaralı telefona bakın.
Aynı cevabı arıyordum ve kendim kodlamak zorunda kaldım. Oldukça basit olan benim çözüm ekledim:
ben kullandım koddur: CellModel Cep bulunan verileri tutan bir sarıcı yoktur ki
public static void transpose(Workbook wb, int sheetNum, boolean replaceOriginalSheet) {
Sheet sheet = wb.getSheetAt(sheetNum);
Pair<Integer, Integer> lastRowColumn = getLastRowAndLastColumn(sheet);
int lastRow = lastRowColumn.getFirst();
int lastColumn = lastRowColumn.getSecond();
LOG.debug("Sheet {} has {} rows and {} columns, transposing ...", new Object[] {sheet.getSheetName(), 1+lastRow, lastColumn});
List<CellModel> allCells = new ArrayList<CellModel>();
for (int rowNum = 0; rowNum <= lastRow; rowNum++) {
Row row = sheet.getRow(rowNum);
if (row == null) {
continue;
}
for (int columnNum = 0; columnNum < lastColumn; columnNum++) {
Cell cell = row.getCell(columnNum);
allCells.add(new CellModel(cell));
}
}
LOG.debug("Read {} cells ... transposing them", allCells.size());
Sheet tSheet = wb.createSheet(sheet.getSheetName() + "_transposed");
for (CellModel cm : allCells) {
if (cm.isBlank()) {
continue;
}
int tRow = cm.getColNum();
int tColumn = cm.getRowNum();
Row row = tSheet.getRow(tRow);
if (row == null) {
row = tSheet.createRow(tRow);
}
Cell cell = row.createCell(tColumn);
cm.insertInto(cell);
}
lastRowColumn = getLastRowAndLastColumn(sheet);
lastRow = lastRowColumn.getFirst();
lastColumn = lastRowColumn.getSecond();
LOG.debug("Transposing done. {} now has {} rows and {} columns.", new Object[] {tSheet.getSheetName(), 1+lastRow, lastColumn});
if (replaceOriginalSheet) {
int pos = wb.getSheetIndex(sheet);
wb.removeSheetAt(pos);
wb.setSheetOrder(tSheet.getSheetName(), pos);
}
}
private static Pair<Integer, Integer> getLastRowAndLastColumn(Sheet sheet) {
int lastRow = sheet.getLastRowNum();
int lastColumn = 0;
for (Row row : sheet) {
if (lastColumn < row.getLastCellNum()) {
lastColumn = row.getLastCellNum();
}
}
return new Pair<Integer, Integer>(lastRow, lastColumn);
}
(Eğer daha özellik ekleyebilirsiniz eğer örneğin yorumları gibi, ...) :
static class CellModel {
private int rowNum = -1;
private int colNum = -1;
private CellStyle cellStyle;
private int cellType = -1;
private Object cellValue;
public CellModel(Cell cell) {
if (cell != null) {
this.rowNum = cell.getRowIndex();
this.colNum = cell.getColumnIndex();
this.cellStyle = cell.getCellStyle();
this.cellType = cell.getCellType();
switch (this.cellType) {
case Cell.CELL_TYPE_BLANK:
break;
case Cell.CELL_TYPE_BOOLEAN:
cellValue = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_ERROR:
cellValue = cell.getErrorCellValue();
break;
case Cell.CELL_TYPE_FORMULA:
cellValue = cell.getCellFormula();
break;
case Cell.CELL_TYPE_NUMERIC:
cellValue = cell.getNumericCellValue();
break;
case Cell.CELL_TYPE_STRING:
cellValue = cell.getRichStringCellValue();
break;
}
}
}
public boolean isBlank() {
return this.cellType == -1 && this.rowNum == -1 && this.colNum == -1;
}
public void insertInto(Cell cell) {
if (isBlank()) {
return;
}
cell.setCellStyle(this.cellStyle);
cell.setCellType(this.cellType);
switch (this.cellType) {
case Cell.CELL_TYPE_BLANK:
break;
case Cell.CELL_TYPE_BOOLEAN:
cell.setCellValue((boolean) this.cellValue);
break;
case Cell.CELL_TYPE_ERROR:
cell.setCellErrorValue((byte) this.cellValue);
break;
case Cell.CELL_TYPE_FORMULA:
cell.setCellFormula((String) this.cellValue);
break;
case Cell.CELL_TYPE_NUMERIC:
cell.setCellValue((double) this.cellValue);
break;
case Cell.CELL_TYPE_STRING:
cell.setCellValue((RichTextString) this.cellValue);
break;
}
}
public CellStyle getCellStyle() {
return cellStyle;
}
public int getCellType() {
return cellType;
}
public Object getCellValue() {
return cellValue;
}
public int getRowNum() {
return rowNum;
}
public int getColNum() {
return colNum;
}
}
teşekkürler, ama değerlerini kaydetme ve bunları geri yapıştırmak geldikten sonra ben bir istisna var: parçacığı "ana" java.lang.IllegalArgumentException: Levha indeksi (1) aralık (0 dışındadır. .0) ..... bunu çözmek için ne yapabilirim? – Yoni
Tahminimce aynı çalışma kitabını kullanmıyorsunuz veya bir sayfa oluşturmamış olduğunuz yeni bir çalışma kitabını kullanıyorsunuz. Yeni Çalışma Kitabında bir sayfayı oluşturmadan önce oluşturmanız gerekir! – Gagravarr