Скопируйте лист с JXL в Java - PullRequest
       5

Скопируйте лист с JXL в Java

4 голосов
/ 10 октября 2010

Я хотел бы скопировать лист из существующего документа 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();
}

Как я могу скопировать стили ячеек в новую ячейку?

Ответы [ 5 ]

7 голосов
/ 10 октября 2010

Как я могу скопировать рабочий лист из одной рабочей книги на новый рабочий лист в другой рабочей книге?

Это можно сделать, но требует небольшой работы.Во-первых, вы должны скопировать ячейку (в течение пары вложенных циклов).Для каждой ячейки вам нужно вызвать метод 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);
    }
}

Ресурсы:

4 голосов
/ 31 июля 2012

Просто обновление, функция «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;
    }
4 голосов
/ 20 марта 2012
  1. Проверьте, не является ли readFormat ненулевым (как упомянуто выше)
  2. Остерегайтесь предупреждения ' Превышено максимальное количество записей формата.Использование формата по умолчанию. 'Попробуйте использовать sth вроде 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 голосов
/ 25 марта 2011
if (readFormat != null) {

    WritableCellFormat newFormat = new WritableCellFormat(readFormat);

    newCell.setCellFormat(newFormat);

    newSheet.addCell(newCell);

}
2 голосов
/ 10 октября 2010

Вы должны пройти по клеткам одну за другой и добавить их на новый лист.

См. это , под вопросом. Как я могу скопировать рабочий лист из одной рабочей книги на новый рабочий лист в другой рабочей книге?

...