5
A
回答
4
轉置,如交換A2與B1和A3與C1(所以列成行)?
如果是這樣,就沒有內置任何東西,所以你需要自己做一些編碼。你可能想抓住一對單元格,保存一個單元格的內容(值和樣式),將第二個單元格複製到第一個單元格,然後覆蓋第二個單元格。如果您不確定所有閱讀/書寫部分,請參閱quick guide。
2
我正在尋找相同的答案,不得不自己編碼。我們已經附上我的解決方案很簡單:
- 確定各行的每一列
- 保存從細胞數量
- 確定列的最大數目的使用
- 迭代器在每一行,即行/列到一個簡單的列表作爲「CellModel」型
- 一旦這樣做,遍歷所有CellModels
- 開關列和行索引和CellModel保存到片
我使用的代碼是:
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);
}
由此CellModel一個持單元格包含數據的包裝(你可以添加更多的屬性,如果你喜歡例如,評論,...) :
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;
}
}
相關問題
- 1. 如何在poi XWPF的指定位置插入表格?
- 2. KDB/Q如何轉置表格?
- 3. 如何在Excel或apache POI中「格式化爲表格」?
- 4. 如何將POI HSSFWorkbook轉換爲字節?
- 5. 如何設置數據透視表字段數字格式細胞與Apache POI
- 6. 如何使用apache poi設置3個單元格的註釋
- 7. 使用poi,如何將單元格類型設置爲編號
- 8. 使用Apache POI庫將Excel電子表格轉換爲HTML
- 9. Java apache poi設置單元格公式
- 10. Apache POI將單元格設置爲0
- 11. 如何使用POI SXSSF讀取大型電子表格
- 12. 如何使用Apache Poi添加表格標題下拉菜單
- 13. 如何使用POI語言添加表格MS Word
- 14. 如何將表插入poi單詞中的單元格中?
- 15. ResultSet轉Excel(* .xlsx)表使用Apache POI
- 16. 使用Apache POI刪除Excel表格
- 17. 的Apache POI - 插入行Excel表格
- 18. Java:Apache POI Excel電子表格GUI查看
- 19. Apache POI未能應用表格樣式
- 20. 使用Apache POI編寫Excel表格
- 21. Apache POI Excel表格 - 總計行數
- 22. 使用Apache poi編輯excel表格
- 23. 轉換的PPT與Apache POI
- 24. Apache POI:識別Excel表格中的原始表格
- 25. 使用Apache Poi解析Word文檔中表格中的表格
- 26. 如何使用Apache POI
- 27. 如何將Excel表格轉換爲Trac Wiki表格格式?
- 28. 如何轉置ASP.NET ListView網格佈局?
- 29. Wikitude POI未設置位置
- 30. 如何使用Apache POI從Excel電子表格獲取圖表信息?
感謝,但節約的價值和未來將其粘貼回來後,我得到了一個異常:異常在線程「主」 java.lang.IllegalArgumentException異常:表指數(1)超出範圍(0。 .0).....我能做些什麼來解決這個問題? – Yoni 2011-05-05 19:34:16
我的猜測是要麼不使用相同的工作簿,要麼使用的是尚未創建工作表的新工作簿。在填充工作簿之前,您需要在新工作簿中創建工作表! – Gagravarr 2011-05-05 23:15:10