用Java中的JXL复制工作表

用Java中的JXL复制工作表,java,jxl,Java,Jxl,我想将工作表从现有XLS文档复制到新位置。 我怎样才能用JXL做到这一点 Workbook w1 = Workbook.getWorkbook(new File("ExistingDocument.xls"), settings); WritableWorkbook w2 = Workbook.createWorkbook(new File("NewDocument.xls")); /* So here, I would like copy the first sheet from w1 t

我想将工作表从现有XLS文档复制到新位置。 我怎样才能用JXL做到这一点

Workbook w1 = Workbook.getWorkbook(new File("ExistingDocument.xls"), settings);

WritableWorkbook w2 = Workbook.createWorkbook(new File("NewDocument.xls"));

/* So here, I would like copy the first sheet from w1 to the second sheet of w2 ... */

w2.write();
w2.close();

w1.close();
编辑: w1.getSheet0.getCell0,0不是可写单元格,因此我无法使用copyTo方法。 有没有办法将单元格/工作表从w1添加到w2工作簿? 编辑2: 那么,我是否必须将工作簿的可写副本创建到其他文件中? edit3:或者有其他的免费库可以做到这一点吗

更新:

当我运行这段代码时,我在第行得到jxl.common.AssertionFailed异常

WritableCellFormat newFormat = new WritableCellFormat(readFormat);
如果我删除这一行并将代码更改为

newCell.setCellFormatreadFormat

然后单元格样式不会复制到字体、单元格边框等

try {
    Workbook sourceDocument = Workbook.getWorkbook(new File("C:\\source.xls"));
    WritableWorkbook writableTempSource = Workbook.createWorkbook(new File("C:\\temp.xls"), sourceDocument);
    WritableWorkbook copyDocument = Workbook.createWorkbook(new File("C:\\copy.xls"));
    WritableSheet sourceSheet = writableTempSource.getSheet(0);
    WritableSheet targetSheet = copyDocument.createSheet("sheet 1", 0);

    for (int row = 0; row < sourceSheet.getRows(); row++) {
        for (int col = 0; col < sourceSheet.getColumns(); col++) {
            WritableCell readCell = sourceSheet.getWritableCell(col, row);
            WritableCell newCell = readCell.copyTo(col, row);
            CellFormat readFormat = readCell.getCellFormat();
                    /* exception on the following line */
            WritableCellFormat newFormat = new WritableCellFormat(readFormat);
            newCell.setCellFormat(newFormat);
            targetSheet.addCell(newCell);
        }
    }
    copyDocument.write();
    copyDocument.close();
    writableTempSource.close();
    sourceDocument.close();
} catch (Exception e) {
    e.printStackTrace();
}
如何将单元格样式也复制到新单元格?

如何将一个工作簿中的工作表复制到另一个工作簿中的新工作表

这是可以做到的,但需要做一些工作。首先,您必须在两个嵌套for循环中复制it单元。对于每个单元格,您需要调用copyTo方法,该方法将生成一个深度副本。但是,格式只是浅复制的,因此需要获取单元格格式并使用该格式的复制构造函数,然后在刚刚复制的单元格上调用setCellFormat。然后将重复单元格添加到新的电子表格中

代码可能如下所示:

资源:


你必须一个接一个地遍历单元格,并将它们添加到新的工作表中

请参见“问题”下的“如何将一个工作簿中的工作表复制到另一个工作簿中的新工作表?”

if (readFormat != null) {

    WritableCellFormat newFormat = new WritableCellFormat(readFormat);

    newCell.setCellFormat(newFormat);

    newSheet.addCell(newCell);

}
如上所述,检查readFormat是否不为空 注意警告“超过最大格式记录数”。使用默认格式。请尝试使用类似映射的方法来控制可写CellFormat实例的数量

public static void createSheetCopy(WritableWorkbook workbook, int from, int to, String sheetName) throws WriteException {
    WritableSheet sheet = workbook.getSheet(from);
    WritableSheet newSheet = workbook.createSheet(sheetName, to);
    // Avoid warning "Maximum number of format records exceeded. Using default format."
    Map<CellFormat, WritableCellFormat> definedFormats = new HashMap<CellFormat, WritableCellFormat>();
    for (int colIdx = 0; colIdx < sheet.getColumns(); colIdx++) {
        newSheet.setColumnView(colIdx, sheet.getColumnView(colIdx));
        for (int rowIdx = 0; rowIdx < sheet.getRows(); rowIdx++) {
            if (colIdx == 0) {
                newSheet.setRowView(rowIdx, sheet.getRowView(rowIdx));
            }
            WritableCell readCell = sheet.getWritableCell(colIdx, rowIdx);
            WritableCell newCell = readCell.copyTo(colIdx, rowIdx);
            CellFormat readFormat = readCell.getCellFormat();
            if (readFormat != null) {
                if (!definedFormats.containsKey(readFormat)) {
                    definedFormats.put(readFormat, new WritableCellFormat(readFormat));
                }
                newCell.setCellFormat(definedFormats.get(readFormat));
            }
            newSheet.addCell(newCell);
        }
    }
}

