Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 如何使用POI SS/XSSF转换工作表?_Excel_Apache Poi_Transpose_Xssf - Fatal编程技术网

Excel 如何使用POI SS/XSSF转换工作表?

Excel 如何使用POI SS/XSSF转换工作表?,excel,apache-poi,transpose,xssf,Excel,Apache Poi,Transpose,Xssf,我正在使用POI XSSF API,我想转置一张表 我该怎么做 谢谢。换位,如将A2与B1交换,将A3与C1交换(因此列变为行) 如果是这样的话,没有内置的东西,所以你需要自己编写一点代码。您可能希望获取一对单元格,保存其中一个单元格的内容(值和样式),将第二个单元格复制到第一个单元格,然后覆盖第二个单元格 如果您对所有的阅读/写作部分都不确定,请参阅。我一直在寻找相同的答案,并且必须自己编写代码。我附上了我的解决方案,非常简单: 确定行数 确定使用的最大列数 遍历每行和每列的迭代器 将该行/列

我正在使用POI XSSF API,我想转置一张表

我该怎么做


谢谢。

换位,如将A2与B1交换,将A3与C1交换(因此列变为行)

如果是这样的话,没有内置的东西,所以你需要自己编写一点代码。您可能希望获取一对单元格,保存其中一个单元格的内容(值和样式),将第二个单元格复制到第一个单元格,然后覆盖第二个单元格


如果您对所有的阅读/写作部分都不确定,请参阅。

我一直在寻找相同的答案,并且必须自己编写代码。我附上了我的解决方案,非常简单:

  • 确定行数
  • 确定使用的最大列数
  • 遍历每行和每列的迭代器
  • 将该行/列中的单元格保存为“CellModel”类型的简单列表
  • 完成后,迭代所有单元模型
  • 切换列和行索引,并将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);
    }
    

    谢谢,但是在保存这些值并将它们粘贴回来之后,我得到了一个异常:线程“main”java.lang.IllegalArgumentException中的异常:工作表索引(1)超出范围(0..0)…我能做些什么来解决这个问题呢?我猜要么你没有使用相同的工作簿,要么你正在使用一个没有创建工作表的新工作簿。您需要在新工作簿中创建工作表,然后才能填充它!
    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;
        }
    
    }