Apache poi hssf excel

Learn to read excel, write excel, evaluate formula cells and apply custom formatting to the generated excel files using Apache POI library with examples.

If we are building software for the HR or Finance domain, there is usually a requirement for generating excel reports across management levels. Apart from reports, we can also expect some input data for the applications coming in the form of excel sheets and the application is expected to support this requirement.

Apache POI is a well-trusted library among many other open-source libraries to handle such usecases involving excel files. Please note that, in addition, we can read and write MS Word and MS PowerPoint files also using the Apache POI library.

This Apache POI tutorial will discuss some everyday excel operations in real-life applications.

  1. 1. Maven Dependency
  2. 2. Important Classes in POI Library
  3. 3. Writing an Excel File
  4. 4. Reading an Excel File
  5. 5. Add and Evaluate Formula Cells
  6. 6. Formatting the Cells
  7. 7. Conclusion

1. Maven Dependency

If we are working on a maven project, we can include the Apache POI dependencies in pom.xml file using this:

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

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>5.2.2</version>
</dependency>

2. Important Classes in POI Library

  1. HSSF, XSSF and XSSF classes

    Apache POI main classes usually start with either HSSF, XSSF or SXSSF.

    • HSSF – is the POI Project’s pure Java implementation of the Excel 97(-2007) file format. e.g., HSSFWorkbook, HSSFSheet.
    • XSSF – is the POI Project’s pure Java implementation of the Excel 2007 OOXML (.xlsx) file format. e.g., XSSFWorkbook, XSSFSheet.
    • SXSSF (since 3.8-beta3) – is an API-compatible streaming extension of XSSF to be used when huge spreadsheets have to be produced and heap space is limited. e.g., SXSSFWorkbook, SXSSFSheet. SXSSF achieves its low memory footprint by limiting access to the rows within a sliding window, while XSSF gives access to all rows in the document.
  2. Row and Cell

    Apart from the above classes, Row and Cell interact with a particular row and a particular cell in an excel sheet.

  3. Styling Related Classes

    A wide range of classes like CellStyle, BuiltinFormats, ComparisonOperator, ConditionalFormattingRule, FontFormatting, IndexedColors, PatternFormatting, SheetConditionalFormatting etc. are used when you have to add formatting to a sheet, primarily based on some rules.

  4. FormulaEvaluator

    Another helpful class FormulaEvaluator is used to evaluate the formula cells in an excel sheet.

3. Writing an Excel File

I am taking this example first so we can reuse the excel sheet created by this code in further examples.

Writing excel using POI is very simple and involves the following steps:

  1. Create a workbook
  2. Create a sheet in workbook
  3. Create a row in sheet
  4. Add cells to sheet
  5. Repeat steps 3 and 4 to write more data

It seems very simple, right? Let’s have a look at the code doing these steps.

Java program to write an excel file using Apache POI library.

package com.howtodoinjava.demo.poi;
//import statements
public class WriteExcelDemo 
{
    public static void main(String[] args) 
    {
        //Blank workbook
        XSSFWorkbook workbook = new XSSFWorkbook(); 
         
        //Create a blank sheet
        XSSFSheet sheet = workbook.createSheet("Employee Data");
          
        //This data needs to be written (Object[])
        Map<String, Object[]> data = new TreeMap<String, Object[]>();
        data.put("1", new Object[] {"ID", "NAME", "LASTNAME"});
        data.put("2", new Object[] {1, "Amit", "Shukla"});
        data.put("3", new Object[] {2, "Lokesh", "Gupta"});
        data.put("4", new Object[] {3, "John", "Adwards"});
        data.put("5", new Object[] {4, "Brian", "Schultz"});
          
        //Iterate over data and write to sheet
        Set<String> keyset = data.keySet();
        int rownum = 0;
        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("howtodoinjava_demo.xlsx"));
            workbook.write(out);
            out.close();
            System.out.println("howtodoinjava_demo.xlsx written successfully on disk.");
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }
}
poi-demo-write-file

See Also: Appending Rows to Excel

4. Reading an Excel File

Reading an excel file using POI is also very simple if we divide this into steps.

  1. Create workbook instance from an excel sheet
  2. Get to the desired sheet
  3. Increment row number
  4. iterate over all cells in a row
  5. repeat steps 3 and 4 until all data is read

Let’s see all the above steps in code. I am writing the code to read the excel file created in the above example. It will read all the column names and the values in it – cell by cell.

Java program to read an excel file using Apache POI library.

