Чем читать xlsx java
Перейти к содержимому

Чем читать xlsx java

  • автор:

Пример чтения файлов Excel

На странице описания библиотеки Apache POI представлены свойства и методы взаимодействия Java приложений с файлами Excel. Здесь рассматривается пример использования Apache POI для чтения файлов Excel 2007 или более поздней версии. Если необходимо обрабатывать Excel 1997-2003, то следует использовать классы, наименования которых начинаются с символа ‘H’ (см. наименование классов на странице описания Apache POI).

Открытие книги Excel

Чтобы «открыть» файл Excel как HSSFWorkbook (.xls), так и XSSFWorkbook (.xlsx) можно использовать либо File, либо InputStream. При использовании InputStream требуется больше памяти для загрузки файла в буффер.

Метод openBook демонстрирует использование WorkbookFactory для открытия Excel файла. Строки использования InputStream закомментированы.

private XSSFWorkbook book; . private void openBook(final String path) < try < File file = new File(path); book = (XSSFWorkbook) WorkbookFactory.create(file); // InputStream is = new FileInputStream(FILE); // book = (XSSFWorkbook) WorkbookFactory.create(is); // is.close(); >catch (FileNotFoundException e1) < e.printStackTrace(); >catch (EncryptedDocumentException e) < e.printStackTrace(); >catch (InvalidFormatException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >>

Если нужно обойти использование WorkbookFactory, т.е. использовать XSSFWorkbook (HSSFWorkbook) напрямую, то следует использовать OPCPackage (.xlsx) или NPOIFSFileSystem (.xls).

private XSSFWorkbook book; . private void openBookDirectly(final String path) < File file = new File(path); try < OPCPackage pkg = OPCPackage.open(file); book = new XSSFWorkbook(pkg); pkg.close(); >catch (InvalidFormatException e) < e.printStackTrace(); >catch (IOException e) < e.printStackTrace(); >>

Открытие страницы

При открытии страницы слеудет использовать метод getSheet с указанием в качестве параметра наименования страницы. Здесь необходимо быть внимательным, поскольку наименования страницы по умолчанию могут быть как «Sheet», так и «Лист», в зависимости от локализации операционной системы и Excel.

XSSFSheet sheet = book.getSheet("Лист1");

Перебор строк и ячеек

Чтобы «пройтись» по всем страницам книги и перебрать все значения в ячейках можно использовать итераторы. Следующий код показывает использование итераторов для перебора всех ячеек страницы.

import java.util.Iterator; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Cell; . Iterator ri = sheet.rowIterator(); while(ri.hasNext()) < XSSFRow row = (XSSFRow) ri.next(); Iteratorci = row.cellIterator(); while(ci.hasNext()) < XSSFCell cell = (XSSFCell) ci.next(); // код >>

Итераторы доступны по вызовам workbook.sheetIterator(), sheet.rowIterator() и row.cellIterator(). Но необходимо помнить, что rowIterator и cellIterator перебирают только строки и ячейки, которые созданы, пропуская пустые строки и ячейки.

Если необходимо проверить все строки и все ячейки определенной области, то можно воспользоваться следующим кодом.

private void readCells() < // Определение граничных строк обработки int rowStart = Math.min( 0, sheet.getFirstRowNum()); int rowEnd = Math.max(100, sheet.getLastRowNum ()); for (int rw = rowStart; rw < rowEnd; rw++) < XSSFRow row = sheet.getRow(rw); if (row == null) < // System.out.println( // "row '" + rw + "' is not created"); continue; >short minCol = row.getFirstCellNum(); short maxCol = row.getLastCellNum(); for(short col = minCol; col < maxCol; col++) < XSSFCell cell = row.getCell(col); if (cell == null) < // System.out.println( // "cell '" + col + "' is not created"); continue; >printCell(row, cell); > > >

В представленном коде для чтения ячейки был использован метод getCell(int). Можно использовать метод getCell(int, MissingCellPolicy), где MissingCellPolicy, определяет условие возвращения пустых и отсутствующих ячеек. Однако IDE Eclipse, где работоспособность кода проверялась, показывает, что MissingCellPolicy упразднена (deprecated), а метод getCell(int) для ячейки типа XSSFCell вернул правильные значения. Определение значений ячеек выполнялось в методе printCell(row, cell).

Чтение содержимого ячейки

Чтобы получить значение ячейки, необходимо знать тип её значения. Полагаю, что Вы не раз сталкивались с числовым представлением значения даты. Если у текстовой ячейки попытаться получить числовое значение, то будет вызвано NumberFormatException. Поэтому, необходимо первоначально определиться с типом, чтобы использовать соответствующий метод.

Следующий код в цикле проходит по ячейкам в строке и выводит в консоль ссылочную информацию на ячейку (например $A$3) и содержимое ячейки. Причем, сначала отображается значение, полученное методом formatCellValue класса DataFormatter, а после символа слеша ‘/’ отображается значение, получаемое методами getRichStringCellValue(), getDateCellValue(), getNumericCellValue(), getBooleanCellValue() и getCellFormula() класса XSSFCell.

