我想将现有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:
那么我是否必须将工作簿的可写副本创建到另一个文件中?
( edit3:或者还有其他可以执行此操作的免费库吗?)
的更新 的
当我运行此代码时,我会在行
上获得jxl.common.AssertionFailed
个例外
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();
}
如何将单元格样式复制到新单元格?
答案 0 :(得分:7)
如何将一个工作簿中的工作表复制到另一个工作簿中的新工作表?
这可以做到,但需要一点工作。首先,你必须复制它的单元格(在几个嵌套的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);
}
}
资源:
答案 1 :(得分:4)
小心警告'超出格式记录的最大数量。使用默认格式。'尝试使用Map<CellFormat,WritableCellFormat>
之类的方法来控制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<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);
}
}
}
答案 2 :(得分:4)
只是一个更新,“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;
}
答案 3 :(得分:2)
您必须逐个遍历单元格并将它们添加到新工作表中。
请参阅this,问题如何将一个工作簿中的工作表复制到另一个工作簿中的新工作表?
答案 4 :(得分:2)
if (readFormat != null) {
WritableCellFormat newFormat = new WritableCellFormat(readFormat);
newCell.setCellFormat(newFormat);
newSheet.addCell(newCell);
}
答案 5 :(得分:0)
JXL API wiki 允许用户在运行时读取,编写,创建和修改Excel(.xls
)工作簿中的工作表。它不支持.xlsx
格式。
Excel 95, 97, 2000, XP, and 2003
的Excel文档。这些文档的扩展名为.xls
使用以下功能复制JXL工作簿表。
public static void copySheetToWritableSheet(jxl.Sheet srcSheet, jxl.write.WritableSheet destSheet) throws JXLException {
int numrows = srcSheet.getRows();
int numcols = srcSheet.getColumns();
System.out.println("Rows:"+numrows+", Col:"+numcols);
for (int rowIdx = 0 ; rowIdx < numrows ; rowIdx++) {
for (int colIdx = 0 ; colIdx < numcols ; colIdx++) {
System.out.println("--- Rows:"+rowIdx+", Col:"+colIdx);
jxl.Cell srcCell = srcSheet.getCell(colIdx, rowIdx);
CellType type = srcCell.getType();
jxl.format.CellFormat format = srcCell.getCellFormat();
String cellValue = srcCell.getContents();
WritableCellFormat cf = null;
WritableCell newCell = null;
if (format != null) {
Colour backgroundColour = format.getBackgroundColour();
Font font = format.getFont();
WritableFont wf = new WritableFont(font);
cf = new WritableCellFormat(wf);
int value = backgroundColour.getValue();
String description = backgroundColour.getDescription();
System.out.println("Format Not Null Val:"+value+", Desc:"+description);
if (value != 192) { // Val: 192, Desc:default background [Dark Black]
cf.setBackground(backgroundColour);
}
cf.setAlignment(format.getAlignment());
cf.setBorder(jxl.format.Border.RIGHT, format.getBorderLine(Border.RIGHT));
cf.setBorder(Border.LEFT, format.getBorderLine(Border.LEFT));
cf.setBorder(Border.BOTTOM, format.getBorderLine(Border.BOTTOM));
cf.setBorder(Border.TOP, format.getBorderLine(Border.TOP));
cf.setWrap(format.getWrap());
if (type == CellType.NUMBER) {
newCell = new Number(colIdx, rowIdx, ((NumberCell) srcCell).getValue(), cf);
} else {
newCell = new Label(colIdx, rowIdx, cellValue, cf);
}
CellView cellView = srcSheet.getColumnView(colIdx);
destSheet.setColumnView(colIdx, cellView);
destSheet.addCell(newCell);
} else {
WritableFont wf = new WritableFont(ARIAL_10_PT);
// for position column we are not applying the display format
if (type == CellType.NUMBER) {
cf = new WritableCellFormat(wf, displayFormat);
newCell = new Number(colIdx, rowIdx, ((NumberCell) srcCell).getValue(), cf);
} else {
cf = new WritableCellFormat(wf);
newCell = new Label(colIdx, rowIdx, cellValue, cf);
}
CellView cellView = srcSheet.getColumnView(colIdx);
destSheet.setColumnView(colIdx, cellView);
destSheet.addCell(newCell); // https://stackoverflow.com/a/64675987/5081877
}
}
}
//Merge - MergedCells
Range[] mergedCells = srcSheet.getMergedCells();
for (int i = 0; i < mergedCells.length; i++) {
System.out.println("mergedCells:"+i);
Cell tl = mergedCells[i].getTopLeft();
Cell br = mergedCells[i].getBottomRight();
destSheet.mergeCells(tl.getColumn(), tl.getRow(), br.getColumn(), br.getRow());
}
SheetSettings srcSettings = srcSheet.getSettings();
SheetSettings destSettings = destSheet.getSettings();
destSettings.setZoomFactor(srcSettings.getZoomFactor());
}
使用Java Excel API » 2.6.12的完整示例,使用的示例文件为JXLWorkbook.xls。
public class JXL_XLS_Report {
static String filePath = "C:/Yash/",
sourceFile = filePath+"JXLWorkbook.xls", sourceFileSheetName = "FormatAbbrSheet",
destinationFile = filePath+"JXLWorkbook_Copy.xls";
public static void main(String[] args) throws Exception {
File sourceDST = new File(destinationFile);
jxl.write.WritableWorkbook workbook = Workbook.createWorkbook(sourceDST);
int numberOfSheets = workbook.getNumberOfSheets();
System.out.println("Number of Sheets:"+numberOfSheets);
// create the empty sheet
jxl.write.WritableSheet writableSheet = workbook.createSheet(sourceFileSheetName+"_777", numberOfSheets + 1);
File source = new File(sourceFile);
InputStream fileInStream = new FileInputStream(source);
jxl.Workbook templateWorkbook = Workbook.getWorkbook(fileInStream, getDefaultWorkbookSettings());
jxl.Sheet srcSheet = templateWorkbook.getSheet(sourceFileSheetName);
copySheetToWritableSheet(srcSheet, writableSheet);
WorkbookSettings wbSettings = new WorkbookSettings();
wbSettings.setRationalization(false);
closeWorkbook(workbook);
}
static jxl.biff.DisplayFormat displayFormat = new NumberFormat("0.000");
static WritableFont ARIAL_10_PT = new WritableFont(WritableFont.ARIAL);
//static WritableFont DataFont = new WritableFont(WritableFont.ARIAL, 8, WritableFont.BOLD);
public static void copySheetToWritableSheet(jxl.Sheet srcSheet, jxl.write.WritableSheet destSheet) throws JXLException {
// ...
}
public static void closeWorkbook(WritableWorkbook workbook) throws IOException, JXLException {
if (workbook == null)
return;
if (workbook.getNumberOfSheets() == 0) {
workbook.createSheet("No data", 0); // otherwise pointer error
}
//Writes out the data held in this workbook in Excel format
workbook.write();
//Close and free allocated memory
workbook.close();
}
public static WorkbookSettings getDefaultWorkbookSettings() {
WorkbookSettings workbookSettings = new WorkbookSettings();
workbookSettings.setEncoding("ISO-8859-15");
workbookSettings.setLocale(Locale.GERMANY);
workbookSettings.setCharacterSet(1200);
workbookSettings.setExcelRegionalSettings("UK");
workbookSettings.setExcelDisplayLanguage("US");
workbookSettings.setPropertySets(false);
return workbookSettings;
}
public static void copyCellValue(Sheet srcSheet, int srcCol, int srcRow, WritableSheet destSheet, int destCol, int destRow) throws JXLException {
Cell srcCell = srcSheet.getCell(srcCol, srcRow);
CellType type = srcCell.getType();
WritableCell newCell = null;
if (type == CellType.LABEL) {
newCell = new Label(destCol, destRow, ((LabelCell) srcCell).getString());
} else if (type == CellType.NUMBER) {
newCell = new Number(destCol, destRow, ((NumberCell) srcCell).getValue());
} else if (type == CellType.BOOLEAN) {
newCell = new jxl.write.Boolean(destCol, destRow, ((BooleanCell) srcCell).getValue());
} else if (type == CellType.DATE) {
newCell = new DateTime(destCol, destRow, ((DateCell) srcCell).getDate());
} else if (type == CellType.EMPTY) {
newCell = new EmptyCell(destCol, destRow);
} else if (type == CellType.NUMBER_FORMULA
|| type == CellType.STRING_FORMULA
|| type == CellType.BOOLEAN_FORMULA) {
String formula = ((FormulaCell) srcCell).getFormula();
newCell = new Formula(destCol, destRow, formula);
} else {
String cellValue = srcCell.getContents();
newCell = new Label(destCol, destRow, cellValue);
}
// Set Column Size
CellView cellView = srcSheet.getColumnView(srcCol);
destSheet.setColumnView(srcCol, cellView);
destSheet.addCell(newCell);
}
public static void copyCellFormat(Sheet srcSheet, int srcCol, int srcRow, WritableSheet destSheet, int destCol, int destRow)throws JXLException {
CellFormat format = srcSheet.getCell(srcCol, srcRow).getCellFormat();
if (format == null) return;
WritableCell destCell = destSheet.getWritableCell(destCol, destRow);
if (destCell.getType() == CellType.EMPTY) {
WritableCell newCell = new Label(destCol, destRow, "");
newCell.setCellFormat(format);
destSheet.addCell(newCell);
} else {
destCell.setCellFormat(format);
}
}
}