Поиск по блогу

пятница, 17 февраля 2012 г.

Работа с файлами Microsoft Excel в Java

Необходимость работы с файлами Microsoft Excel в Java-приложении возникает не так уж и редко. Самый распространенный сценарий - требуется реализовать формирование какого-либо отчета. Проще всего это можно реализовать через использование отличной открытой библиотеки Apache POI.
Библиотека Apache POI позволяет работать практически со всеми форматами Microsoft Office - поддерживается работа с файлами Excel, Word, PowerPoint и так далее. Причем поддерживается как классическая реализация форматов, так и современная реализация Open XML (docx, xlsx и так далее).
Перейдем от лирики к практике. Вот пример простейшего кода с использованием Apache POI:
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFRow row = null;
HSSFCell cell = null;
int rows = sheet.getPhysicalNumberOfRows(); //получаем актуальное число строк
for(int r = 0; r < rows; r++) {
    row = sheet.getRow(r); //берем строку
    if(row != null) {
       cell = row.getCell(0); //берем первую ячейку
       if(cell != null) {
          cell.setCellValue("Modified " + r); //задаем значение ячейки
       }
    }
}
FileOutputStream fileOut = new FileOutputStream("output.xls");
wb.write(fileOut);
fileOut.close();
Данный код открывает существующий файл Excel, заменяет значение первой ячейки каждой строки и потом записывает результат в новый файл. Как видите работать с файлами Excel с помощью POI элементарно.
Покажу пару конструкций, которые мне пригодились в работе. Например, вот так можно работать со стилями ячеек:
CellStyle cs = wb.createCellStyle();
cs.setWrapText(true);
...
cell.setCellStyle(cs);
А вот так можно вставить новую строку в середине таблицы:
sheet.shiftRows(r, sheet.getLastRowNum(), 1);
sheet.createRow(r).createCell(0).setCellValue("New row!");
Еще один полезный кусочек кода. Вот так можно сгруппировать определенное количество строк и свернуть их по умолчанию (другими словами при открытии документа будет видна только самая верхняя строка и плюсик для открытия остальных - здорово помогает в больших таблицах):
sheet.groupRow(r, j);
sheet.setRowGroupCollapsed(r, true);
В POI есть одна небольшая проблема - нет удаления со сдвигом как привыкли пользователи Microsoft Excel. При удалении строки средствами POI вместо нее остается пустое место. Вот решение проблемы:
public static void removeRow(HSSFSheet sheet, int rowIndex) {
    int lastRowNum = sheet.getLastRowNum();
    if(rowIndex >= 0 && rowIndex < lastRowNum){
       sheet.shiftRows(rowIndex+1,lastRowNum, -1);
    }
    if(rowIndex == lastRowNum){
       HSSFRow removingRow = sheet.getRow(rowIndex);
       if(removingRow != null){
          sheet.removeRow(removingRow);
       }
    }
}
В общем, POI - это очень просто. Пользуйтесь на здоровье!

4 комментария:

  1. Может мне начать писать примеры по 1Ске? :)
    Честно говоря на первом курсе я как баран на новые ворота смотрел на программирование, с трудом все понимал и завидовал тем кто еще до универа понимал тонкости программирования ..
    Я только сейчас смотря на код разных языков, могу понять на ~90% о чем идет речь и что большинство современных языков интуитивно понятны .. и если задаться целью и прочесть пару книжек/мануалов можно за короткое время освоить любой язык ..

    ОтветитьУдалить
    Ответы
    1. Юрик, хорошая идея!
      Да, любой современный язык можно очень быстро освоить. Вообще, по моему мнению, самое сложное в программировании - понять и научиться правильно использовать различные шаблоны и алгоритмы, чтобы не изобретать каждый раз велосипед.

      Удалить
  2. кстати, если придираться )) то для заинтересованных лиц, не помешала бы ссылка на офф. сайт, где можно скачать библиотечку .. :)

    ОтветитьУдалить