private void printCell(XSSFRow row, XSSFCell cell) < DataFormatter formatter = new DataFormatter(); CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex()); System.out.print(cellRef.formatAsString()); System.out.print(" : "); // get the text that appears in the cell by getting // the cell value and applying any data formats // (Date, 0.00, 1.23e9, $1.23, etc) String text = formatter.formatCellValue(cell); System.out.print(text + " / "); // Вывод значения в консоль switch (cell.getCellTypeEnum()) < case STRING: System.out.println(cell.getRichStringCellValue() .getString()); break; case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) System.out.println(cell.getDateCellValue()); else System.out.println(cell.getNumericCellValue()); break; case BOOLEAN: System.out.println(cell.getBooleanCellValue()); break; case FORMULA: System.out.println(cell.getCellFormula()); break; case BLANK: System.out.println(); break; default: System.out.println(); >>

Пример чтения файла Excel

Работоспособность представленного на странице кода (методов), была проверена в примере, структура которого изображена на следующем скриншоте. Это проект Eclipse, включающий перечень необходимых библиотек для чтения файла Excel. Основной класс ExcelRead реализует все представленные выше методы.

На следующем скриншоте представлена страница простенького файла Excel, содержащая ячейки со значениями типа Date, String, Numeric и ячейки с формулами.

Результат чтения файла

Значения ячеек книги Excel в примере отображаются в консоли. Обратите внимание на отличия значений до слеша и после него для типов Date и Numeric. При необходимости можно использовать в приложении переменные соответствующего типа (Date, Integer) и должным образом отформатировать значения.

Книга Excel открыта Страница открыта $A$1 : Закупки / Закупки $B$1 : 1/20/17 / Fri Jan 20 00:00:00 MSK 2017 $A$3 : Наименование / Наименование $B$3 : Цена / Цена $C$3 : Количество / Количество $D$3 : Стоимость / Стоимость $A$4 : Сахар / Сахар $B$4 : 50 / 50.0 $C$4 : 2 / 2.0 $D$4 : B4*C4 / B4*C4 $A$5 : Рис / Рис $B$5 : 45 / 45.0 $C$5 : 4 / 4.0 $D$5 : B5*C5 / B5*C5 $A$7 : Итого : / Итого : $D$7 : SUM(D4:D6) / SUM(D4:D6)

Скачать примеры

Исходный пример, рассмотренный в тексте страницы, можно скачать здесь (11.7 Мб).

Как открыть файл excel используя javax.swing?

Считываю файл excel используя библиотеку Apache POI. На консоль выводится содержимое файла. Можно ли вывести содержимое не на консоль, а в отдельное окно(например используя библиотеку javax.swing)? Очень запутался пока пробовал что-то сделать. Заранее спасибо за помощь. Часть 1 — чтение excel

public class Readsheet < static XSSFRow row; public static void main(String[] args) throws Exception< FileInputStream fis = new FileInputStream(new File("1_2016_September.xlsx")); XSSFWorkbook workbook = new XSSFWorkbook(fis); XSSFSheet spreadsheet = workbook.getSheetAt(0); Iterator < Row >rowIterator = spreadsheet.iterator(); while (rowIterator.hasNext()) < row = (XSSFRow) rowIterator.next(); Iterator < Cell >cellIterator = row.cellIterator(); while (cellIterator.hasNext()) < Cell cell = cellIterator.next(); switch (cell.getCellType())< case Cell.CELL_TYPE_NUMERIC: System.out.print(cell.getNumericCellValue() + " \t" ); break; case Cell.CELL_TYPE_STRING: System.out.print(cell.getStringCellValue() + " \t" ); break; >> System.out.println(); CompletedWorks History = new CompletedWorks(); //? History.displayFieldHistory.setText(. ); //? > fis.close(); > > 

Часть 2 — это окно

public class CompletedWorks < JPanel panelComplitedWorks; JPanel pTop; JPanel pCenter; JLabel thisDay; JCheckBox paidCheck; public JTextArea displayFieldHistory; //? public CompletedWorks ()< panelComplitedWorks= new JPanel(); BorderLayout panelCW = new BorderLayout(1,1); panelComplitedWorks.setLayout(panelCW); displayFieldHistory = new JTextArea(10, 10); displayFieldHistory.setLineWrap(true); displayFieldHistory.setWrapStyleWord(true); pCenter = new JPanel(); GridLayout glH =new GridLayout(1,1); pCenter.setLayout(glH); pCenter.add(displayFieldHistory); panelComplitedWorks.add("Center",pCenter); thisDay = new JLabel("Date"); paidCheck = new JCheckBox("salary"); pTop = new JPanel(); GridLayout gl2 =new GridLayout(1,2); pTop.setLayout(gl2); pTop.add(thisDay); pTop.add(paidCheck); panelComplitedWorks.add("North",pTop); JFrame frameHistory = new JFrame("A list of completed orders"); frameHistory.setContentPane(panelComplitedWorks); frameHistory.pack(); frameHistory.setLocation(500, 205); frameHistory.setVisible(true); >public static void main(String[] args) < CompletedWorks CW = new CompletedWorks(); >> 

