Read and Write Excel File in Java
We will learn to read, write excel, evaluate formula in cells and do custom formatting to the generated excel file by using Apache POI library. Read and write excel file in java is very simple using some libraries which we will discuss below.
Reading and Writing excel by using program is often required in software projects.
Apache POI is very useful library among many other open source libraries to use in such ways involving excel files. Using POI, we can Read and write excel file in java. It can be used to read and write MS Word and MS PowerPoint also.
Apache POI – Maven Dependency
If you are using maven project then you can include the POI dependency in pom.xml as:
org.apache.poi poi 4.1.0 org.apache.poi poi-ooxml 4.1.0
If you are not using the maven project then you can download below jar files Apache POI – Download Release Artifacts:
- poi-4.1.0.jar
- commons-codec-1.12.jar
- commons-collections4-4.3.jar
- commons-math3-3.6.1.jar
If you are reading and writing Excel 2007 format then you have to include the following files:
Apache POI API Basics
HSSF: API for Excel 2003 and earlier.
XSSF: API for Excel 2007 and later.
Workbook: Broad level representation for Excel workbook. Implementations are HSSFWorkbook and XSSFWorkbook.
Sheet: Broad level representation for Excel worksheet. Implementations classes are HSSFSheet and XSSFSheet.
Row: Broad level representation for row in a spreadsheet. HSSFRow and XSSFRow are two implementing classes.
Cell: Broad level representation for cell in a spreadsheet row. HSSFCell and XSSFCell are the implementing classes.
Style Classes : Classes such as CellStyle, BuiltinFormats, ConditionalFormattingRule,ComparisonOperator, IndexedColors, PatternFormatting, FontFormatting, SheetConditionalFormatting etc. are used when you are formatting in a sheet based on rules.
FormulaEvaluator: Class FormulaEvaluator is used for evaluating the formula in cells of excel sheet.
Apache POI – Write an excel file
Writing excel involves following steps:
- Create a spreadsheet
- Create a row in spreadsheet
- Add cells in spreadsheet
- Repeat step 3 and 4 to write more data
Java Program for Writing Excel File:
package com.techblogstation; import java.io.File; import java.io.FileOutputStream; import java.util.Map; import java.util.Set; import java.util.TreeMap; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class WriteExcelFile < private static String[] columns = ; public static void main(String[] args) < //Blank workbook XSSFWorkbook workbook = new XSSFWorkbook(); //Create a blank sheet XSSFSheet sheet = workbook.createSheet("Cricketer Data"); //This data needs to be written (Object[]) Mapdata = new TreeMap(); data.put("2", new Object[] ); data.put("3", new Object[] ); data.put("4", new Object[] ); data.put("5", new Object[] ); //Iterate over data and write to sheet Set keyset = data.keySet(); int rownum = 1; // Create a Font for styling header cells Font headerFont = workbook.createFont(); headerFont.setBold(true); headerFont.setFontHeightInPoints((short) 14); headerFont.setColor(IndexedColors.RED.getIndex()); // Create a CellStyle with the font CellStyle headerCellStyle = workbook.createCellStyle(); headerCellStyle.setFont(headerFont); // Create a Header Row Row headerRow = sheet.createRow(0); // Create cells for(int i = 0; i < columns.length; i++) < Cell cell = headerRow.createCell(i); cell.setCellValue(columns[i]); cell.setCellStyle(headerCellStyle); >for (String key : keyset) < Row row = sheet.createRow(rownum++); Object [] objArr = data.get(key); int cellnum = 0; for (Object obj : objArr) < Cell cell = row.createCell(cellnum++); if(obj instanceof String) cell.setCellValue((String)obj); else if(obj instanceof Integer) cell.setCellValue((Integer)obj); >> try < //Write the workbook in file system FileOutputStream out = new FileOutputStream(new File("TechBlogStation.xlsx")); workbook.write(out); out.close(); System.out.println("****File written successfully*****"); >catch (Exception e) < e.printStackTrace(); >> >
Created Excel File from above Program :
Apache POI – Read an excel file
Reading an excel file using POI has these steps.
- Create workbook from spreadsheet
- Increment row number
- iterate over all cells in a row
- repeat step 3 and 4 until all data is read
It will read all the column names and the values cell by cell.
Java program to read excel file using apache POI api –
package com.techblogstation; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; import org.apache.poi.ss.usermodel.Cell; //import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ReadExcelFile < public static void main(String[] args) < try < FileInputStream file = new FileInputStream(new File("TechBlogStation.xlsx")); //Create Workbook instance holding reference to .xlsx file XSSFWorkbook workbook = new XSSFWorkbook(file); //Get first/desired sheet from the workbook XSSFSheet sheet = workbook.getSheetAt(0); //Iterate through each rows one by one IteratorrowIterator = sheet.iterator(); while (rowIterator.hasNext()) < Row row = rowIterator.next(); //For each row, iterate through all the columns IteratorcellIterator = row.cellIterator(); while (cellIterator.hasNext()) < Cell cell = cellIterator.next(); switch (cell.getCellType()) < case NUMERIC : System.out.print(cell.getNumericCellValue() + "\t"); break; case STRING: System.out.print(cell.getStringCellValue() + "\t"); break; >//Check the cell type and format accordingly > System.out.println("\n"); > file.close(); > catch (Exception e) < e.printStackTrace(); >> >
Conclusion
That’s all techies! In this article, You have learnt how to read excel files in Java using Apache POI library.
Работа с Excel в Java через Apache POI
Из этой статьи вы сможете узнать о записи и чтении данных из Excel файлов в Java (будет рассмотрен как XLS , так и XLSX формат). Мы будем использовать библиотеку Apache POI и сосредоточимся на работе с типами String и Date , работа с последним происходит достаточно хитро. Напомню, что работу с числами мы уже рассмотрели в другой статье.
Библиотеку poi-XX.jar вы можете использовать для всех старых ( xls , doc , ppt ) файлов Microsoft Office, для новых ( xlsx , docx , pptx ) вам понадобится poi-ooxml-XX.jar . Очень важно понимать, что к чему относится, т.к. используемые классы тоже разные — для старых расширений это HSSFWorkbook , а для новых — XSSFWorkbook .
Подготовка: загрузка библиотек и зависимостей
Конечно, существует достаточно много открытых библиотек, которые позволяют работать с Excel файлами в Java, например, JXL, но мы будем использовать имеющую самый обширный API и самую популярную — Apache POI. Чтобы её использовать, вам нужно скачать jar файлы и добавить их через Eclipse вручную, или вы можете предоставить это Maven.
Во втором случае вам нужно просто добавить следующие две зависимости:
org.apache.poi poi 3.12 org.apache.poi poi-ooxml 3.12
Самое удобное в Maven — что он загрузит не только указанные poi.jar и poi-ooxml.jar , но и все jar файлы, которые используются внутри, то есть xmlbeans-2.6.0.jar , stax-api-1.0.1.jar , poi-ooxml-schemas-3.12.jar и commons-codec-1.9.jar .
Если вы будете добавлять библиотеки вручную — не забудьте о вышеназванных файлах. Скачать всё можно отсюда. Помните — если вы загрузите только poi-XX.jar , то ваш код скомпилируется без ошибок, но потом упадёт с java.lang.NoClassDefFoundError: org/apache/xmlbeans/XmlObject , так как внутри будет вызываться xmlbeans.jar .
Запись
В этом примере мы запишем в xls файл следующие данные: в первую ячейку — строку с именем, а во вторую — дату рождения. Вот пошаговая инструкция:
- Создаём объект HSSFWorkBook ;
- Создаём лист, используя на объекте, созданном в предыдущем шаге, createSheet() ;
- Создаём на листе строку, используя createRow() ;
- Создаём в строке ячейку — createCell() ;
- Задаём значение ячейки через setCellValue();
- Записываем workbook в File через FileOutputStream ;
- Закрываем workbook , вызывая close() .
Для записи строк или чисел этого вполне достаточно, но чтобы записать дату, нам понадобится сделать ещё кое-что:
- Создать DateFormat ;
- Создать CellStyle ;
- Записать DateFormat в CellStyle ;
- Записать CellStyle в ячейку;
- Теперь в эту ячейку можно записать объект Date через всё тот же setCellValue ;
- Чтобы дата поместилась в ячейку, нам нужно добавить столбцу свойство автоматически менять размер: sheet.autoSizeColumn(1) .
Всё вместе это будет выглядеть так:
@SuppressWarnings("deprecation") public static void writeIntoExcel(String file) throws FileNotFoundException, IOException < Workbook book = new HSSFWorkbook(); Sheet sheet = book.createSheet("Birthdays"); // Нумерация начинается с нуля Row row = sheet.createRow(0); // Мы запишем имя и дату в два столбца // имя будет String, а дата рождения --- Date, // формата dd.mm.yyyy Cell name = row.createCell(0); name.setCellValue("John"); Cell birthdate = row.createCell(1); DataFormat format = book.createDataFormat(); CellStyle dateStyle = book.createCellStyle(); dateStyle.setDataFormat(format.getFormat("dd.mm.yyyy")); birthdate.setCellStyle(dateStyle); // Нумерация лет начинается с 1900-го birthdate.setCellValue(new Date(110, 10, 10)); // Меняем размер столбца sheet.autoSizeColumn(1); // Записываем всё в файл book.write(new FileOutputStream(file)); book.close(); >
Чтение
Теперь мы считаем из только что созданного файла то, что мы туда записали.
- Для начала создадим HSSFWorkBook , передав в конструктор FileInputStream ;
- Получаем лист, передавая в getSheet() его номер или название;
- Получаем строку, используя getRow() ;
- Получаем ячейку, используя getCell() ;
- Узнаём тип ячейки, используя на ней getCellType() ;
- В зависимости от типа ячейки, читаем её значения, используя getStringCellValue() , getNumericCellValue() или getDateCellValue() ;
- Закрываем workbook используя close() .
Напомню, что дату Excel хранит как числа, т.е. тип ячейки всё равно будет CELL_TYPE_NUMERIC .
В виде кода это будет выглядеть следующим образом:
public static void readFromExcel(String file) throws IOException < HSSFWorkbook myExcelBook = new HSSFWorkbook(new FileInputStream(file)); HSSFSheet myExcelSheet = myExcelBook.getSheet("Birthdays"); HSSFRow row = myExcelSheet.getRow(0); if(row.getCell(0).getCellType() == HSSFCell.CELL_TYPE_STRING)< String name = row.getCell(0).getStringCellValue(); System.out.println("name : " + name); >if(row.getCell(1).getCellType() == HSSFCell.CELL_TYPE_NUMERIC) < Date birthdate = row.getCell(1).getDateCellValue(); System.out.println("birthdate :" + birthdate); >myExcelBook.close(); >
В заключение
Как уже упомналось выше, чтение из xlsx файлов ничем принципиально не отличается — нужно только вместо HSSFWorkBook , HSSFSheet , HSSFRow (и прочих) из poi-XX.jar использовать XSSFWorkBook , XSSFSheet , XSSFRow из poi-ooxml-XX.jar . Это всё, что вам нужно знать для чтения и записи в файлы Excel. Разумеется, с помощью библиотеки Apache POI вы можете сделать гораздо больше, но эта статья должна помочь вам быстрее в ней освоиться.
Что думаете?
Устроили «сайт знакомств» из найма.В место того чтобы понять что приходящие на собесодования Степашки по большей части интроверты и адаптироваться — лезут в душу со страными вопросами которые Степашек пугают.И упорно пилят гайды как понравится HRюшам.Детсад а не профессионализм.Причем программист в принципе вне круга коллег и общаться то уметь не обязан(а внутри пусть хоть как модемы пиликают).Общаться с кандидатом должен ументь именно HR. Иначе это не HR а редиска.
Ребят, тут собрались ноунеймы которые не работают ни на одном языке, но пишут свое очень важное мнение в комментариях. Лучше проходите мимо и не читайте их. Ах да, учите go и устройтесь в яндекс)
Как вы собираетесь искать хороших сотрудников, если (в большинстве компаний) честных кандидатов отметают даже не пригласив на техническое собеседование?Если умение лгать является обязательным, чтобы устроиться к вам на работу, то не удивляйтесь что «сложно найти хорошего сотрудника».Я знаю о чем говорю. В нашей компании для продвижения программистов на аутсорс есть целая отдельная команда, которая полностью специализируется на «продаже сотрудников». Это люди, которые пристально изучают хотелки чсв hr-ов, пишут «идеальные» резюме и отвечают на все вопросы так, «как надо». А программист приходит только на техническое собеседование в конце.Хорошие сотрудники (как правило) не станут накручивать себе 20 лет стажа, рассказывать про мотивацию «не ради денег», отвечать на глупые вопросы про квадратные люки и прочую ерунду.Вам нужно не учить людей в интернете «как правильно отвечать на наши вопросы, чтобы вы у нас прошли собес», а мыслить шире и заниматься реальным поиском толковых специалистов, которые не обязаны иметь топовые софт-скилы.В противном случае — получайте «идеальные» резюме, написанные по единому шаблону и котов в мешке. И не забудьте пожаловаться что «сложно найти хорошего сотрудника».