首页 文章

Apache POI . 复制表

提问于
浏览
4

我正在使用apache poi创建一个excel文档 . 要在工作簿中创建新工作表,我编写下一个代码:

Workbook wb = new HSSFWorkbook(); 
Sheet sh = wb.createSheet();

此代码创建并向工作簿添加工作表 . 但是我想先创建工作表然后将其添加到工作簿中 . Smth是这样的:

Sheet sh = new HSSFSheet();
wb.addSheet(sh);

我需要这样的东西,因为我想将数据从一个工作簿的一张工作簿复制到另一张工作簿的另一张工作簿(工作簿界面有方法 Sheet cloneSheet(int) ) . 但是Workbook界面没有扩展它来实现add方法我该怎么做?

2 回答

  • 2

    您不能只从一个工作簿中获取Sheet对象,并将其添加到另一个工作簿 .

    您需要做的是同时打开旧工作簿和新工作簿,并在新工作簿中创建工作表 . 接下来,将旧工作表中使用的所有样式克隆到新工作表(HSSFCellStyle有一种方法,用于将样式从一个工作簿克隆到另一个工作簿) . 最后,遍历所有单元格并将其复制过来 .

  • 9

    好吧,我试着去做Gagravarr上面所说的话 . 这个解决方案适合我 . 如果工作表没有表等,此代码将起作用 . 如果工作表包含简单文本(String,boolean,int等),公式,此解决方案将起作用 .

    Workbook oldWB = new XSSFWorkbook(new FileInputStream("C:\\input.xlsx"));
    Workbook newWB = new XSSFWorkbook();
    CellStyle newStyle = newWB.createCellStyle(); // Need this to copy over styles from old sheet to new sheet. Next step will be processed below
    Row row;
    Cell cell;
    for (int i = 0; i < oldWB.getNumberOfSheets(); i++) {
        XSSFSheet sheetFromOldWB = (XSSFSheet) oldWB.getSheetAt(i);
        XSSFSheet sheetForNewWB = (XSSFSheet) newWB.createSheet(sheetFromOldWB.getSheetName());
        for (int rowIndex = 0; rowIndex < sheetFromOldWB.getPhysicalNumberOfRows(); rowIndex++) {
            row = sheetForNewWB.createRow(rowIndex); //create row in this new sheet
            for (int colIndex = 0; colIndex < sheetFromOldWB.getRow(rowIndex).getPhysicalNumberOfCells(); colIndex++) {
                cell = row.createCell(colIndex); //create cell in this row of this new sheet
                Cell c = sheetFromOldWB.getRow(rowIndex).getCell(colIndex, Row.CREATE_NULL_AS_BLANK ); //get cell from old/original WB's sheet and when cell is null, return it as blank cells. And Blank cell will be returned as Blank cells. That will not change.
                    if (c.getCellType() == Cell.CELL_TYPE_BLANK){
                        System.out.println("This is BLANK " +  ((XSSFCell) c).getReference());
                    }
                    else {  //Below is where all the copying is happening. First It copies the styles of each cell and then it copies the content.              
                    CellStyle origStyle = c.getCellStyle();
                    newStyle.cloneStyleFrom(origStyle);
                    cell.setCellStyle(newStyle);            
    
                     switch (c.getCellTypeEnum()) {
                        case STRING:                            
                            cell.setCellValue(c.getRichStringCellValue().getString());
                            break;
                        case NUMERIC:
                            if (DateUtil.isCellDateFormatted(cell)) {                             
                                cell.setCellValue(c.getDateCellValue());
                            } else {                              
                                cell.setCellValue(c.getNumericCellValue());
                            }
                            break;
                        case BOOLEAN:
    
                            cell.setCellValue(c.getBooleanCellValue());
                            break;
                        case FORMULA:
    
                            cell.setCellValue(c.getCellFormula());
                            break;
                        case BLANK:
                            cell.setCellValue("who");
                            break;
                        default:
                            System.out.println();
                        }
                    }
                }
            }
    
        }
        //Write over to the new file
        FileOutputStream fileOut = new FileOutputStream("C:\\output.xlsx");
        newWB.write(fileOut);
        oldWB.close();
        newWB.close();
        fileOut.close();
    

    如果您的要求是在不离开或添加任何内容的情况下复制整张纸 . 我认为消除过程比上面的代码更好,更快 . 而且您不必担心丢失公式,图纸,表格,样式,字体等 .

    XSSFWorkbook wb = new XSSFWorkbook("C:\\abc.xlsx");
    for (int i = wb.getNumberOfSheets() - 1; i >= 0; i--) {
            if (!wb.getSheetName(i).contentEquals("January")) //This is a place holder. You will insert your logic here to get the sheets that you want.  
                wb.removeSheetAt(i); //Just remove the sheets that don't match your criteria in the if statement above               
    }
    FileOutputStream out = new FileOutputStream(new File("C:\\xyz.xlsx"));
    wb.write(out);
    out.close();
    

相关问题