Работа с Excel файлами в Java (Apache POI)

Прикладное программирование Программирование на Java Работа с Excel файлами в Java (Apache POI)

Помечено: , ,

  • В этой теме 0 ответов, 1 участник, последнее обновление 9 месяцев назад сделано Васильев Владимир Сергеевич.
Просмотр 0 веток ответов
  • Автор
    Сообщения
    • #5833
      @admin
      StudLance.ru

      Apache POI поддерживает как формат для обычных *.xls файлов (HSSF) так и *.xlsx файлы (XSSF).

      Кстати, формат для *.xls файлы в Apache POI они обзывают «HSSF — Horrible SpreadSheet Format», то есть «Вселяющий ужас формат для электронных таблиц».
      Для того, чтобы приступить к работе, как обычно прописываем зависимости в pom.xml:

      <dependencies>
        <dependency>
          <groupId>org.apache.poi</groupId>
          <artifactId>poi</artifactId>
          <version>3.8</version>
        </dependency>
      </dependencies>

      Для примера, приведу очень простой файл — список ФИО, сумма + Итог:

      Если нужно просто вытащить текст, можно использовать «класс-извелкатель»: ExcelExtractor

      import java.io.FileInputStream;
      import java.io.InputStream;
      import java.util.Iterator;
      import org.apache.poi.hssf.extractor.ExcelExtractor;
      import org.apache.poi.hssf.usermodel.HSSFWorkbook;
      import org.apache.poi.ss.usermodel.Cell;
      import org.apache.poi.ss.usermodel.Row;
      import org.apache.poi.ss.usermodel.Sheet;
       
      public class App {
       
          public static void main(String[] args) throws Exception {
              InputStream in = new FileInputStream("/tmp/1.xls");
              // Внимание InputStream будет закрыт
              // Если нужно не закрывающий см. JavaDoc по POIFSFileSystem
              HSSFWorkbook wb = new HSSFWorkbook(in);
       
              ExcelExtractor extractor = new ExcelExtractor(wb);
              extractor.setFormulasNotResults(false); // Считать формулы
              extractor.setIncludeSheetNames(true);
              String text = extractor.getText();
       
              System.out.println(text);
       
          }
      }

      Вывод на консоль:

      Sheet1
      &A        
      Смирнов        40000.0
      Иванов        40000.0
      Кузнецов        50000.0
      Попов        40000.0
      Соколов        70000.0
      Лебедев        70000.0
      Козлов        50000.0
      Новиков        50000.0
      Морозов        50000.0
      Петров        40000.0
      Итого        500000.0
      Page &P        
      Sheet2
      &A        
      Page &P        
      Sheet3
      &A        
      Page &P   

      Когда этого не достаточно (например нужно найти нужную ячейку и т.д.), без проблем можно использовать нормальное API:
      Пример:

      import java.io.FileInputStream;
      import java.io.InputStream;
      import java.util.Iterator;
      import org.apache.poi.hssf.extractor.ExcelExtractor;
      import org.apache.poi.hssf.usermodel.HSSFWorkbook;
      import org.apache.poi.ss.usermodel.*;
       
      public class App {
       
          public static void main(String[] args) throws Exception {
              InputStream in = new FileInputStream("/tmp/1.xls");
              HSSFWorkbook wb = new HSSFWorkbook(in);
       
              Sheet sheet = wb.getSheetAt(0);
              Iterator<Row> it = sheet.iterator();
              while (it.hasNext()) {
                  Row row = it.next();
                  Iterator<Cell> cells = row.iterator();
                  while (cells.hasNext()) {
                      Cell cell = cells.next();
                      int cellType = cell.getCellType();
                      switch (cellType) {
                          case Cell.CELL_TYPE_STRING:
                              System.out.print(cell.getStringCellValue() + "=");
                              break;
                          case Cell.CELL_TYPE_NUMERIC:
                              System.out.print("[" + cell.getNumericCellValue() + "]");
                              break;
       
                          case Cell.CELL_TYPE_FORMULA:
                              System.out.print("[" + cell.getNumericCellValue() + "]");
                              break;
                          default:
                              System.out.print("|");
                              break;
                      }
                  }
                  System.out.println();
              }
          }
      } 

      Вывод на консоль:

      Смирнов=[40000.0]
      Иванов=[40000.0]
      Кузнецов=[50000.0]
      Попов=[40000.0]
      Соколов=[70000.0]
      Лебедев=[70000.0]
      Козлов=[50000.0]
      Новиков=[50000.0]
      Морозов=[50000.0]
      Петров=[40000.0]
      Итого=[500000.0]

      Конечно если у вас не такие «рафинированные» примеры, то код будет намного более сложным. Скорее всего вам придется делать еще один уровень API, заточенный под ваши нужды или ваши файлы.

      StudLance.ru

Просмотр 0 веток ответов
  • Для ответа в этой теме необходимо авторизоваться.
×