Я не могу редактировать существующий лист excel с помощью jxl. Он всегда создает новый. Кто-нибудь может помочь мне с этим. Пожалуйста, дайте небольшой пример кода.
Изменение существующего excel с помощью jxl
Ответы (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();
Примечание: это напрямую взято с учебной страницы Энди Хана.
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);
Я лично использую этот код, чтобы добавить файл 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.
}
}