Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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
Java 如何使用POI Apache将表格从Excel文件单元格弹出式文档复制到另一个?_Java_Apache Poi - Fatal编程技术网

Java 如何使用POI Apache将表格从Excel文件单元格弹出式文档复制到另一个?

Java 如何使用POI Apache将表格从Excel文件单元格弹出式文档复制到另一个?,java,apache-poi,Java,Apache Poi,我试图从两个不同的XSSF工作簿中复制一张工作表。我已经编写了一个工作非常好的代码(见下文),但它没有考虑单元格的弹出文档,也没有复制它(这是合乎逻辑的,因为我没有编写函数性)。 我已经搜索了ApachePOI文档,看起来没有办法做到这一点。你知道我该怎么复制粘贴这些信息吗 public class CopySheets { public static void copySheet(String sheetName, XSSFWorkbook wbSrc,XSSFWorkbook w

我试图从两个不同的XSSF工作簿中复制一张工作表。我已经编写了一个工作非常好的代码(见下文),但它没有考虑单元格的弹出文档,也没有复制它(这是合乎逻辑的,因为我没有编写函数性)。 我已经搜索了ApachePOI文档,看起来没有办法做到这一点。你知道我该怎么复制粘贴这些信息吗

public class CopySheets {


    public static void copySheet(String sheetName, XSSFWorkbook wbSrc,XSSFWorkbook wbDest) throws IOException {
        XSSFSheet srcSheet = null;
        XSSFRow srcRow = null;
        XSSFCell srcCell = null;
        XSSFSheet destSheet = null;
        XSSFRow destRow = null;
        XSSFCell destCell = null;
        int fCell = 0;
        int lCell = 0;
        int fRow = 0;
        int lRow = 0;
        System.out.println(sheetName);
        srcSheet = wbSrc.getSheet(sheetName);
        System.out.println(srcSheet);
            if (srcSheet != null) {
                destSheet = wbDest.createSheet(sheetName);
                fRow = srcSheet.getFirstRowNum();
                lRow = srcSheet.getLastRowNum();
                for (int iRow = fRow; iRow <= lRow; iRow++) {
                    srcRow = srcSheet.getRow(iRow);
                    destRow = destSheet.createRow(iRow);
                    if (srcRow != null) {
                        fCell = srcRow.getFirstCellNum();
                        lCell = srcRow.getLastCellNum();
                        for (int iCell = fCell; iCell < lCell; iCell++) {
                            srcCell = srcRow.getCell(iCell);
                            destCell = destRow.createCell(iCell);
                            if (srcCell != null) {
                                switch (srcCell.getCellTypeEnum()) {
                                case BLANK:
                                    destCell.setCellValue("");
                                    break;

                                case BOOLEAN:
                                    destCell.setCellValue(srcCell.getBooleanCellValue());
                                    break;

                                case ERROR:
                                    destCell.setCellErrorValue(srcCell.getErrorCellValue());
                                    break;

                                case FORMULA:
                                    destCell.setCellFormula(srcCell.getCellFormula());
                                    break;

                                case NUMERIC:
                                    destCell.setCellValue(srcCell.getNumericCellValue());
                                    break;

                                case STRING:
                                    destCell.setCellValue(srcCell.getStringCellValue());
                                    break;
                                default:
                                    destCell.setCellFormula(srcCell.getCellFormula());
                                }
                                CellStyle origStyle = srcCell.getCellStyle(); // Or from a cell
                                CellStyle newStyle = wbDest.createCellStyle();
                                newStyle.cloneStyleFrom(origStyle);
                                destCell.setCellStyle(newStyle);
                                
                                Comment origComment=srcCell.getCellComment();
                                destCell.setCellComment(origComment);
                                
                                
                                
                            }
                        }
                    }
                }
            }
        BufferedOutputStream bos = new BufferedOutputStream(
        new FileOutputStream("workbook.xls", true));
        wbDest.write(bos);
        bos.close();
    }
}
公共类副本{
公共静态无效复制表(字符串sheetName、XSSFWorkbook wbSrc、XSSFWorkbook wbDest)引发IOException{
XSSFSheet srcSheet=null;
XSSFRow srcRow=null;
XSSFCell srcCell=null;
XSSFSheet destSheet=null;
XSSFRow destRow=null;
XSSFCell destCell=null;
int fCell=0;
int-lCell=0;
int fRow=0;
int lRow=0;
System.out.println(图纸名称);
srcSheet=wbSrc.getSheet(sheetName);
系统输出打印号(srcSheet);
if(srcSheet!=null){
destSheet=wbDest.createSheet(sheetName);
fRow=srcSheet.getFirstRowNum();
lRow=srcSheet.getLastRowNum();

对于(int-iRow=fRow;iRow好的,我找到了答案,原来POI有一些东西可以让我们在整个工作表上获得这些信息,所以我在代码中添加了这一点,它就像一个符咒

List<XSSFDataValidation> validations=srcSheet.getDataValidations();
                for (XSSFDataValidation validation:validations){
                    destSheet.addValidationData(validation);
                }
List validations=srcSheet.getDataValidations();
for(XSSFDataValidation验证:验证){
destSheet.addValidationData(验证);
}

查看文档-

似乎src Comment对象的
getAddress()
方法将返回对它以前附加到的单元格(即src单元格)的引用

您应该尝试创建新的
注释
,而不是

Comment origComment=srcCell.getCellComment();
destCell.setCellComment(origComment);

你应该用复印机

XSSFWorkbook workbookFrom = new XSSFWorkbook(new File("/path/to/workbookFrom.xlsx"));
XSSFSheet sheetFrom = workbookFrom.getSheetAt(0);

XSSFWorkbook workbookTo = new XSSFWorkbook(new File("/path/to/workbookTo.xlsx"));
XSSFSheet sheetTo = workbookTo.createSheet("sheet1");
workbookTo.setSheetOrder("sheet1", 0);

XSSFRangeCopier xssfRangeCopier = new XSSFRangeCopier(sheetFrom, sheetTo);
//copy the row height and column width, and find the max column num
int lastRow = sheetFrom.getLastRowNum();
int lastCol = 0;
for (int i = 0; i < lastRow; i++) {
    Row row = sheetFrom.getRow(i);
    if (row != null) {
        if (row.getLastCellNum() > lastCol) {
            lastCol = row.getLastCellNum();
        }
        sheetTo.setDefaultRowHeight(sheetFrom.getDefaultRowHeight());
    }
}

for (int j = 0; j < lastCol; j++) {
    sheetTo.setColumnWidth(j, sheetFrom.getColumnWidth(j));
}

//copy contents from source sheet to destination sheet
CellRangeAddress cellAddresses = new CellRangeAddress(0, lastRow, 0, lastCol);
xssfRangeCopier.copyRange(cellAddresses, cellAddresses, true, true);

workbookTo.write(new FileOutputStream(new File("/path/to/worksheetTo.xlsx")));
XSSFWorkbook workbookFrom=newxssfworkbook(新文件(“/path/to/workbookFrom.xlsx”);
XSSFSheet sheetFrom=工作簿from.getSheetAt(0);
XSSF工作簿工作簿到=新XSSF工作簿(新文件(“/path/to/workbookTo.xlsx”);
XSSFSheet sheetTo=workbookTo.createSheet(“sheet1”);
工作簿到.设置表(“表1”,0);
XSSFRangeCopier XSSFRangeCopier=新XSSFRangeCopier(sheetFrom,sheetTo);
//复制行高和列宽,并找到最大列数
int lastRow=sheetFrom.getLastRowNum();
int-lastCol=0;
对于(int i=0;ilastCol){
lastCol=row.getLastCellNum();
}
sheetTo.setDefaultRowHeight(sheetFrom.getDefaultRowHeight());
}
}
对于(int j=0;j