1

我有三个或更多的 Excel 文件,其中包含不同的工作表,我需要创建一个新的空白文件,并将该工作表的副本(或克隆)复制到新文件中,并将它们按我需要的顺序放置,以便我可以填写相应的表格与数据。

如何使用 Jakarta POI ( XSSFWorkbook) 做到这一点?

4

3 回答 3

3

首先,我认为您的意思是Apache POI - 它已经有好几年不是 Apache Jakarta POI 了......

在将工作表从一个工作簿复制到另一个工作簿方面,可以做到,但需要一些编码。首先,您需要识别您使用的单元格样式,并将其克隆。确保跟踪哪个源单元格样式到哪个目标单元格样式,因为您不想继续重新创建,否则您将达到极限!CellStyle.cloneStyleFrom(CellStyle)是您想要的方法。

然后,对于每个源工作表,在目标工作簿中创建一个工作表。循环遍历所有源行,创建新的目标行。然后循环单元格,按单元格类型切换,获取适当的值并设置它。冲洗并重复!

于 2011-07-16T15:58:50.773 回答
0

FileOutputStream os = new FileOutputStream("differnetFileName") readWorkbook.write(os);

guess we can make use of write operation to OS with diff file name will work .

于 2016-06-30T07:57:50.037 回答
0

这是我将工作表从一个工作簿复制到另一个工作簿的实现。我按照 Gagravarr 的描述做了所有事情。这个解决方案对我有用。如果工作表没有表格等,则此代码将起作用。如果工作表包含简单文本(字符串、布尔值、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();
于 2016-12-21T04:49:00.387 回答