Модификация существующего Excel с использованием JXL - PullRequest
16 голосов
/ 31 августа 2010

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

Ответы [ 4 ]

25 голосов
/ 31 августа 2010

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();

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

1 голос
/ 03 ноября 2014

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

CellFormat cfm = cell.getCellFormat();
Label l = (Label) cell; 
l.setString("modified cell");
cell.setCellFormat(cfm);
0 голосов
/ 18 сентября 2018

Я лично использую этот код, чтобы добавить файл 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.
        }
    }
0 голосов
/ 04 декабря 2014
//there is god example of it, you can copy in ur project and check it out, to 
//understand how  it works

Workbook wk = Workbook.getWorkbook(new File("ex.xls"));
// 
WritableWorkbook wkr = Workbook.createWorkbook(new File("modifed.xls"), wk);
/* second line makes copy of wk excel file object /creates a readable spreadsheet.
both are now similar and i can Modify exiting wkr spreadsheets */



 //next 2 line retrieve sheet number 0  and cell (1,1)


 WritableSheet getsht = wkr.getSheet(0);
 WritableCell getcl = getsht.getWritableCell(1, 1);


 //making own font 

WritableFont ft = new WritableFont(WritableFont.ARIAL, 20 , WritableFont.BOLD, true , UnderlineStyle.SINGLE); 
//making Format, which uses font
WritableCellFormat   form   =   new WritableCellFormat( ft);

Number nb = ( Number ) getcl ;          
nb.setCellFormat( form );    


wkr.write();
wkr.close();
...