Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/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 阿帕奇波伊。复印纸_Java_Apache Poi - Fatal编程技术网

Java 阿帕奇波伊。复印纸

Java 阿帕奇波伊。复印纸,java,apache-poi,Java,Apache Poi,我正在使用ApachePOI创建一个excel文档。要在工作簿中创建新工作表,我编写下一个代码: Workbook wb = new HSSFWorkbook(); Sheet sh = wb.createSheet(); 此代码用于创建工作表并将其添加到工作簿。但我想先创建工作表,然后将其添加到工作簿中。Smth是这样的: Sheet sh = new HSSFSheet(); wb.addSheet(sh); 我需要这样的东西,因为我想将数据从一个工作簿的一张工作表复制到另一个工作簿的

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

Workbook wb = new HSSFWorkbook(); 
Sheet sh = wb.createSheet();
此代码用于创建工作表并将其添加到工作簿。但我想先创建工作表,然后将其添加到工作簿中。Smth是这样的:

Sheet sh = new HSSFSheet();
wb.addSheet(sh);
我需要这样的东西,因为我想将数据从一个工作簿的一张工作表复制到另一个工作簿的另一张工作表(工作簿接口有方法
工作表克隆表(int)
)。但工作簿接口并没有像addSheet(Sheet sh)这样的方法。 而且HSSFWorkbook是最后一个类,所以我不能扩展它来实现add方法
如何才能做到这一点?

您不能只从一个工作簿中获取一个工作表对象,然后将其添加到另一个工作簿中

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

POI版本
Workbook oldWB=newxssfworkbook(newfileinputstream(“C:\\input.xlsx”);
工作簿newWB=newxssfworkbook();
CellStyle newStyle=newWB.createCellStyle();//需要此选项将样式从旧图纸复制到新图纸。下一步将在下面处理
行行;
细胞;
对于(int i=0;i
如果您的要求是复制整张图纸而不留下或添加任何内容。我认为消除的过程比上面的代码更好更快。您不必担心丢失公式、图形、表格、样式、字体等

xssf工作簿wb=新的xssf工作簿(“C:\\abc.xlsx”);
对于(int i=wb.getNumberOfSheets()-1;i>=0;i--){
如果(!wb.getSheetName(i).contentEquals(“一月”)//这是一个占位符。您将在此处插入逻辑以获取所需的工作表。
wb.removesetat(i);//只需删除与上面if语句中的条件不匹配的工作表即可
}
FileOutputStream out=新的FileOutputStream(新文件(“C:\\xyz.xlsx”);
wb.写(出);
out.close();
POI版本>=v4.0
从4.0版开始,
Cell.Cell\u TYPE\u BLANK
Row.CREATE\u NULL\u As\u BLANK
不存在(它们已弃用)。使用
CellType.*
Row.MissingCellPolicy.*

您应该使用RangeCopier

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);
    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));
    }

    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=新XSSFRangeCopi