Изменение существующего excel с помощью jxl

Я не могу редактировать существующий лист excel с помощью jxl. Он всегда создает новый. Кто-нибудь может помочь мне с этим. Пожалуйста, дайте небольшой пример кода.


person TestUser    schedule 31.08.2010    source источник


Ответы (4)


jxl предназначен для повышения эффективности чтения (поскольку это основное использование API). Чтобы повысить производительность, данные, которые относятся к выходной информации (например, вся информация о форматировании, такая как шрифты), не интерпретируются при чтении электронной таблицы, поскольку это излишне при запросе необработанных значений данных.

Однако, если нам нужно изменить эту электронную таблицу, потребуется дескриптор различных интерфейсов записи, который можно получить с помощью метода копирования.

Workbook workbook = Workbook.getWorkbook(new File("myfile.xls"));
WritableWorkbook copy = Workbook.createWorkbook(new File("temp.xls"), workbook);

Это копирует информацию, которая уже была прочитана, а также выполняет дополнительную обработку для интерпретации полей, необходимых для написания электронных таблиц. Недостатком этой стратегии, оптимизированной для чтения, является то, что в памяти хранятся две электронные таблицы, а не одна, что удваивает требования к памяти.

Но после этого вы можете делать все, что захотите. Нравится:

WritableSheet sheet2 = copy.getSheet(1); 
WritableCell cell = sheet2.getWritableCell(1, 2); 

if (cell.getType() == CellType.LABEL) 
{ 
  Label l = (Label) cell; 
  l.setString("modified cell"); 
}
copy.write(); 
copy.close();
workbook.close();

Примечание: это напрямую взято с учебной страницы Энди Хана.

person lalli    schedule 31.08.2010
comment
Привет @Lalli, я использую твой ответ, но он не работает. Я получаю сообщение об ошибке в этой строке WritableWorkbook copy = Workbook.createWorkbook(new File("temp.xls"), workbook); ОШИБКА java.io.FileNotFoundException: temp.xls: open failed: EROFS (Read-only file system) - person Pushpendra; 15.09.2016

Я знаю, что это довольно старый вопрос, но если кто-то столкнется с той же проблемой, то для сохранения правильного форматирования (типа шрифта, цвета и т. д.) вы должны сохранить формат ячейки перед преобразованием в Label, а затем принудительно ячейку в прежнее форматирование. Код:

CellFormat cfm = cell.getCellFormat();
Label l = (Label) cell; 
l.setString("modified cell");
cell.setCellFormat(cfm);
person sboda    schedule 03.11.2014

Я лично использую этот код, чтобы добавить файл xls и создать его, если он не существует.
Использование jxl 2.6:

    public class Excel {

        private String fileName = "excel_file.xls";
        private String sheetName = "sheet1";
        private WritableWorkbook writableWorkbook;
        private int rowCount;
        private Workbook wb;

// assigns checks if file exists or not, both cases we assign it to a WritableWorkbook // object so that we can write to it.
        private void assignWorkBook() throws IOException, BiffException {
    //        File f = new File(System.getProperty("user.dir") +"\\"+fileName);
            File inp = new File(fileName);
            try{
                wb = Workbook.getWorkbook(inp);
                writableWorkbook = Workbook.createWorkbook(inp, wb);
            } catch (FileNotFoundException e){
                writableWorkbook = Workbook.createWorkbook(inp); //Create a new one
            }
        }

        public int getRowCount() {
            return rowCount;
        }

// this function writes a vector to an excel file, checks if there is already a sheet 
// with that name or not, and uses it. then we have to close the Workbook object before 
// we could write to the file, and then we save the file.
// That is, the file is always saved after writing to it.

        public void writeRow(Vector<String> playerVector) throws WriteException, IOException, BiffException {
            assignWorkBook();
            WritableSheet excelSheet;
            if(writableWorkbook.getNumberOfSheets() == 0) {
                excelSheet = writableWorkbook.createSheet(sheetName, 0);
            }
            else {
                excelSheet = writableWorkbook.getSheet(sheetName);
            }
            rowCount = excelSheet.getRows();
            int colCount = 0;
            for(String playerStat:playerVector) {
                Label label = new Label(colCount++, rowCount, playerStat);
                excelSheet.addCell(label);
            }
            if(wb != null) {
                wb.close();
            }
            writableWorkbook.write();
            writableWorkbook.close(); //everytime save it.
        }
    }
person Newsonic    schedule 18.09.2018

person    schedule
comment
Хотя иногда можно ответить на вопрос только кодом, но в большинстве случаев пост улучшается за счет добавления объяснения. Вы можете отредактировать свой ответ, чтобы включить его. - person Artjom B.; 04.12.2014