只是一个更新,copyto函数不适用于单元格,一些修改过的代码: 这需要一个可读的工作簿、要复制的工作表的索引号、可写的工作簿和需要复制工作表的索引号,可以很好地将工作表从一个工作簿复制到另一个工作簿

private static WritableSheet createSheetCopy(Workbook w, int from, int to,
            WritableWorkbook writeableWorkbook) throws WriteException {
        Sheet sheet = w.getSheet(from);
        WritableSheet newSheet = writeableWorkbook.getSheet(to);
        // Avoid warning
        // "Maximum number of format records exceeded. Using default format."
        Map<CellFormat, WritableCellFormat> definedFormats = new HashMap<CellFormat, WritableCellFormat>();
        for (int colIdx = 0; colIdx < sheet.getColumns(); colIdx++) {
            newSheet.setColumnView(colIdx, sheet.getColumnView(colIdx));
            for (int rowIdx = 0; rowIdx < sheet.getRows(); rowIdx++) {
                if (colIdx == 0) {
                    newSheet.setRowView(rowIdx, sheet.getRowView(rowIdx));
                }
                Cell readCell = sheet.getCell(colIdx, rowIdx);
                Label label = new Label(colIdx, rowIdx, readCell.getContents());
                CellFormat readFormat = readCell.getCellFormat();
                if (readFormat != null) {
                    if (!definedFormats.containsKey(readFormat)) {
                        definedFormats.put(readFormat, new WritableCellFormat(
                                readFormat));
                    }
                    label.setCellFormat(definedFormats.get(readFormat));
                }
                newSheet.addCell(label);
            }
        }
        return newSheet;
    }
JXL API允许用户在运行时读取、写入、创建和修改Excel.xls工作簿中的工作表。它不支持.xlsx格式

jxlapi支持excel95、97、2000、XP和2003版本的Excel文档。这些文档包含扩展名.xls 使用以下功能复制JXL工作簿工作表

