使用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 to the second sheet of w2 ... */ w2.write(); w2.close(); w1.close(); 

编辑:
w1.getSheet(0).getCell(0, 0)不是WritableCell ,所以我无法使用copyTo方法。
有没有办法从w1w2工作簿添加单元格/表格?
EDIT2:
那么我是否必须将工作簿的可写副本创建到其他文件中?
编辑3:或者还有其他任何可以执行此操作的免费库吗?)


更新:

当我运行此代码时,我在线获取jxl.common.AssertionFailedexception

 WritableCellFormat newFormat = new WritableCellFormat(readFormat); 

如果我删除此行并将代码更改为

newCell.setCellFormat(readFormat);

然后不复制单元格样式(字体,单元格边框等)。

 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循环中)。 对于每个单元格,您需要调用copyTo()方法,该方法将生成深层副本。 但是格式只是浅层复制,因此您需要获取单元格格式并使用其复制构造函数,然后在刚刚复制的单元格上调用setCellFormat。 然后将重复的单元格添加到新的电子表格中

代码可能如下所示:

  for (int i = 0 ; i < numrows ; i++){ for (int j = 0 ; j < numcols ; j++){ readCell = sheet.getCell(i, j); newCell = readCell.copyTo(i, j); readFormat = readCell.getCellFormat(); newFormat = new WritableCellFormat(readFormat); newCell.setCellFormat(newFormat); newSheet.add(newCell); } } 

资源:

  • JExcel API常见问题解答
  1. 检查readFormat是否为null(如上所述)
  2. 注意警告’ 超出格式记录最大数量。 使用默认格式。 ‘尝试使用Map来控制WritableCellFormat实例的数量。

     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 definedFormats = new HashMap(); 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 definedFormats = new HashMap(); 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; } 

您必须逐个循环遍历单元格并将它们添加到新工作表中。

请参阅此问题,如何将一个工作簿中的工作表复制到另一个工作簿中的新工作表?

 if (readFormat != null) { WritableCellFormat newFormat = new WritableCellFormat(readFormat); newCell.setCellFormat(newFormat); newSheet.addCell(newCell); }