package com.howtodoinjava.demo.poi;
//import statements
public class ReadExcelDemo 
{
    public static void main(String[] args) 
    {
        try
        {
            FileInputStream file = new FileInputStream(new File("howtodoinjava_demo.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
            Iterator<Row> rowIterator = sheet.iterator();
            while (rowIterator.hasNext()) 
            {
                Row row = rowIterator.next();
                //For each row, iterate through all the columns
                Iterator<Cell> cellIterator = row.cellIterator();
                 
                while (cellIterator.hasNext()) 
                {
                    Cell cell = cellIterator.next();
                    //Check the cell type and format accordingly
                    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("");
            }
            file.close();
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }
}

Program Output:

ID      NAME        LASTNAME
1.0     Amit        Shukla  
2.0     Lokesh      Gupta   
3.0     John        Adwards 
4.0     Brian       Schultz 

See Also: Apache POI – Read an Excel File using SAX Parser

5. Add and Evaluate Formula Cells

When working on complex excel sheets, we encounter many cells with formulas to calculate their values. These are formula cells. Apache POI also has excellent support for adding formula cells and evaluating already present formula cells.

Let’s see one example of how to add formula cells in excel?

The sheet has four cells in a row and the fourth one in the multiplication of all the previous 3 rows. So the formula will be: A2*B2*C2 (in the second row)

Java program to add formula in an excel file using Apache POI library.

public static void main(String[] args) 
{
    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet sheet = workbook.createSheet("Calculate Simple Interest");
  
    Row header = sheet.createRow(0);
    header.createCell(0).setCellValue("Pricipal");
    header.createCell(1).setCellValue("RoI");
    header.createCell(2).setCellValue("T");
    header.createCell(3).setCellValue("Interest (P r t)");
      
    Row dataRow = sheet.createRow(1);
    dataRow.createCell(0).setCellValue(14500d);
    dataRow.createCell(1).setCellValue(9.25);
    dataRow.createCell(2).setCellValue(3d);
    dataRow.createCell(3).setCellFormula("A2*B2*C2");
      
    try {
        FileOutputStream out =  new FileOutputStream(new File("formulaDemo.xlsx"));
        workbook.write(out);
        out.close();
        System.out.println("Excel with foumula cells written successfully");
          
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Similarly, we want to read a file with formula cells and use the following logic to evaluate formula cells.

Java program to evaluate formula in an excel file using Apache POI library.

public static void readSheetWithFormula()
{
    try
    {
        FileInputStream file = new FileInputStream(new File("formulaDemo.xlsx"));
 
        //Create Workbook instance holding reference to .xlsx file
        XSSFWorkbook workbook = new XSSFWorkbook(file);
 
        FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
         
        //Get first/desired sheet from the workbook
        XSSFSheet sheet = workbook.getSheetAt(0);
 
        //Iterate through each rows one by one
        Iterator<Row> rowIterator = sheet.iterator();
        while (rowIterator.hasNext()) 
        {
            Row row = rowIterator.next();
            //For each row, iterate through all the columns
            Iterator<Cell> cellIterator = row.cellIterator();
             
            while (cellIterator.hasNext()) 
            {
                Cell cell = cellIterator.next();
                //Check the cell type after eveluating formulae
                //If it is formula cell, it will be evaluated otherwise no change will happen
                switch (evaluator.evaluateInCell(cell).getCellType()) 
                {
                    case Cell.CELL_TYPE_NUMERIC:
                        System.out.print(cell.getNumericCellValue() + "tt");
                        break;
                    case Cell.CELL_TYPE_STRING:
                        System.out.print(cell.getStringCellValue() + "tt");
                        break;
                    case Cell.CELL_TYPE_FORMULA:
                        //Not again
                        break;
                }
            }
            System.out.println("");
        }
        file.close();
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }
}

Program Output:

Pricipal        RoI         T       Interest (P r t)        
14500.0         9.25        3.0     402375.0  
poi-demo-write-formula

6. Formatting the Cells

So far we have seen examples of reading/writing and excel files using Apache POI. But, when creating a report in an excel file, it is essential to add formatting on cells that fit into any pre-determined criteria.

This formatting can be a different coloring based on a specific value range, expiry date limit etc.

In the below examples, we are taking a couple of such cell formatting examples for various purposes.

6.1. Cell value in a specific range

This code will color any cell in a range whose value is between a configured range. [e.g., between 50 and 70]

static void basedOnValue(Sheet sheet) 
{
    //Creating some random values
    sheet.createRow(0).createCell(0).setCellValue(84);
    sheet.createRow(1).createCell(0).setCellValue(74);
    sheet.createRow(2).createCell(0).setCellValue(50);
    sheet.createRow(3).createCell(0).setCellValue(51);
    sheet.createRow(4).createCell(0).setCellValue(49);
    sheet.createRow(5).createCell(0).setCellValue(41);
 
    SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
 
    //Condition 1: Cell Value Is   greater than  70   (Blue Fill)
    ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule(ComparisonOperator.GT, "70");
    PatternFormatting fill1 = rule1.createPatternFormatting();
    fill1.setFillBackgroundColor(IndexedColors.BLUE.index);
    fill1.setFillPattern(PatternFormatting.SOLID_FOREGROUND);
 
    //Condition 2: Cell Value Is  less than      50   (Green Fill)
    ConditionalFormattingRule rule2 = sheetCF.createConditionalFormattingRule(ComparisonOperator.LT, "50");
    PatternFormatting fill2 = rule2.createPatternFormatting();
    fill2.setFillBackgroundColor(IndexedColors.GREEN.index);
    fill2.setFillPattern(PatternFormatting.SOLID_FOREGROUND);
 
    CellRangeAddress[] regions = {
            CellRangeAddress.valueOf("A1:A6")
    };
 
    sheetCF.addConditionalFormatting(regions, rule1, rule2);
}
poi-demo-formatting-1

6.2. Highlight Duplicate Values

Highlight all cells which have duplicate values in observed cells.

static void formatDuplicates(Sheet sheet) {
    sheet.createRow(0).createCell(0).setCellValue("Code");
    sheet.createRow(1).createCell(0).setCellValue(4);
    sheet.createRow(2).createCell(0).setCellValue(3);
    sheet.createRow(3).createCell(0).setCellValue(6);
    sheet.createRow(4).createCell(0).setCellValue(3);
    sheet.createRow(5).createCell(0).setCellValue(5);
    sheet.createRow(6).createCell(0).setCellValue(8);
    sheet.createRow(7).createCell(0).setCellValue(0);
    sheet.createRow(8).createCell(0).setCellValue(2);
    sheet.createRow(9).createCell(0).setCellValue(8);
    sheet.createRow(10).createCell(0).setCellValue(6);
 
    SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
 
    // Condition 1: Formula Is   =A2=A1   (White Font)
    ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("COUNTIF($A$2:$A$11,A2)>1");
    FontFormatting font = rule1.createFontFormatting();
    font.setFontStyle(false, true);
    font.setFontColorIndex(IndexedColors.BLUE.index);
 
    CellRangeAddress[] regions = {
            CellRangeAddress.valueOf("A2:A11")
    };
 
    sheetCF.addConditionalFormatting(regions, rule1);
 
    sheet.getRow(2).createCell(1).setCellValue("<== Duplicates numbers in the column are highlighted.  " +
            "Condition: Formula Is =COUNTIF($A$2:$A$11,A2)>1   (Blue Font)");
}
poi-demo-formatting-2

6.3. Alternate Color Rows in Different Colors

A simple code to color each alternate row in a different color.

static void shadeAlt(Sheet sheet) {
    SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
 
    // Condition 1: Formula Is   =A2=A1   (White Font)
    ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("MOD(ROW(),2)");
    PatternFormatting fill1 = rule1.createPatternFormatting();
    fill1.setFillBackgroundColor(IndexedColors.LIGHT_GREEN.index);
    fill1.setFillPattern(PatternFormatting.SOLID_FOREGROUND);
 
    CellRangeAddress[] regions = {
            CellRangeAddress.valueOf("A1:Z100")
    };
 
    sheetCF.addConditionalFormatting(regions, rule1);
 
    sheet.createRow(0).createCell(1).setCellValue("Shade Alternating Rows");
    sheet.createRow(1).createCell(1).setCellValue("Condition: Formula Is  =MOD(ROW(),2)   (Light Green Fill)");
}
poi-demo-formatting-3

6.4. Color amounts that are going to expire in the next 30 days

A handy code for financial projects which keeps track of deadlines.

static void expiryInNext30Days(Sheet sheet) 
{
    CellStyle style = sheet.getWorkbook().createCellStyle();
    style.setDataFormat((short)BuiltinFormats.getBuiltinFormat("d-mmm"));
 
    sheet.createRow(0).createCell(0).setCellValue("Date");
    sheet.createRow(1).createCell(0).setCellFormula("TODAY()+29");
    sheet.createRow(2).createCell(0).setCellFormula("A2+1");
    sheet.createRow(3).createCell(0).setCellFormula("A3+1");
 
    for(int rownum = 1; rownum <= 3; rownum++) sheet.getRow(rownum).getCell(0).setCellStyle(style);
 
    SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
 
    // Condition 1: Formula Is   =A2=A1   (White Font)
    ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("AND(A2-TODAY()>=0,A2-TODAY()<=30)");
    FontFormatting font = rule1.createFontFormatting();
    font.setFontStyle(false, true);
    font.setFontColorIndex(IndexedColors.BLUE.index);
 
    CellRangeAddress[] regions = {
            CellRangeAddress.valueOf("A2:A4")
    };
 
    sheetCF.addConditionalFormatting(regions, rule1);
 
    sheet.getRow(0).createCell(1).setCellValue("Dates within the next 30 days are highlighted");
}
poi-demo-formatting-4

I am ending this apache poi tutorial here to keep the post within a limit.

7. Conclusion

In this tutorial, we learned to read excel, write excel, set and evaluate formula cells, and format the cells with color codings using the Apache POI library.

Happy Learning !!

Source Code on Github

Афоризм

У тебя ноги уже кончились, а платье еще не началось!

Лариса Гузеева

Поддержка проекта

Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие

 • Yandex.Деньги
  410013796724260

 • Webmoney
  R335386147728
  Z369087728698

Apache POI, взаимодействие с Excel

Apache POI представляет собой API, который позволяет использовать файлы MS Office в Java приложениях.
Данная библиотека разрабатывается и распространяется Apache Software Foundation и носит открытый характер.
Apache POI включает классы и методы для чтения и записи информации в документы MS Office.

Описание компонентов

HSSF Horrible Spreadsheet Format Компонент чтения и записи файлов MS-Excel, формат XLS
XSSF XML Spreadsheet Format Компонент чтения и записи файлов MS-Excel, формат XLSX
HPSF Horrible Property Set Format Компонент получения наборов свойств файлов MS-Office
HWPF Horrible Word Processor Format Компонент чтения и записи файлов MS-Word, формат DOC
XWPF XML Word Processor Format Компонент чтения и записи файлов MS-Word, формат DOCX
HSLF Horrible Slide Layout Format Компонент чтения и записи файлов PowerPoint, формат PPT
XSLF XML Slide Layout Format Компонент чтения и записи файлов PowerPoint, формат PPTX
HDGF Horrible DiaGram Format Компонент работы с файлами MS-Visio, формат VSD
XDGF XML DiaGram Format Компонент работы с файлами MS-Visio, формат VSDX

Список компонентов

Наименование (артeфакт) Необходимые компоненты
poi commons-logging, commons-codec, commons-collections, log4j
poi-scratchpad poi
poi-ooxml poi, poi-ooxml-schemas
poi-ooxml-schemas xmlbeans
poi-examples poi, poi-scratchpad, poi-ooxml
ooxml-schemas xmlbeans
ooxml-security xmlbeans

Подключение Apache POI к проекту

Для подключения Apache POI к проекту необходимо скачать соответствующие библиотеки с официального сайта
https://poi.apache.org/download.html.

Если в проекте используется фреймворк maven, то необходимо установить одну из
следующих зависимостей (версия может быть более новой) :

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.16</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.16</version>
</dependency>

На странице описания примера чтения файлов Excel приведен проект, включающий
необходимый набор файлов библиотеки Apache POI (poi-3.16.jar, poi-ooxml-3.16.jar, poi-ooxml-schemas-3.16.jar) и
сопутствующих библиотек.

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

  • рабочая книга — HSSFWorkbook, XSSFWorkbook
  • лист книги — HSSFSheet, XSSFSheet
  • строка — HSSFRow, XSSFRow
  • ячейка — HSSFCell, XSSFCell
  • стиль — стили ячеек HSSFCellStyle, XSSFCellStyle
  • шрифт — шрифт ячеек HSSFFont, XSSFFont

Поскольку описание всех классов и методов не разместить на одной
странице, то ниже по тексту приводятся ссылки для перехода к исходной документации.

Классы и методы Apache POI для работы с файлами Excel

Рабочая книга HSSFWorkbook, XSSFWorkbook

  • HSSFWorkbook
    • org.apache.poi.hssf.usermodel
    • класс чтения и записи файлов Microsoft Excel в формате .xls, совместим
      с версиями MS-Office 97-2003;
  • XSSFWorkbook
    • org.apache.poi.xssf.usermodel
    • класс чтения и записи файлов Microsoft Excel в формате .xlsx, совместим
      с MS-Office 2007 или более поздней версии.

Конструкторы класса HSSFWorkbook

HSSFWorkbook ();
HSSFWorkbook (InternalWorkbook book);
HSSFWorkbook (POIFSFileSystem  fs);
HSSFWorkbook (NPOIFSFileSystem fs);
HSSFWorkbook (POIFSFileSystem  fs, 
              boolean preserveNodes);
HSSFWorkbook (DirectoryNode directory, 
              POIFSFileSystem fs, 
              boolean preserveNodes);
HSSFWorkbook (DirectoryNode directory,
              boolean preserveNodes);
HSSFWorkbook (InputStream s);
HSSFWorkbook (InputStream s, 
              boolean preserveNodes);

preservenodes является необязательным параметром, который определяет необходимость сохранения
узлов типа макросы.

Конструкторы класса XSSFWorkbook

XSSFWorkbook ();
// workbookType  создать .xlsx или .xlsm
XSSFWorkbook (XSSFWorkbookType workbookType);
XSSFWorkbook (OPCPackage   pkg );
XSSFWorkbook (InputStream  is  );
XSSFWorkbook (File         file);
XSSFWorkbook (String       path);

Основные методы HSSFWorkbook, XSSFWorkbook

Метод Описание
createSheet () Создание страницы книги HSSFSheet, XSSFSheet
createSheet (String name) Создание страницы с определенным наименованием
CreateFont () Создание шрифта
createCellStyle () Создание стиля

С полным перечнем всех методов класса XSSFWorkbook можно познакомиться на странице
http://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFWorkbook.html.

Классы листов книги, HSSFSheet, XSSFSheet

  • org.apache.poi.hssf.usermodel.HSSFSheet
  • org.apache.poi.xssf.usermodel.XSSFSheet

Классы HSSFSheet, XSSFSheet включают свойства и методы создания строк, определения размера колонок,
слияния ячеек в одну область и т.д.

Основные методы классов работы с листами

Метод Описание
addMergedRegion (CellRangeAddress) Определение области слияния ячеек страницы
autoSizeColumn (int column) Автоматическая настройка ширины колонки column (отсчет от 0)
setColumnWidth (int column, int width) Настройка ширины колонки column (отсчет от 0)
createRow (int row) Создание строки row (отсчет от 0)
getRow (int row) Получение ссылки на строку row (отсчет от 0)

С полным перечнем всех методов класса XSSFSheet можно познакомиться на странице
https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFSheet.html

Классы строк HSSFRow, XSSFRow

  • org.apache.poi.hssf.usermodel.HSSFRow
  • org.apache.poi.xssf.usermodel.XSSFRow

Классы HSSFRow, XSSFRow включают свойства и методы работы со строками, создания ячеек в строке и т.д.

Основные методы классов HSSFRow, XSSFRow

Метод Описание
setHeight (short) Определение высоты строки
getHeight() Получение значения высоты в twips’ах (1/20)
getHeightInPoints() Получение значение высоты
createCell (int) Создание ячейки в строке (отсчет от 0)
getCell(int) Получение ссылки на ячейку
getFirstCellNum() Получение номера первой ячейки в строке
setRowStyle(CellStyle) Определение стиля всей строки

С полным перечнем всех методов класса XSSFRow можно познакомиться на странице
http://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFRow.html

Классы ячеек HSSFCell, XSSFCell

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

Классы HSSFCell, XSSFCell включают свойства и методы работы с ячейками таблицы.

  • org.apache.poi.hssf.usermodel.HSSFCell
  • org.apache.poi.xssf.usermodel.XSSFCell

Основные методы классов HSSFCell, XSSFCell

Метод Описание
getBooleanCellValue() Чтение логического значения ячейки
getDateCellValue() Чтение значения ячейки типа java.util.Date
getNumericCellValue() Чтение числового значения ячейки типа double
getStringCellValue() Чтение текстового значения ячейки (java.lang.String)
setCellValue(boolean) Определение логического значения ячейки
setCellValue(java.util.Calendar) Определение значения ячейки типа даты
setCellValue(java.util.Date) Определение значения ячейки типа даты
getCellTypeEnum() Чтение типа значения ячейки CellType
setCellComment(Comment) Запись комментария в ячейку
getCellComment() Чтение комментария ячейки
removeCellComment() Удаление комментария ячейки
setHyperlink(Hyperlink) Запись гиперссылки в ячейку
getHyperlink() Чтение гиперссылки XSSFHyperlink в ячейке
removeHyperlink() Удаления гиперссылки ячейки
getCellFormula() Чтение формулы, например SUM(C4:E4)
setCellFormula(String) Определение формулы, например =SUM(C4:E4)
getCellStyle() Чтение стиля ячейки (XSSFCellStyle)
setCellStyle(CellStyle) Определение стиля ячейки
getColumnIndex() Определение индекса ячейки
setAsActiveCell() Определение активности ячейки

С полным перечнем всех методов класса XSSFCell можно познакомиться на странице
http://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCell.html

Классы стилей ячеек HSSFCellStyle, XSSFCellStyle

С полным перечнем всех свойств и методов класса XSSFCellStyle можно познакомиться на странице
http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/CellStyle.html

Ниже в качестве примера представлен метод, формирующий стиль ячейки, в которой :

  • текст центрируется по вертикали и горизонтали;
  • обрамление ячейки представляет тонкую черную линию по периметру;
  • текст переносится на следующую строку (не ячейку), если не вмещается в размер ячейки.
private XSSFCellStyle createCellStyle(XSSFWorkbook book)
{
    BorderStyle thin  = BorderStyle.THIN;
    short       black = IndexedColors.BLACK.getIndex();

    XSSFCellStyle style = book.createCellStyle();

    style.setWrapText(true);
    style.setAlignment        (HorizontalAlignment.CENTER);
    style.setVerticalAlignment(VerticalAlignment  .CENTER);

    style.setBorderTop        (thin);
    style.setBorderBottom     (thin);
    style.setBorderRight      (thin);
    style.setBorderLeft       (thin);

    style.setTopBorderColor   (black);
    style.setRightBorderColor (black);
    style.setBottomBorderColor(black);
    style.setLeftBorderColor  (black);

    return style;
}

Метод setWrapText позволяет определить флаг переноса текста в ячейке согласно ее размеру (ширине). Чтобы перенести
текст принудительно, можно в текстовой строке установить символы CRCL, например «Разделительrnтекста».

Классы шрифтов HSSFFont, XSSFFont

С полным перечнем всех свойств и методов класса XSSFFont можно познакомиться на странице
http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Font.html

Ниже в качестве примера представлен метод, формирующий шрифт типа «Times New Roman» :

private XSSFFont createCellFont(XSSFWorkbook book)
{
    XSSFFont font = workBook.createFont();
    font.setFontHeightInPoints((short) 12);
    font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
    font.setFontName("Times New Roman");
           
    return(font);
}
. . .
HSSFCellStyle style = book.createCellStyle();
style.setFont(createCellFont(book));

Примеры создания файлов Excel и определение стилей ячеек рассмотрены
здесь.

Опубликовано: журнал «Системный администратор» №4, 2017г. Привожу статью полностью (с некоторыми изменениями).

К теме генерации отчетов время от времени приходится обращаться практически каждому программисту. Получив очередное техзадание — сделать отчет для информационной системы предприятия именно в Microsoft Excel и имея некоторый опыт построения отчетов с помощью технологий, описанных в [1], решено было исследовать — какой из современных генераторов отчетов (желательно бесплатный) подошел бы для решения этой задачи. При этом совершенно не хотелось лезть в поднадоевшие механизмы OLE-DDE, привязываясь к одной из операционных систем.

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

В процессе поиска информации заставил «потереть руки» в предвкушении чего-то интересного один проект — Apache POI, выпущенный под лицензией APACHE LICENSE. Официальный сайт проекта, в котором, кстати, может принять участие любой желающий, — https://poi.apache.org [2]. Аббревиатура POI (и другие — см. ниже) на титульной странице никак не объясняется, однако в [3], [8] даются некоторые разъяснения. На официальном сайте также читаем: «Вы можете использовать HSSF если Вам необходимо прочитать или записать файл Excel (XLS) с помощью Java. Вы можете использовать XSSF, если вам нужно прочитать или записать файл OOXML Excel (XLSX) с помощью Java. Комбинированный интерфейс SS позволяет легко считывать и записывать все виды файлов Excel (XLS и XLSX) с использованием той же Java. Кроме того, существует специализированная реализация SXSSF, которая позволяет работать с очень большими Excel (XLSX) файлами в памяти с оптимизацией.»

Описанные возможности HSSF с лихвой охватывали потребности нашего (кстати сказать, небольшого по объему — около 10 страниц) отчета. После анализа техзадания, выполнение задачи было разбито на два этапа: 1 этап — данные из информационной системы с помощью ее инструментов, должны быть выгружены в текстовый файл с разделителями, затем 2 этап — файл должен незаметно для пользователя подхватиться программой на Java и, после обработки, вывестись пользователю на экран уже в Excel. Подобные поэтапные решения применяются в так называемой «лоскутной» автоматизации, описаны в [1] и довольно часто применяются в информационных системах.

Целью статьи будет описание процесса создания программы на языке программирования Java для решения задач 2 этапа, а именно — открытие текстового файла с разделителями и формирование многостраничного отчета с помощью библиотеки POI, способного открыться в Microsoft Excel. Программировать будем в JDK 6 (Linux Mint 13 LTE, версия Java — OpenJDK 1.6), сама программа, что естественно для языка программирования Java, после компиляции должна выполняться и в Linux и в Windows. Если Вы не знакомы с языком программирования Java, вот ссылка на вводный курс по языку.

Итак, скачиваем стабильную версию POI — 3.15 на момент написания статьи (см. рис. 1 и ссылку [4])


Рис.1 Сайт проекта POI poi_slide_1.png

Когда файл скачан (для версии 3.15 это poi-bin-3.15-20160924.tar.gz), распаковываем его, у меня на компьютере в домашней директории место нашлось в папке java/poi-3.15
$ cd ~/java
$ tar xzvf poi-bin-3.15-20160924.tar.gz

Для работы с библиотекой нужно показать путь к ее файлам в переменной окружения CLASSPATH, для этого заходим в файл .profile в домашнем каталоге
$ vim .profile

в конце файла пишем

export POI_HOME=$HOME/java/poi-3.15
export POI_CLASSES=$POI_HOME/poi-3.15.jar
export CLASSPATH=$CLASSPATH:$POI_CLASSES:.

следите за путями, они зависят от того, куда Вы разместите файл библиотеки poi-x.xx.jar.

Далее, нужно применить изменения в .profile

$ source .profile

или, на худой конец, перезагрузиться, после чего можно проверить правильность пути с помощью команды
echo $CLASSPATH

Теперь необходимо убедиться что все работает, библиотека установлена правильно, т.е. файлы скопированы и нужные пути прописаны в переменной окружения CLASSPATH.
Повторив пример «Writing a new file» см. ссылку [5], убеждаемся что это так. Чтобы этот пример был работоспособен, необходимо добавить открытый (public) класс, функцию main() и следующий импорт:

import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.util.CellRangeAddress;

При компиляции этого примера в том виде, в котором он есть на сайте, правда, получаем предупреждения об использовании устаревших (deprecated) методов (см. рис. 2), однако для любителей «чистой» компиляции есть информация [6], [7], где указано чем эти методы заменить.


Рис.2 Компиляция примера с сайта https://poi.apache.org/spreadsheet/how-to.html

После запуска программы (допустим программный файл назывался Generator.java) командой
$ java Generator
в текущем каталоге обнаруживается файл workbook.xls (см. рис. 3), просматривая который можно понять, что делает пробная программа и какие свойства ячеек Excel она изменяет.

Что еще может POI как генератор отчета? Да практически все, что нужно самому требовательному заказчику: от изменения параметров ячейки таблицы (высоты, ширины, используемого в ячейке шрифта, выравнивания) до размещения диаграмм на листе рабочей книги.


Рис.3 Файл workbook.xls

Ну и, конечно, приведем часть кода, необходимую для решения нашей технической задачи, в котором читается файл с разделителями и значения оттуда попадают в ячейки Excel. Программа из листинга 1 может послужить заготовкой для нужного вашему руководству или коллеге отчета и использует в качестве входного текстовый файл с символом «#» в качестве разделителя.

Листинг 1. класс POIExample.java, формирующий книгу example.xls из текстового файла с разделителями в кодировке Windows 1251

public class POIExample {

    private int n;
    private StringTokenizer st;
    // вспомогательные переменные
    // для строки текстового файла
    private String line = null;
    // для строки и ячейки Excel
    private short rownum;
    private short cellnum;

  // Конструктор класса
  POIExample(String fileName) throws Exception {

   

// выходной поток — новый файл .xls
    FileOutputStream out = new FileOutputStream(«example.xls»);
    // создаем новую книгу
    HSSFWorkbook wb = new HSSFWorkbook();
    // создаем новый лист
    HSSFSheet s = wb.createSheet();
    // объявляем объект строки
    HSSFRow r = null;
    // объявляем объект ячейки
    HSSFCell c = null;
    // создаем 3 объекта стилей
    HSSFCellStyle cs = wb.createCellStyle();
    HSSFCellStyle cs2 = wb.createCellStyle();
    HSSFCellStyle cs3 = wb.createCellStyle();

   
    // создаем 2 объекта шрифта
    HSSFFont f = wb.createFont();
    HSSFFont f2 = wb.createFont();

    // устанавливаем размер первого шрифта 14 пунктов
    f.setFontHeightInPoints((short)14);
    // тип шрифта
    f.setFontName(«TimesNewRoman»);
    // делаем шрифт полужирным
    f.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

    // Устанавливаем размер второго шрифта 10 пунктов
    …

    // для первого стиля устанавливаем шрифт f2
    cs.setFont(f2);
    // выравнивание
    cs.setAlignment(cs.ALIGN_LEFT);
    // обрамление
    cs.setBorderBottom(cs2.BORDER_THIN);
    cs.setBorderTop(cs2.BORDER_THIN);
    cs.setBorderLeft(cs2.BORDER_THIN);
    cs.setBorderRight(cs2.BORDER_THIN);
    // в этом стиле формат ячейки — по умолчанию

   

// стиль cs2
    // задаем обрамление
    …
    // для примера — зададим формат ячейки «text»
    cs2.setDataFormat(HSSFDataFormat.getBuiltinFormat(«text»));
    //выравнивание — по центру
    cs2.setAlignment(cs.ALIGN_CENTER);
    // для стиля cs2 установим шрифт
    cs2.setFont(f2);

   
    // стиль cs3
    …

    // задаем имя листа
    wb.setSheetName(0, «Отчет за V квартал» );

    // Открываем файл в кодировке Windows 1251
    BufferedReader in = new BufferedReader(new InputStreamReader(
             new FileInputStream(fileName), Charset.forName(«CP1251»)));

    rownum = (short) 0;

   
    // создаем ячейку для заголовка
    r = s.createRow(rownum);
    cellnum = (short) 0;
    c = r.createCell(cellnum);
    // устанавливаем высоту ячейки заголовка
    r.setHeight((short) 450);
    // устанавливаем стиль для ячейки
    c.setCellStyle(cs3);
    // текст для заголовка
    c.setCellValue(«Заголовок отчета за V квартал»);

   
    rownum++;

   
    // идем по строкам текстового файла
    while( (line = in.readLine()) != null) {
      if(line.trim().length()==0) break;

     
      // создаем новую строку
      r = s.createRow(rownum);
      //уст. высоту
      r.setHeight((short) 400);

     
      // разбиваем строку на токены, разделитель «#»
      st = new StringTokenizer(line, «#»);

     
      n = st.countTokens();
      String[] a = new String[n];

     
      for (int j = 0; j < n; j++) {

       
        a[j] = st.nextToken();
        cellnum = (short) j;
        // создаем ячейку
        c = r.createCell(cellnum);
        // первая ячейка пошире и выравниваем шрифт по центру
        if (j == 0) {
                c.setCellStyle(cs);
                s.setColumnWidth((short) cellnum, (short) 14000);
        }
        //остальные используют стиль cs2
        else {
                c.setCellStyle(cs2);
                s.setColumnWidth((short) cellnum, (short) 3500);
        }
        // устанавливаем значение ячейки
        c.setCellValue(a[j]);

       
      }
      // переходим к следующей строке
      rownum++;

     
    }

   
    // Закрываем поток чтения файла
    in.close();

   
    // записываем информацию и закрываем выходной поток
    wb.write(out);
    out.close();

       
    return;
  }

 

public static void main (String args[]) throws Exception {
        String file = «»;

               
        for(int n = 0; n < args.length; n++) {
            if (args[n].equals(«-f»)) file = args[++n];
            else throw new IllegalArgumentException(«Неверный аргумент!»);
        }
        new POIExample (file);

       
  }

}

В ОС Windows, например, программу можно запустить таким командным файлом, задав имя файла для обработки в параметре командной строки

cd pathtoprogram
SET CLASSPATH=.;pathtopoi-3.15poi-3.15.jar
java your.packet.POIExample -f %1
start /b pathtoprogramexample.xls

Полный код POIExample.java можно скачать здесь.
Еще пример создания отчета по такой технологии (настройки отчета выведены в текстовый файл) — https://github.com/situla/POIMultilineReport. Отчет успешно применяется при создания спецификации из .bom-файла (Bill of Materials — перечень элементов) программы P-CAD для организации, в которой я в настоящее время работаю.

Мы рассмотрели ключевые моменты использования технологии POI для формирования отчета и выяснили — эта библиотека с открытым исходным кодом помогает быстро и качественно «приручить» Excel. За остальным обращайтесь к справке [8], которая, кстати сказать, хорошо документирована. Отмечу также скорость формирования отчета с помощью POI, она приятно удивляет! А Вам желаю удивить коллег отличным отчетом!

1. http://www.learn2prog.ru/ooo-report, «Java — отчет с помощью OpenOffice.org Writer»
2. Сайт проекта POI https://poi.apache.org
3. https://en.wikipedia.org/wiki/Talk%3AApache_POI
4. https://poi.apache.org/download.html#POI-3.15
5. https://poi.apache.org/spreadsheet/how-to.html
6. https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Font.html
7. https://poi.apache.org/apidocs/deprecated-list.html
8. https://poi.apache.org/apidocs/index.html

Интеграция электронных таблиц MS Excel в Java.

Описание:


В современном мире очень много случаев, при которых необходимо интегрировать MS
Excel с Java. Например, при разработке Enterprise-приложения в некой финансовой
сфере, вам необходимо предоставить счет для заинтересованных лиц, а проще всего
выставлять счет на MS Excel.

Обзор существующих API MS Excel для Java:


Рассмотрим основные API:

  • Docx4j — это API с открытым исходным кодом, для создания и манипулирования документами формата Microsoft Open XML, к которым отросятся Word docx, Powerpoint pptx, Excel xlsx файлы. Он очень похож на Microsoft OpenXML SDK, но реализован на языке Java. Docx4j использует JAXB архитектуру для создания представления объекта в памяти. Docx4j акцентирует свое внимание на всесторонней поддержке заявленного формата, но от пользователя данного API требуется знание и понимание технологии JAXB и структуры Open XML.

  • Apache POI — это набор API с открытым исходным кодом, который предлагает определенные функции для чтения и записи различных документов, базирующихся на Office Open XML стандартах (OOXML) и Microsoft OLE2 форматe документов (OLE2). OLE2 файлы включают большинство Microsoft Office форматов, таких как doc, xls, ppt. Office Open XML формат это новый стандарт базирующийся на XML разметке, и используется в файлах Microsoft office 2007 и старше.

  • Aspose for Java — набор платных Java APIs, которые помогают разработчикам в работе с популярными форматами бизнес файлов, такими как документы Microsoft Word, таблицы Microsoft Excel, презентации Microsoft PowerPoint, PDF файлы Adobe Acrobat, emails, изображения, штрих-коды и оптические распознавания символов.

Каждое API проектируется для того, чтобы выполнять широкий спектр создания документов, различные манипуляции и преобразования быстро и легко, экономя время и позволяя разработчикам успешно программировать. Ни один API с открытым исходным кодом не имеет одной и той же комплексной поддержки функций.

Все Aspose’s APIs используют простую объектную модель документа, а одно API предназначено для работы с набором связанных форматов. Aspose’s Microsoft Office APIs, Aspose.Cells, Aspose.Words, Aspose.Slides, Aspose.Email, и Aspose.Tasks легки в работе, эффективны, надежны и независимы от других библиотек.

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

В данной программе будем использовать Apache POI

Компоненты Apache POI


Описание компонетов

HSSF — Horrible Spreadsheet Format — Компонент чтения и записи файлов MS-Excel, формат XLS
XSSF — XML Spreadsheet Format Компонент — чтения и записи файлов MS-Excel, формат XLSX
HPSF — Horrible Property Set Format — Компонент получения наборов свойств файлов MS-Office
HWPF — Horrible Word Processor Format — Компонент чтения и записи файлов MS-Word, формат DOC
XWPF — XML Word Processor Format — Компонент чтения и записи файлов MS-Word, формат DOCX
HSLF — Horrible Slide Layout Format — Компонент чтения и записи файлов PowerPoint, формат PPT
XSLF — XML Slide Layout Format — Компонент чтения и записи файлов PowerPoint, формат PPTX
HDGF — Horrible DiaGram Format — Компонент работы с файлами MS-Visio, формат VSD
XDGF — XML DiaGram Format — Компонент работы с файлами MS-Visio, формат VSDX

Список компонентов
Наименование(артефакт) Необходимые компоненты
poi commons-logging, commons-codec, commons-collections, log4j
poi-scratchpad poi
poi-ooxml poi, poi-ooxml-schemas
poi-ooxml-schemas xmlbeans
poi-examples poi, poi-scratchpad, poi-ooxml
ooxml-schemas xmlbeans
ooxml-security xmlbeans

В данной работе рассматриваются следующие классы, используемые для работы с файлами Excel из приложений Java.

  • рабочая книга — HSSFWorkbook, XSSFWorkbook
  • лист книги — HSSFSheet, XSSFSheet
  • строка — HSSFRow, XSSFRow
  • ячейка — HSSFCell, XSSFCell
  • стиль — стили ячеек HSSFCellStyle, XSSFCellStyle
  • шрифт — шрифт ячеек HSSFFont, XSSFFont

Поскольку описание всех классов и методов не разместить на одной странице, то ниже по тексту приводятся ссылки для перехода к исходной документации.

Классы и методы Apache POI для работы с файлами Excel


Рабочая книга HSSFWorkbook, XSSFWorkbook
  • HSSFWorkbook org.apache.poi.hssf.usermodel класс чтения и записи файлов Microsoft Excel в формате .xls, совместим с версиями MS-Office 97-2003;
  • XSSFWorkbook org.apache.poi.xssf.usermodel класс чтения и записи файлов Microsoft Excel в формате .xlsx, совместим с MS-Office 2007 или более поздней версии.

Конструкторы класса HSSFWorkbook

    HSSFWorkbook ();
    HSSFWorkbook (InternalWorkbook book);
    HSSFWorkbook (POIFSFileSystem  fs);
    HSSFWorkbook (NPOIFSFileSystem fs);
    HSSFWorkbook (POIFSFileSystem  fs, boolean preserveNodes);
    HSSFWorkbook (DirectoryNode directory,
        POIFSFileSystem fs,
        boolean preserveNodes);
    HSSFWorkbook (DirectoryNode directory, boolean preserveNodes);
    HSSFWorkbook (InputStream s);
    HSSFWorkbook (InputStream s, boolean preserveNodes);

preservenodes является необязательным параметром, который определяет необходимость сохранения узлов типа макросы.

Конструкторы класса XSSFWorkbook

    XSSFWorkbook ();
    // workbookType  создать .xlsx или .xlsm
    XSSFWorkbook (XSSFWorkbookType workbookType);
    XSSFWorkbook (OPCPackage pkg );
    XSSFWorkbook (InputStream is);
    XSSFWorkbook (File file);
    XSSFWorkbook (String path);

Основные методы HSSFWorkbook, XSSFWorkbook

Метод Описание
createSheet () Создание страницы книги HSSFSheet, XSSFSheet
createSheet (String name) Создание страницы с определенным наименованием
CreateFont () Создание шрифта
createCellStyle () Создание стиля

С полным перечнем всех методов класса XSSFWorkbook можно познакомиться на странице http://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFWorkbook.html.

Классы листов книги, HSSFSheet, XSSFSheet
  • org.apache.poi.hssf.usermodel.HSSFSheet
  • org.apache.poi.xssf.usermodel.XSSFSheet
    Классы HSSFSheet, XSSFSheet включают свойства и методы создания строк, определения размера колонок, слияния ячеек в одну область и т.д.

Основные методы классов работы с листами

Метод Описание
addMergedRegion (CellRangeAddress) Определение области слияния ячеек страницы
autoSizeColumn (int column) Автоматическая настройка ширины колонки column (отсчет от 0)
setColumnWidth (int column, int width) Настройка ширины колонки column (отсчет от 0)
createRow (int row) Создание строки row (отсчет от 0)
getRow (int row) Получение ссылки на строку row (отсчет от 0)

С полным перечнем всех методов класса XSSFSheet можно познакомиться на страницеhttps://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFSheet.html

Классы строк HSSFRow, XSSFRow
  • org.apache.poi.hssf.usermodel.HSSFRow
  • org.apache.poi.xssf.usermodel.XSSFRow
    Классы HSSFRow, XSSFRow включают свойства и методы работы со строками, создания ячеек в строке и т.д.

Основные методы классов HSSFRow, XSSFRow

Методы Описание
setHeight (short) Определение высоты строки
getHeight() Получение значения высоты в twips’ах (1/20)
getHeightInPoints() Получение значение высоты
createCell (int) Создание ячейки в строке (отсчет от 0)
getCell(int) Получение ссылки на ячейку
getFirstCellNum() Получение номера первой ячейки в строке
setRowStyle(CellStyle) Определение стиля всей строки

С полным перечнем всех методов класса XSSFRow можно познакомиться на страницеhttp://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFRow.html

Классы ячеек HSSFCell, XSSFCell

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

Классы HSSFCell, XSSFCell включают свойства и методы работы с ячейками таблицы.
Основные методы классов HSSFCell, XSSFCell

Метод Описание
getBooleanCellValue() Чтение логического значения ячейки
getDateCellValue() Чтение значения ячейки типа java.util.Date
getNumericCellValue() Чтение числового значения ячейки типа double
getStringCellValue() Чтение текстового значения ячейки (java.lang.String)
setCellValue(boolean) Определение логического значения ячейки
setCellValue(java.util.Calendar) Определение значения ячейки типа даты
setCellValue(java.util.Date) Определение значения ячейки типа даты
getCellTypeEnum() Чтение типа значения ячейки CellType
setCellComment(Comment) Запись комментария в ячейку
getCellComment() Чтение комментария ячейки
removeCellComment() Удаление комментария ячейки
setHyperlink(Hyperlink) Запись гиперссылки в ячейку
getHyperlink() Чтение гиперссылки XSSFHyperlink в ячейке
removeHyperlink() Удаления гиперссылки ячейки
getCellFormula() Чтение формулы, например SUM(C4:E4)
setCellFormula(String) Определение формулы, например =SUM(C4:E4)
getCellStyle() Чтение стиля ячейки (XSSFCellStyle)
setCellStyle(CellStyle) Определение стиля ячейки
getColumnIndex() Определение индекса ячейки
setAsActiveCell() Определение активности ячейки
  • org.apache.poi.hssf.usermodel.HSSFCell
  • org.apache.poi.xssf.usermodel.XSSFCell
    С полным перечнем всех методов класса XSSFCell можно познакомиться на страницеhttp://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFCell.html
Классы стилей ячеек HSSFCellStyle, XSSFCellStyle

С полным перечнем всех свойств и методов класса XSSFCellStyle можно познакомиться на страницеhttp://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/CellStyle.html

Ниже в качестве примера представлен метод, формирующий стиль ячейки, в которой :

  • текст центрируется по вертикали и горизонтали;
  • обрамление ячейки представляет тонкую черную линию по периметру;
  • текст переносится на следующую строку (не ячейку), если не вмещается в размер ячейки.
private XSSFCellStyle createCellStyle(XSSFWorkbook book) {
    BorderStyle thin  = BorderStyle.THIN;
    short       black = IndexedColors.BLACK.getIndex();

    XSSFCellStyle style = book.createCellStyle();

    style.setWrapText(true);
    style.setAlignment        (HorizontalAlignment.CENTER);
    style.setVerticalAlignment(VerticalAlignment  .CENTER);

    style.setBorderTop        (thin);
    style.setBorderBottom     (thin);
    style.setBorderRight      (thin);
    style.setBorderLeft       (thin);

    style.setTopBorderColor   (black);
    style.setRightBorderColor (black);
    style.setBottomBorderColor(black);
    style.setLeftBorderColor  (black);

    return style;
}

Метод setWrapText позволяет определить флаг переноса текста в ячейке согласно ее размеру (ширине). Чтобы перенести текст принудительно, можно в текстовой строке установить символы CRCL, например «Разделительrnтекста».

Классы шрифтов HSSFFont, XSSFFont

С полным перечнем всех свойств и методов класса XSSFFont можно познакомиться на страницеhttp://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Font.html

Ниже в качестве примера представлен метод, формирующий шрифт типа «Times New Roman» :

private XSSFFont createCellFont(XSSFWorkbook book)  {  	
	XSSFFont font = workBook.createFont(); 
	font.setFontHeightInPoints((short)  12); 
	font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); 
	font.setFontName("Times New Roman");  
	return(font);  
}  
.  .  .  
HSSFCellStyle style = book.createCellStyle(); style.setFont(createCellFont(book));

Ссылки на полезные ресурсы


  • https://habr.com/post/56817/
  • https://poi.apache.org/apidocs/index.html — официальная документация
  • http://java-online.ru/java-excel.xhtml

Задание:


В данной работе вы должны реализовать следующее:

  1. Чтение с ячейки MS Excel в Java

  2. Запись с Java в MS Excel

Инструкция


  • Для обращения к MS Excel версии до 2003 включительно года с Java используется класс HSSFWorkbook
  • Для обращения к MS Excel версии 2007 и позднее с Java используется класс XSSFWorkbook
  • При операциях Обновление или Запись необходимо, чтобы MS Excel был закрыт.
Чтение ячейки с MS Excel

Чтобы считать данные с xlsx необходимо исполнить следующие шаги:

    //filePath - это путь до MS Excel
    Workbook book = new XSSFWorkbook(new FileInputStream(filePath);
    //считывается лист по индексу sheet_index. sheet_index начинается с 0
    Sheet sheet = book.getSheetAt(sheet_index);
    //считывается row по индексу row_index. row_index начинается с 0
    Row row = sheet.getRow(row_index);
    //считывается cell по индексу cell_index. cell_index начинается с 0
    Cell cell = sheet.getCell(cell_index);
Запись в ячейку MS Excel
    Workbook book = new XSSFWorkbook();
    //name - имя листа
    Sheet sheet = book.createSheet(name);
    Row row = sheet.createRow(i);
    Cell cell = row.createCell(j);
    FileInputStream fileOut = new FileInputStream(filePath);
    book.write(fileOut);
    fileOut.close();
Обновление ячейки в существующем листе MS Excel
    Workbook workbook = new XSSFWorkbook(new FileInputStream(filePath));
    Sheet sheet = workbook.getSheetAt(i);
    Row row = sheet.getRow(j);
    Cell cell = row.getCell(k);
    cell.setCellValue(value);

Подготовка: загрузка библиотек и зависимостей


Чтобы использовать apache POI, вам нужно скачать jar файлы и добавить их через Intellij IDEA вручную, или вы можете предоставить это Maven.

Во втором случае вам нужно просто добавить следующие две зависимости в pom.xml:

	<dependencies>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.12</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.12</version>
    </dependency>
  </dependencies>

Самое удобное в 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

Выполнение:

  1. Создать проект на java с помощью maven.

  2. Следовать инструкции «Подготовка:…» описанная выше.

  3. Создать Excel файл в корневой папке проекта.

  4. Записать в A1 и A2 любые целые числа.

  5. Сохранить Excel файл.

  6. Закрыть Excel файл. (ОБЯЗЕТЬНОЕ УСЛОВИЕ, т.к. apache POI API может работать только с закрытым фалом)

  7. В папке src/main/java создать класс IOCell

    1. Создать поле
    1. Создать конструктор
    IOCell(String filePath) { this.filePath = new File(filePath)}
    1. Создать метод для чтения c Excel в Java
    public Cell getCell(int sheet, int row, int column) {
        Workbook workbook = null;
        try (FileInputStream file = new FileInputStream(filePath)) {
            workbook = new XSSFWorkbook(file);
        } catch (FileNotFoundException e) {
            System.out.println("file is not exists");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return workbook.getSheetAt(sheet).getRow(row).getCell(column);
    }
    1. Создать метод для записи с Java в Excel
        public void setCell(int row, int column, double val) {
        Workbook workbook = null;
         try (FileInputStream file = new FileInputStream(filePath)) {
             workbook = new XSSFWorkbook(file);
             Sheet sheet = workbook.getSheetAt(0);
             sheet.getRow(row).getCell(column).setCellValue(val);
         } catch (IOException e) {
             e.printStackTrace();
         }
        try (OutputStream fileOut = new FileOutputStream(filePath)) {
            workbook.write(fileOut);
        } catch (FileNotFoundException e) {
            System.out.println("file is not exist AAAA");
        } catch (IOException e) {
            e.printStackTrace();
        }
    
    }
  8. В папке src/main/java создать класс Main

    1. Создать поле
        private static final String filePath = "NAME_OF_EXCEL_FILE";
    1. Создать метод
    public static void main(String[] args) {
        IOCell ioCell = new IOCell(filePath);
    
        Cell x = ioCell.getCell(0, 1, 0);
        Cell y = ioCell.getCell(0,  1, 1);
        System.out.println("first number: " + x.toString());
        System.out.println("second number: " + y.toString());
        //Write x * y
        ioCell.setCell(4, 0, x.getNumericCellValue() * y.getNumericCellValue());
        //Write x + y
        ioCell.setCell(4, 1, x.getNumericCellValue() + y.getNumericCellValue());
        System.out.println("Interactions is complete successfully");
    }
  9. Запускаем приложение и смотрим в консоль.

The Apache POI is a popular open source library used to read, write, and manipulate MS Office and Open Office files by using Java code. The library is one of the many open source products maintained by Apache Software Foundation (ASF) contributed to the Java community. The library contains classes and methods to decode file formats based on Open Office XML standards and Microsoft OLE2. Although the library is capable of manipulating Word, Excel spreadsheet and PowerPoint files, this article mainly focuses on spreadsheet documents, only to make it brief.

Learn JAVA and Start your Free Trial today!

The Apache POI Library

Intriguingly, in the name Apache POI, the POI stands for “Poor Obfuscation Implementation” and the goal of the library is to provide Java APIs for manipulating various file formats based upon the Office Open XML standards (OOXML) and Microsoft’s OLE 2 Compound Document format (OLE2). In short, this enables one to read and write MS Excel, MS Word, and MS PowerPoint files by using Java code. Most Microsoft Office files—such as XLS, DOC, PPT, and MFC serialization API-based file formats—are based on OLE2 standard. The OLE, basically, is a proprietary technique developed by Microsoft, and provides the format for linking objects and embedding objects within container documents. The first format is called OLE1.0 format where the linked object and the embedded object data is laid out as a sequence of bytes within the container document. The second version, the OLE2.0 format, leverages OLE Compound File Technology (MS-CFB) where the linked object or embedded object data is contained in this storage in the form of OLE Compound File Stream objects. Refer to OLE1.0 and OLE2.0 Formats for more details on this. The Apache POI library provides library APIs for the OLE2 file system called POIFS and OLE2 Document Properties called HPSF.

Apache POI Components

The Apache POI library provides classes and methods to work with OLE2 Compound Documents of MS Office. Here is a brief overview of the most commonly used ones:

  • POIFS for OLE2 Documents: The POIFS stands for Poor Obfuscation Implementation File System. This is the basic POI element implemented in the library to port OLE2 Compound Document. It supports read and write functionality for the non-XML binary Microsoft Office format. All APIs of the POI library are built upon this.
  • HSSF and XSSF: The HSSF stands for Horrible Spread Sheet Format. It is a Java implementation port for the Excel 97 file format or for .xls files. XSSF stands for XML Spread Sheet Format and it is a port for the OOXML file format or .xlsx file format.
  • HWPF and XWPF: The HWPF stands for Horrible Word Processor Format. It is a limited read-only port for the older Word 6 or Word 95 file format. The XWPF stands for XML Word Processor Format. It is a Java implementation port for the Word 2007 .docx file format. Both implementations support limited functionality.
  • HSLF and XSLF: The HSLF stands for Horrible Slide Layout Format. The XSLF stands for XML Slide Layout Format. Both of these provide read, write, create, and modify capability of PowerPoint presentations whereas HSLF supports the PowerPoint 97 format and XSLF supports later versions.
  • HPSF: The HPSF stands for Horrible Property Set Format. It is particularly used to work with document properties such as setting the title, category, author, date of modification and so forth of a document
  • HDGF and XDGF: The HDGF stands for Horrible Diagram Format. This component contains classes to work with the Visio binary file format. It provides low-level, read-only APIs to access Visio Documents and VSD files. The XDGF stands for XML Diagram Format. It is for the Visio XML file format or VSDX files.
  • HPBF: The HPBF stands for Horrible Publisher Format. It is a limited Java port to work with the MS Publisher file format.

The acronyms sound humorous because these file systems were supposed to be closed and Microsoft did their best to obfuscate the code so that they are not only difficult to understand but also hard to reverse engineer. But, the developers at Apache hacked it with ease and reverse engineered it successfully. Perhaps, as a mark of rejoice or utter condemnation of closed system, they jocularly named them as such.

Working with HSSF and XSSF Files

The HSSF and XSSF components of the Apache library provides three models of accessing a spreadsheet document as per the HSSF and XSSF Documentation. They are:

  • Low-level structures for special needs
  • The eventmodel APIs for read-only access to Excel documents
  • The usermodel APIs for creating, reading, and modifying Excel files

The limited eventmodel APIs may be used for only reading spreadsheet data. These APIs are located in the org.apache.poi.hssf.eventusermodel package and org.apache.poi.xssf.eventusermodel package, where the first one is used to read data from the .xls file format and the second is used to read data from the .xlsx file format.

The usermodel is much more flexible and easier to use; it can read, write, create, and modify an Excel spreadsheet document. But, it has a much higher memory footprint than the low-level eventmodel.

Also, accessing and manipulating the newer OOXML-based file format with XSSF has a much higher memory footprint than the old HSSF supported binary files.

From POI 3.5 onwards, the HSSF and XSSF model has been clubbed into the SS model, rather tweaked to work for both the models. It is more of tweak of name than a real change. In a way, we can say that SS=HSSF+XSSF.

Migrating Database Table Data to an Excel Spreadsheet

Here, we’ll create a simple utility program to migrate some database data into an Excel sheet. This also can be tweaked to work with other ways, such as migrating Excel data to a database table. This is left as an exercise for the reader. The program is simple and self-explanatory. Visit the Apache POI Documentation for detailed information on any classes or methods. To try the following example, what we have used is as follows:

  • JDK 8
  • MS Excel 2007
  • Intellij IDEA IDE
  • Apache POI 3.17
  • Apache Derby 10.14

Visit the appropriate documents and help files for setting up the project. Here are the contents for the Maven pom.xml file we have used.

<project 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.mano.examples</groupId>
   <artifactId>apache-poi-demo</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>apache-poi-demo</name>
   <url>http://maven.apache.org</url>

   <properties>
      <project.build.sourceEncoding>
         UTF-8
      </project.build.sourceEncoding>
   </properties>

   <build>
      <plugins>
         <plugin>
            <artifactId>
               maven-compiler-plugin
            </artifactId>
            <version>3.7.0</version>
            <configuration>
               <source>1.8</source>
               <target>1.8</target>
            </configuration>
         </plugin>
      </plugins>
   </build>

   <dependencies>
      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>3.8.1</version>
         <scope>test</scope>
      </dependency>

      <!-- https://mvnrepository.com/artifact
         /org.apache.maven.plugins/maven-compiler-plugin -->
      <dependency>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>3.7.0</version>
      </dependency>

      <!-- https://mvnrepository.com/artifact/
         org.apache.poi/poi -->
      <dependency>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi</artifactId>
         <version>3.17</version>
      </dependency>

      <!-- https://mvnrepository.com/artifact/
         org.apache.poi/poi-ooxml -->
      <dependency>
         <groupId>org.apache.poi</groupId>
         <artifactId>poi-ooxml</artifactId>
         <version>3.17</version>
      </dependency>

      <!-- https://mvnrepository.com/artifact/
         org.apache.derby/derby -->
      <dependency>
         <groupId>org.apache.derby</groupId>
         <artifactId>derby</artifactId>
         <version>10.14.1.0</version>
         <scope>test</scope>
      </dependency>

      <!-- https://mvnrepository.com/artifact/
         org.apache.derby/derbyclient -->
      <dependency>
         <groupId>org.apache.derby</groupId>
         <artifactId>derbyclient</artifactId>
         <version>10.14.1.0</version>
      </dependency>

   </dependencies>
</project>

Listing 1: pom.xml

A database table is created with some dummy records prior to running the utility program. Here is the code of that file.

package com.mano.examples;

import java.sql.*;


public class DummyDatabase {

   public static void createDummyDatabase()
         throws SQLException {
      Connection con=DriverManager.getConnection
         ("jdbc:derby:D:/temp/dummy;create=true");
      Statement stmt=con.createStatement();
      stmt.executeUpdate("drop table semester2");
      stmt.executeUpdate("CREATE TABLE semester2(STUDENT_ID int,
         CARCH INT, DCE INT, WEBTECH INT, JAVA INT, SAD_MIS INT,
         PRIMARY KEY(STUDENT_ID))");

      // Insert 2 rows
      stmt.executeUpdate("insert into semester2
         values (23567932,56,78,97,58,85)");
      stmt.executeUpdate("insert into semester2
         values (47250001,96,34,75,68,12)");
      stmt.executeUpdate("insert into semester2
         values (99568955,45,68,69,78,29)");
      stmt.executeUpdate("insert into semester2
         values (89376473,75,23,56,89,47)");
      stmt.executeUpdate("insert into semester2
         values (29917740,85,78,55,15,48)");
      stmt.executeUpdate("insert into semester2
         values (85776649,23,56,78,25,69)");
      stmt.executeUpdate("insert into semester2
         values (38846455,68,95,78,53,48)");
      stmt.executeUpdate("insert into semester2
         values (40028826,63,56,48,59,75)");
      stmt.executeUpdate("insert into semester2
         values (83947759,85,54,69,36,89)");
      stmt.executeUpdate("insert into semester2
         values (92884775,78,59,25,48,69)");
      stmt.executeUpdate("insert into semester2
         values (24947389,12,10,14,54,68)");
      stmt.executeUpdate("insert into semester2
         values (77399465,44,33,26,88,77)");

      // Query
      ResultSet rs = stmt.executeQuery
      ("SELECT * FROM semester2");

      // Print out query result
      while (rs.next()) {
         System.out.printf
               ("%dt%dt%dt%dt%dt%dn",
            rs.getLong("STUDENT_ID"),
            rs.getInt("CARCH"),
            rs.getInt("DCE"),
            rs.getInt("WEBTECH"),
            rs.getInt("JAVA"),
            rs.getInt("SAD_MIS"));
      }
      stmt.close();
      con.close();
   }
}

Listing 2: DummyDatabase.java.

This is the utility program we are talking about. The code was written in big hurry and the structure not very elegant. However, it works. Restructure or tweak it as you deem fit.

package com.mano.examples;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.*;

public class SSFile {

   private static String[] header={"STUDENT_ID",
      "CARCH", "DCE", "WEBTECH", "JAVA",
      "SAD_MIS", "TOTAL", "AVERAGE"};

   public static void databaseToExcel(File file)
         throws IOException, SQLException {
      Workbook workbook = null;
      if (file.getName().endsWith(".xls"))
         workbook = new HSSFWorkbook();
      else if (file.getName().endsWith(".xlsx"))
         workbook = new XSSFWorkbook();
      else {
         System.out.println("Invalid filename!");
         return;
      }
      Sheet sheet = workbook.createSheet();
      Connection con = DriverManager.getConnection
         ("jdbc:derby:D:/temp/dummy;create=true");
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery("SELECT * FROM semester2");



      Row rr = sheet.createRow(0);
      for(int i=0;i<header.length;i++){
         createHeaderCell(rr, (short) i, header[i]);
      }

      int i = 1;
      while (rs.next()) {
         rr = sheet.createRow(i++);
         for(int j=0;j<header.length-2;j++){
            createDataCell(rr, (short) j,
               rs.getLong(header[j]));
         }
      }
      rr = sheet.getRow(1);
      Cell total = rr.createCell(6);
      total.setCellType(CellType.FORMULA);
      total.setCellFormula("SUM(B2:F2)");
      Cell avg = rr.createCell(7);
      avg.setCellType(CellType.FORMULA);
      avg.setCellFormula("AVERAGE(B2:F2)");

      FileOutputStream outFile = new
         FileOutputStream(file);
      workbook.write(outFile);
      outFile.flush();
      outFile.close();
      stmt.close();
      con.close();
   }

   private static void createHeaderCell(Row row,
         short col, String cellValue) {
      Cell c = row.createCell(col);
      c.setCellValue(cellValue);
   }

   private static void createDataCell(Row row,
         short col, Number cellValue) {
      Cell c = row.createCell(col);
      c.setCellType(CellType.NUMERIC);
      c.setCellValue(cellValue.doubleValue());
   }
}

Listing 3: SSFile.java

This is the control panel from which the utility program is invoked.

package com.mano.examples;

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;

public class App
{
   public static void main( String[] args )
         throws IOException,SQLException{
      // DummyDatabase.createDummyDatabase();
      SSFile.databaseToExcel(new
         File("d://temp//test1.xls"));
   }
}

Listing 4: App.java

Before Running…

Make sure that the test1.xls or test1.xlsx files do not exist in the d://temp directory prior to running the program because the program neither overwrites nor checks the file with the same name in the directory where the file is supposed to be created. Make sure of this every time the program is run; otherwise, the code gives a nasty error message. However, you may tweak the code to put some checking.

Conclusion

There is another alternative to working with spreadsheets, as the Apache POI Documentation suggests via the Cocoon serializer, although it still uses HSSF indirectly. Cocoon can serialize any XML data source by applying the style sheet and designating the serializer. The HSSF and XSSF model is quite powerful and provides a number of classes and methods to deal with different aspects of an Excel document. This article tried to give a glimpse of what we can do with Apache POI. We often need to write a utility program to bridge between an open and closed system. Apache POI can definitely serve our purpose as one of its kind.

References

  • Apache POI – the Java API for Microsoft Documents
  • POI-HSSF and POI-XSSF – Java API to Access Microsoft Excel Format Files

Like this post? Please share to your friends:
  • Apache poi excel to pdf
  • Apache poi excel read
  • Apache poi excel maven
  • Apache poi excel kotlin
  • Apache poi excel format