public static void copySheetToWritableSheetjxl.Sheet srcscheet,jxl.write.WritableSheet destSheet抛出JXlexException{ int numrows=srcSheet.getRows; int numcols=srcSheet.getColumns; System.out.printlnRows:+numrows+,Col:+numcols; 对于int rowIdx=0;rowIdx 公共类JXL\U XLS\U报告{ 静态字符串filePath=C:/Yash/, sourceFile=filePath+JXLWorkbook.xls,sourceFileSheetName=formattabbsheet, destinationFile=filePath+JXLWorkbook\u Copy.xls; 公共静态无效主字符串[]args引发异常{ File sourceDST=新的FiledestinationFile; jxl.write.WritableWorkbook工作簿=workbook.createWorkbooksourceDST; int numberOfSheets=workbook.getNumberOfSheets; System.out.println张数:+numberOfSheets; //创建空工作表 jxl.write.WritableSheet WritableSheet=工作簿.createSheetsourceFileSheetName+_777,numberOfSheets+1; 文件源=新文件源文件; InputStream fileInStream=新文件InputStreamSource; jxl.Workbook templateWorkbook=Workbook.getWorkbookfileInStream,getDefaultWorkbookSettings; jxl.Sheet srcSheet=templateWorkbook.getSheetsourceFileSheetName; copySheetToWritableSheetsrcSheet,writableSheet; WorkbookSettings wbSettings=新的WorkbookSettings; wbSettings.setRationalizationfalse; 封闭式工作簿; } 静态jxl.biff.DisplayFormat DisplayFormat=新的数字格式0.000; 静态WritableFont ARIAL_10_PT=新的WritableFontWritableFont.ARIAL; //静态WritableFont DataFont=新的WritableFontWritableFont.ARIAL,8,WritableFont.BOLD; public static void copySheetToWritableSheetjxl.Sheet srcscheet,jxl.write.WritableSheet destSheet抛出JXlexException{ // ... } 公共静态无效closeWorkbookWritableWorkbook工作簿引发IOException、JXleException{ 如果工作簿==null 回来 如果workbook.getNumberOfSheets==0{ 工作簿.createSheetNo数据,0;//否则指针错误 } //以Excel格式写出此工作簿中的数据 练习册。写作; //关闭并释放分配的内存 工作簿.close; } 公共静态Workbooks设置GetDefaultWorkbooks设置{ WorkbookSettings WorkbookSettings=新的WorkbookSettings; 工作簿设置。设置编码ISO-8859-15; workbookSettings.setLocaleScale.GERMANY; workbookSettings.setCharacterSet1200; workbookSettings.setExcelRegionalSettingsUK; workbookSettings.setExcelDisplayLanguageUS; workbookSettings.setPropertySetsfalse; 返回工作簿设置; } public static void copyCellValueSheet srcSheet、int srcCol、int srcRow、writeablesheet destSheet、int destCol、int destRow抛出JxException{ Cell srcCell=srcSheet.getCellsrcCol,srcRow; CellType type=srcCell.getType; WritableCell newCell=null; 如果type==CellType.LABEL{ newCell=new LabeldestCol,destRow,LabelCell srcCell.getString; }如果type==CellType.NUMBER,则为else{ newCell=newnumberdestcol,destRow,NumberCell srcCell.getValue; }如果type==CellType.BOOLEAN,则为else{ newCell=new jxl.write.BooleandestCol、destRow、BooleanCell srcCell.getValue; }如果type==CellType.DATE,则为else{ newCell=new DateTimedestCol,destRow,DateCell srcCell.getDate; }如果type==CellType.EMPTY,则为else{ newCell=newemptycelldestcol,destRow; }如果type==CellType.NUMBER\u公式,则为else ||type==CellType.STRING\u公式 ||type==CellType.BOOLEAN\u公式{ 字符串公式=FormulaCell srcCell.getFormula; newCell=新公式destcol、destRow、formula; }否则{ 字符串cellValue=srcCell.getContents; newCell=新的LabeldestCol、DESTOW、cellValue; } //设置列大小 CellView CellView=srcSheet.getColumnViewsrcCol; destSheet.setColumnViewsrcCol,cellView; destSheet.addCellnewCell; } 公共静态void copyCellFo rmatSheet srcSheet、int-srcCol、int-srcRow、WritableSheet destSheet、int-destCol、int-destrowJxException{ CellFormat format=srcSheet.getCellsrcCol,srcRow.getCellFormat; 如果format==null返回; WritableCell-destCell=destSheet.getWritableCelldestCol,destRow; 如果destCell.getType==CellType.EMPTY{ WritableCell newCell=新的LabelTestCol,destRow; newCell.setCellFormatformat; destSheet.addCellnewCell; }否则{ destCell.setCellFormatformat; } } }
要使用copyTo方法,单元格必须是可写单元格。那么我怎样才能将一个单元格转换成一个可写单元格呢?@János Harsányi,为此你需要一个可写工作表,getWritableCell将返回一个可写单元格,为此你需要一个可写工作簿。但是,如何将excel文档作为可写工作簿打开呢?有可能从一个文件复制到另一个文件吗?@János Harsányi,你不能简单地打开一个可写工作簿。你必须用getWorkbook打开一个工作簿,用createWorkbook在临时文件中创建一个可写工作簿,并在参数中打开工作簿。@János Harsányi,编辑后,您需要检查readFormat是否为空。您的方法太棒了!我可以复制单元格数据和边框样式,但不能复制合并区域。我失去了我的合并区。怎么做,兄弟!请紧急帮助我。提前谢谢。。WorkBook.copySheet方法可能会丢失边框样式,但不会丢失合并区域。
private static WritableSheet createSheetCopy(Workbook w, int from, int to,
            WritableWorkbook writeableWorkbook) throws WriteException {
        Sheet sheet = w.getSheet(from);
        WritableSheet newSheet = writeableWorkbook.getSheet(to);
        // Avoid warning
        // "Maximum number of format records exceeded. Using default format."
        Map<CellFormat, WritableCellFormat> definedFormats = new HashMap<CellFormat, WritableCellFormat>();
        for (int colIdx = 0; colIdx < sheet.getColumns(); colIdx++) {
            newSheet.setColumnView(colIdx, sheet.getColumnView(colIdx));
            for (int rowIdx = 0; rowIdx < sheet.getRows(); rowIdx++) {
                if (colIdx == 0) {
                    newSheet.setRowView(rowIdx, sheet.getRowView(rowIdx));
                }
                Cell readCell = sheet.getCell(colIdx, rowIdx);
                Label label = new Label(colIdx, rowIdx, readCell.getContents());
                CellFormat readFormat = readCell.getCellFormat();
                if (readFormat != null) {
                    if (!definedFormats.containsKey(readFormat)) {
                        definedFormats.put(readFormat, new WritableCellFormat(
                                readFormat));
                    }
                    label.setCellFormat(definedFormats.get(readFormat));
                }
                newSheet.addCell(label);
            }
        }
        return newSheet;
    }