Отслеживать

51.3k 87 87 золотых знаков 267 267 серебряных знаков 505 505 бронзовых знаков

задан 5 сен 2016 в 11:27

Yaraslau Khamenka Yaraslau Khamenka

66 5 5 бронзовых знаков

Работа с таблицей Excel из Java

Собственно возникла проблема — обработать данные из таблицы и на их основе получить другую таблицу.

  1. Макрос — единственной проблемой является VBA, на изучение которого времени нет совершенно, да и не нравится его синтаксис
  2. Приложение на C# тут вроде все хорошо, но к машине на которой будет выполняться данное приложение сразу предъявляется много дополнительных требований:
    • .NET Framework
    • Установленный офис
    • установленная основная сборка взаимодействия (PIA) для приложения Office

  3. связка Java и библиотека Apache POI—на этом способе я и хочу остановиться подробнее
  1. POI 3.5 beta 5, and Office Open XML Support (2009-02-19)—идет работа над поддержкой формата Office 2007
  2. POI 3.2-FINAL Released (2008-10-19) — последний стабильный релиз

Я расскажу о работе с версией 3.2
Основным классом для работы с таблицей Excel является класс HSSFWorkbook пакета org.apache.poi.hssf.usermodel, представляющий книгу Excel.

Для чтения книги из файла можно применить следующий код:

public static HSSFWorkbook readWorkbook(String filename) < try < POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(filename)); HSSFWorkbook wb = new HSSFWorkbook(fs); return wb; >catch (Exception e) < return null; >>

Метод возвращает объект класса HSSFWorkbook если все удачно и null в другом случае.

Для сохранения изменений можно применить следующий метод:

public static void writeWorkbook(HSSFWorkbook wb, String fileName) < try < FileOutputStream fileOut = new FileOutputStream(fileName); wb.write(fileOut); fileOut.close(); >catch (Exception e) < //Обработка ошибки >>

Метод записывает книгу wb в файл fileName

  • По имени
    HSSFSheet sheet= wb.getSheet(«Лист 3»)
  • По номеру (нумерация начинается с 0)
    HSSFSheet sheet= wb.getSheet(0)
  • Создание нового листа
    HSSFSheet sheet= wb.createSheet([«имя листа»])
  • По индексу (индексация начинается с 0)
    HSSFRow row = sheet.getRow(index)
  • Через итератор

Iterator rowIter = sheet.rowIterator(); while (rowIter.hasNext())

  • По индексу ячейки (индексация начинается с 0)
    HSSFCell cell = row.getCell(0);
  • Через итератор

Iterator cellIter = row.cellIterator(); while (cellIter.hasNext())

  • Логическое значение
    boolean b = cell.getBooleanCellValue();
    cell.setCellValue(b);
  • Дата
    Date date = cell.getDateCellValue();
    cell.setCellValue(date);
  • Числовое значение
    double d = cell.getNumericCellValue();
    cell.setCellValue(d);
  • Строковое значение
    String str = cell.getRichStringCellValue().getString();
    cell.setCellValue(new HSSFRichTextString(str));
  • Формула
    String formula = cell.getCellFormula();
    cell.setCellFormula(formula);

Этих знаний достаточно чтобы обрабатывать простые таблицы.
Библиотека также предоставляет богатые возможности по форматированию ячеек, по их слиянию, заморозке и т.д.
Подробное описание функций можно найти на их сайте.
Данный способ прежде всего ценен тем, что не требует установки самого офиса и пакета PIA.

Java API с открытым исходным кодом для электронных таблиц Microsoft Excel

Создавайте, читайте, редактируйте и преобразовывайте файлы электронных таблиц Microsoft Excel в приложения Java с помощью API с открытым исходным кодом.

Что такое FastExcel?

Работа с большими файлами Excel всегда является большой проблемой для программистов и требует высокого уровня навыков и ресурсов для управления ею. FastExcel — очень мощная библиотека Java Excel с открытым исходным кодом, которая позволяет разработчикам программного обеспечения создавать и читать рабочие книги Microsoft Excel XLSX внутри своих собственных приложений Java. Это помогает разработчикам работать с большими файлами Excel без каких-либо внешних зависимостей.

FastExcel очень прост в использовании и уменьшает объем памяти и повышает производительность за счет накопления только необходимых элементов. Он включает в себя несколько важных функций для работы с электронными таблицами, таких как создание простых рабочих книг, применение стилей и форматирования к ячейкам, столбцам и строкам, установка стиля для диапазона ячеек, объединение ячеек и строк, затенение чередующихся строк, установка размера бумаги и ориентации страницы. , установить поля страницы, создать область стоп-кадра и т. д.

FastExcel обеспечивает полную поддержку многопоточности, что означает, что каждый рабочий лист в книге может быть создан отдельным потоком, при этом полностью поддерживая общие строки и стили. Читатель FastExcel очень эффективен и только для чтения содержимого ячеек и отбрасывает стили, графики и другие вещи.

  • С одного взгляда
  • Независимость от платформы
  • Вспомогательные форматы файлов

С одного взгляда

Обзор возможностей FastExcel.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *