Как работать с Excel файлами в Java?

Часто ли вам приходилось на живую работать с Excel? Думаю, что несколько раз приходилось. Так вот, на днях у меня для собственного проекта появилась необходимость распарсить Excel файл.

Как известно то формат Excel файла *.xsl, но после выхода Microsoft Office 2007 появился новый формат Excel файла *.xlsx, так вот для того, чтобы иметь возможность парсить Excel я использую библиотеку Apache POI все мои пожелания по поводу Excel файла она удовлетворила.

Шаг 1

Для начало создадим Maven проект и добавим следующую зависимость:

<dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
</dependency>

Шаг 2

Теперь создадим Excel файл и добавим в него несколько записей.

Файл прикреплен к исходнику.

Шаг 3

Теперь попробуем распарсить файл testfile.xls, для этого напишем парсер.

Создаем класс Parser.java и в нем создадим статический метод parse(String name);

package com.devcolibri.excel;

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;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

public class Parser {

    public static String parse(String name) {

        String result = "";
        InputStream in = null;
        HSSFWorkbook wb = null;
        try {
            in = new FileInputStream(name);
            wb = new HSSFWorkbook(in);
        } catch (IOException e) {
            e.printStackTrace();
        }

        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:
                        result += cell.getStringCellValue() + "=";
                        break;
                    case Cell.CELL_TYPE_NUMERIC:
                        result += "[" + cell.getNumericCellValue() + "]";
                        break;

                    case Cell.CELL_TYPE_FORMULA:
                        result += "[" + cell.getNumericCellValue() + "]";
                        break;
                    default:
                        result += "|";
                        break;
                }
            }
            result += "\n";
        }

        return result;
    }

}

Шаг 4

Теперь давайте проверим все это, создаем класс Main.java со следующим содержимым:

package com.devcolibri;

import com.devcolibri.excel.Parser;

public class Main {

    public static void main(String... args){
        System.out.println(Parser.parse("testfile.xls"));
    }

}

Шаг 5

Запускаем все это дело, и получаем следующий результат:

Александр Барчук=[5000.0]
Виктор Пупкин=[10000.0]
Дмитрий Федкин=[1500.0]
Максим Панков=[300.0]
Данил Муев=[8000.0]
Анастасия Валяева=[8900.0]
Екатерина Максимова=[7000.0]
Company=[40700.0]
Урок создан: 15 мая 2013 | Просмотров: 38959 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 13 декабря 2013 в 18:26

    fed

    Можна ли с помощью библиотеки Apache POI сделать такое: в Excele есть команда «форматировать как таблицу»?
    Я скидываю из JTable в Excel, и хочется чтобы сразу же делалась таблица. Мой метод:
    // метод экспорта таблицы в Excel
    private void exportExcel() {
    Workbook workbook = new HSSFWorkbook();
    Sheet sheet = workbook.createSheet(«Таблица насосов»);
    Row row = sheet.createRow(0);
    Cell cell;
    for (int i = 0; i < table.getModel().getColumnCount(); i++) {
    cell = row.createCell(i);
    cell.setCellValue(table.getModel().getColumnName(i));
    }
    for (int i = 0; i < table.getModel().getRowCount(); i++) {
    row = sheet.createRow(i + 1);
    for (int j = 0; j < table.getModel().getColumnCount(); j++) {
    cell = row.createCell(j);
    if (j == 2 || j == 3 || j == 6) {
    cell.setCellValue(Integer.valueOf(table.getModel()
    .getValueAt(i, j).toString()));
    } else {
    cell.setCellValue(table.getModel().getValueAt(i, j)
    .toString());
    }
    sheet.autoSizeColumn(j);
    }
    }
    try (FileOutputStream fileExcel = new FileOutputStream("Table.xlsx")) {
    workbook.write(fileExcel);
    Pump.frame.message(this,
    "Таблица успешно записана в файл: Table.xls\n" + "адрес: "
    + System.getProperty("user.dir"),
    "Справочник насосов для ИТП", Message.information);
    } catch (IOException e) {
    Pump.frame.message(this, "Невозможно выполнить данную операцию.",
    "Ошибка", Message.error);
    }
    }

    • 13 декабря 2013 в 21:46

      Александр Барчук

      Не приходилось такое делать, даже незнаю. Мне мало приходилось с Excel работать.

      • 14 декабря 2013 в 11:00

        fed

        Ну тогда еще один вопрос, подскажите пожалуйста что я делаю не верно:
        Когда задаю формат xlsx Excel не хочет открывать его, выкидывает ошибку: «Не удается открыть файл «Table.xls», так как формат или расширение этого файла являются недопустимым. Убедитесь, что файл не поврежден и расширение его имени соответствует его формату». А если формат xls все ОК! В чем проблема?!

        • 22 июня 2014 в 11:01

          Сергей

          Вы, наверное, уже нашли ответ на вопрос. Но вдруг кто искать будет. POI работает с форматом xls через HSSF, а с xlsx через XSSF.

  • 01 февраля 2015 в 18:58

    Виталий

    Зачем создавать maven-project? Обычный проект java SE прекрасно справится с задачей.

    • 26 февраля 2015 в 17:23

      Павел

      Чтобы либы самому в интернете не искать, мавен автоматически скачает то что нужно

  • 06 августа 2016 в 21:14

    Владислав

    Здравствуйте, подскажите пожалуйста, как дописать строку в xls файл, именно дописать, у меня врое размер файла растёт, но после открытия его, он обратно видит только последнюю запись. Использую следующий код:
    FileOutputStream fos = new FileOutputStream(path, true);
    workbook.write(fos);
    fos.close();

  • 13 сентября 2016 в 10:21

    Doroga

    Спасибо за пример! Ради бога смените String result = «»; на StringBuilder.

  • 04 февраля 2017 в 09:16

    Павел

    Объясните, как указывается путь к файлу… запускаю ваш скаченный пример с таким результатом java.io.FileNotFoundException: testfile.xls (Не удается найти указанный файл)