用Java中的JXL复制工作表
我想将工作表从现有XLS文档复制到新位置。 我怎样才能用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
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要使用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;
}