使用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
方法。
有没有办法从w1
到w2
工作簿添加单元格/表格?
EDIT2:
那么我是否必须将工作簿的可写副本创建到其他文件中?
( 编辑3:或者还有其他任何可以执行此操作的免费库吗?)
更新:
当我运行此代码时,我在线获取jxl.common.AssertionFailed
exception
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常见问题解答
- 检查readFormat是否为null(如上所述)
-
注意警告’ 超出格式记录的最大数量。 使用默认格式。 ‘尝试使用
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); }