Время на прочтение
3 мин
Количество просмотров 44K
Работа с таблицей Excel из Java
Собственно возникла проблема — обработать данные из таблицы и на их основе получить другую таблицу.
Вариантов решения этой проблемы несколько:
- Макрос — единственной проблемой является VBA, на изучение которого времени нет совершенно, да и не нравится его синтаксис
- Приложение на C# тут вроде все хорошо, но к машине на которой будет выполняться данное приложение сразу предъявляется много дополнительных требований:
- .NET Framework
- Установленный офис
- установленная основная сборка взаимодействия (PIA) для приложения Office
- связка Java и библиотека Apache POI—на этом способе я и хочу остановиться подробнее
Apache POI — это Java API для доступа к документам формата Microsoft.
Собственно для работы с таблицами Excel предназначен проект POI-HSSF. На данный момент есть 2 варианта библиотеки:
- POI 3.5 beta 5, and Office Open XML Support (2009-02-19)—идет работа над поддержкой формата Office 2007
- 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.
Объект класса HSSFSheet можно получить следующими способами:
- По имени
HSSFSheet sheet= wb.getSheet("Лист 3") - По номеру (нумерация начинается с 0)
HSSFSheet sheet= wb.getSheet(0) - Создание нового листа
HSSFSheet sheet= wb.createSheet(["имя листа"])
Следующим объектом является строка — HSSFRow.
Получить доступ к объекту строки можно также 3 способами:
- По индексу (индексация начинается с 0)
HSSFRow row = sheet.getRow(index) - Через итератор
Iterator rowIter = sheet.rowIterator(); while (rowIter.hasNext()) { HSSFRow row = (HSSFRow) rowIter.next(); } - Создание новой строки
HSSFRow row=sheet.createRow(0);
Ну и последним объектом на пути доступа к данным является объект класса HSSFCell — ячейка строки.
Получить доступ к ячейке можно из объекта строки следующими способами:
- По индексу ячейки (индексация начинается с 0)
HSSFCell cell = row.getCell(0); - Через итератор
Iterator cellIter = row.cellIterator(); while (cellIter.hasNext()) { HSSFCell cell = (HSSFCell) cellIter.next(); } - Создание новой ячейки
HSSFCell cell = row.createCell(0);
Из объекта ячейки можно уже получать и устанавливать непосредственно данные:
- Логическое значение
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.
Афоризм
Вы с этим умным видом даже спите?
Наталья Резник
Поддержка проекта
Если Вам сайт понравился и помог, то будем признательны за Ваш «посильный» вклад в его поддержку и развитие
• Yandex.Деньги
410013796724260
• Webmoney
R335386147728
Z369087728698
Свойства и методы взаимодействия Java приложений с файлами Excel представлены на странице
библиотеки Apache POI. Здесь рассматриваются примеры использования
Apache POI для создания файлов Excel 2007 или более поздней версии. Если необходимо создать
Excel 1997-2003, то следует использовать классы, наименования которых начинаются с символа ‘H’.
Использование библиотеки Apache POI для чтения файлов Excel с примером рассмотрен
здесь.
Создание книги Excel
// Создание книги Excel
XSSFWorkbook book = new XSSFWorkbook();
FileOutputStream fileOut = new FileOutputStream("workbook.xlsx");
// создания страниц
// создание строк
// создание и форматирование ячеек
// запись информации в ячейки
// Закрытие
book.write(fileOut);
fileOut.close();
Создание страницы
XSSFSheet sheet2 = book.createSheet("Sheet 1");
XSSFSheet sheet3 = book.createSheet("Страница 2");
Наименование страницы не должно превышать 31 символ. Следующие символы недопустимы в
наименовании страницы :
0x0 — нулевое значение;
‘:’ — двоеточие;
» — обратный слэш;
‘/’ — прямой слэш;
‘*’ — «звездочка»;
‘?’ — вопросительный знак;
‘[‘ — открывающаяся квадратная скобка;
‘]’ — закрывающаяся квадратная скобка.
Можно использовать утилиту WorkbookUtil для получения наименования страницы книги. Метод
createSafeSheetName данной утилиты заменит «неправильные» символы на пробелы (‘ ‘).
import org.apache.poi.ss.util.WorkbookUtil; String caption = "[O'Brien's sales*?]"; String safeName = WorkbookUtil.createSafeSheetName(caption); // safeName = " O'Brien's sales "; XSSFSheet sheet3 = book.createSheet(safeName);
Определение размера колонки
При определении размера колонки необходимо учитывать максимальное количество символов в колонке,
коэффициент размера символа для заданного шрифта (для «Sans Sherif» равен 1.14388) и коэффициент
EXCEL_COLUMN_WIDTH_FACTOR, равный 256. Метод autoSizeColumn(idx_column) позволяет автоматически
установить размер колонки по максимальному значению.
// Определение размера колонки int width = (int) (6 * 1.14388) * 256; // 1757; sheet.setColumnWidth(0, width); // Автоматическая настройка размера колонки sheet.autoSizeColumn(1);
Метод setColumnWidth(column, width) в качестве параметров принимает номер колонки (отсчет от 0) и
размер колонки. Методу autoSizeColumn(column) необходимо передать только номер колонки.
Создание строки
При создании строки в метод createRow в качестве параметра необходимо передать номер строки
(отсчет от 0). Для определения размера строки можно использовать методы setHeight (short) и
setHeightInPoints (float). При использовании метода setHeight также, как и с определением размера колонки,
необходимо учитывать коэффициенты. Поэтому метод setHeightInPoints оказывается более предпочтительным.
XSSFRow row = sheet.createRow((short)0); row.setHeightInPoints(80.0f);
Создание ячейки, определение типа значения
В следующем примере создаются ячейки, устанавливается их тип и записываются значения.
XSSFCell cell = row.createCell(0);
cell.setCellType(CellType.NUMERIC);
cell.setCellValue(1.2);
cell = row.createCell(1);
cell.setCellType(CellType.STRING);
cell.setCellValue("Строковое представление");
cell = row.createCell(2);
cell.setCellType(CellType.FORMULA);
cell.setCellValue("SUM(B3:B5)");
Класс CellType включает свойства [_NONE, BLANK, BOOLEAN, ERROR, FORMULA, NUMERIC, STRING],
которые можно использовать для определения типа значения ячейки.
Определение формата даты ячейки
В следующем примере создаются две ячейки с записью текущей даты. Вторая ячейка форматируется.
CreationHelper createHelper = book.getCreationHelper();
XSSFCellStyle cellStyle = book.createCellStyle();
cellStyle.setDataFormat(createHelper
.createDataFormat()
.getFormat("m/d/yy h:mm"));
XSSFCell cell = row.createCell(0);
cell.setCellValue(new Date());
cell = row.createCell(1);
cell.setCellStyle(cellStyle);
cell.setCellValue(new Date());
Слияние ячеек
Для слияния ячеек используется метод addMergedRegion.
// Создание строки
XSSFRow row = sheet.createRow((short) 1);
// Создание ячейки
XSSFCell cell = row.createCell((short) 1);
cell.setCellValue("This is a test of merging");
// Слияние 2-х ячеек в одной строке
sheet.addMergedRegion(
new CellRangeAddress(1, // первая строка
1, // последняя строка
1, // первая колонка
2) // последняя колонка
);
Определение шрифта
// Создание шрифта
XSSFFont font = book.createFont();
font.setFontHeightInPoints((short)24);
font.setFontName("Courier New");
font.setItalic(true);
font.setStrikeout(true);
// цвет шрифта
font.setColor(new XSSFColor(new java.awt.Color(16,64,255)));
// Создание стиля с определением в нем шрифта
XSSFCellStyle style = book.createCellStyle();
style.setFont(font);
// Создание ячейки с определением ее стиля
XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(1);
cell.setCellValue("Тестовый шрифт");
cell.setCellStyle(style);
Помните, что максимальное количество создаваемых шрифтов ограничено значением 32767. Необходимо
использовать объекты шрифтов/стилей.
// Неправильно
for (int i = 0; i < 100; i++) {
XSSFRow row = sheet.createRow(i);
for (int j = 0; j < 100; j++) {
XSSFCell cell = row.createCell((short) j);
XSSFCellStyle style = workbook.createCellStyle();
XSSFFont font = workbook.createFont();
font.setBold(true);
style.setFont(font);
cell.setCellStyle(style);
}
}
// Правильно
XSSFFont font = workbook.createFont();
font.setBold(true);
XSSFCellStyle style = workbook.createCellStyle();
style.setFont(font);
for (int i = 0; i < 100; i++) {
XSSFRow row = sheet.createRow(i);
for (int j = 0; j < 100; j++) {
XSSFCell cell = row.createCell((short) 0);
cell.setCellStyle(style);
}
}
Определение цвета фона ячейки
Color COLOR_light_gray = new java.awt.Color(232, 232, 232); XSSFCellStyle style = book.createCellStyle(); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillForegroundColor(new XSSFColor(COLOR_light_gray));
ПРИМЕЧАНИЕ : для выделения цвета значения настраивайте шрифт (см. выше).
Выравнивание значения
В следующем примере создаются ячейки с различным выравниванием значений по горизонтали и
вертикали.
createCell(wb, row, (short) 0, CellStyle.ALIGN_CENTER,
CellStyle.VERTICAL_BOTTOM);
createCell(wb, row, (short) 1, CellStyle.ALIGN_CENTER_SELECTION,
CellStyle.VERTICAL_BOTTOM);
createCell(wb, row, (short) 2, CellStyle.ALIGN_FILL,
CellStyle.VERTICAL_CENTER);
createCell(wb, row, (short) 3, CellStyle.ALIGN_GENERAL,
CellStyle.VERTICAL_CENTER);
createCell(wb, row, (short) 4, CellStyle.ALIGN_JUSTIFY,
CellStyle.VERTICAL_JUSTIFY);
createCell(wb, row, (short) 5, CellStyle.ALIGN_LEFT,
CellStyle.VERTICAL_TOP);
createCell(wb, row, (short) 6, CellStyle.ALIGN_RIGHT,
CellStyle.VERTICAL_TOP);
/**
* Creates a cell and aligns it a certain way.
*
* @param book книга Excel
* @param row строка
* @param column колонка
* @param halign горизонтальное выравнивание
* @param valign вертикальное выравнивание
*/
private void createCell(Workbook book,
Row row, short column,
short halign, short valign)
{
XSSFCell cell = row.createCell(column);
cell.setCellValue("Значение");
// Определение стиля
XSSFCellStyle cellStyle = book.createCellStyle();
// Настройка выравнивания стиля
cellStyle.setAlignment(halign);
cellStyle.setVerticalAlignment(valign);
// Стиль ячейки
cell.setCellStyle(cellStyle);
}
Границы ячейки, Border
// Создание строки
XSSFRow row = sheet.createRow(1);
// Создание ячейки
XSSFCell cell = row.createCell(1);
cell.setCellValue("Значение");
// Создание стиля
XSSFCellStyle style = book.createCellStyle();
// Определение граничных значений стиля
style.setBorderTop (CellStyle.BORDER_MEDIUM_DASHED);
style.setBorderRight (CellStyle.BORDER_THIN );
style.setBorderBottom(CellStyle.BORDER_THIN );
style.setBorderLeft (CellStyle.BORDER_THIN );
// Определение цвета граничных значений стиля
style.setTopBorderColor (IndexedColors.BLACK.getIndex());
style.setRightBorderColor (IndexedColors.BLUE.getIndex ());
style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
style.setLeftBorderColor (IndexedColors.GREEN.getIndex());
// Определение стиля ячейки
cell.setCellStyle(style);
Многострочные ячейки
Для фиксированного разделения/переноса текста в ячейке необходимо в стиле определить
свойство WrapText=true, и в тексте установить разделители ‘n’.
String text = "Фиксированное n разделение n текста"; XSSFCellStyle style = book.createCellStyle(); style.setWrapText(true); XSSFRow row = sheet.createRow(2); XSSFCell cell = row.createCell(2); cell.setCellValue(text); cell.setCellStyle(style);
Использование формулы
Создадим две ячейки. В первую ячейку cell1 запишем сумму значений колонки, а во второй ячейке
cell2 разместим формулу «СУММА()». Для вычисления значения первой ячейки дополнительно используются
методы getColsSummary и getCellValue.
int row = 5;
int summa = getColsSummary (1, 2, row);
XSSFCell cell1 = row.createCell(2);
if (summa > 0)
cell1.setCellValue(summa);
XSSFCell cell2 = row.createCell(2);
String formula = String.format("SUM(B3:B%d)", row);
cell2.setCellFormula(formula);
//-------------------------------------------------------
private int getCellValue (final int cl, final int rw)
{
XSSFRow row = sheet.getRow(rw);
XSSFCell cell = row.getCell(cl);
return (int)cell.getNumericCellValue();
}
//-------------------------------------------------------
private int getColsSummary (int col, int row1, int row2)
{
int summary = 0;
for (int i = row1; i < row2; i++)
summary += getCellValue (col, i);
return summary;
}
import com.gembox.spreadsheet.*;
import com.gembox.spreadsheet.tables.*;
class Program {
public static void main(String[] args) throws java.io.IOException {
// If using the Professional version, put your serial key below.
SpreadsheetInfo.setLicense("FREE-LIMITED-KEY");
ExcelFile workbook = new ExcelFile();
ExcelWorksheet worksheet = workbook.addWorksheet("Tables");
// Add some data.
Object[][] data = {
{ "Worker", "Hours", "Price" },
{ "John Doe", 25, 35.0 },
{ "Jane Doe", 27, 35.0 },
{ "Jack White", 18, 32.0 },
{ "George Black", 31, 35.0 }
};
for (int i = 0; i < 5; i++)
for (int j = 0; j < 3; j++)
worksheet.getCell(i, j).setValue(data[i][j]);
// Set column widths.
worksheet.getColumn(0).setWidth(100, LengthUnit.PIXEL);
worksheet.getColumn(1).setWidth(70, LengthUnit.PIXEL);
worksheet.getColumn(2).setWidth(70, LengthUnit.PIXEL);
worksheet.getColumn(3).setWidth(70, LengthUnit.PIXEL);
worksheet.getColumn(2).getStyle().setNumberFormat(""$"#,##0.00");
worksheet.getColumn(3).getStyle().setNumberFormat(""$"#,##0.00");
// Create table and enable totals row.
Table table = worksheet.addTable("Table1", "A1:C5", true);
table.setHasTotalsRow(true);
// Add new column.
TableColumn column = table.addColumn();
column.setName("Total");
// Populate column.
for (ExcelCell cell : column.getDataRange())
cell.setFormula("=Table1[Hours] * Table1[Price]");
// Set totals row function for newly added column and calculate it.
column.setTotalsRowFunction(TotalsRowFunction.SUM);
column.getRange().calculate();
// Set table style.
table.setBuiltInStyle(BuiltInTableStyleName.TABLE_STYLE_MEDIUM_2);
workbook.save("Tables.xlsx");
}
}
В этой главе объясняется, как создать электронную таблицу и управлять ею с помощью Java. Электронная таблица – это страница в файле Excel; он содержит строки и столбцы с конкретными именами.
После прочтения этой главы вы сможете создать электронную таблицу и выполнить операции чтения с ней.
Создать электронную таблицу
Прежде всего, давайте создадим электронную таблицу, используя ссылочные классы, которые обсуждались в предыдущих главах. Следуя предыдущей главе, сначала создайте рабочую книгу, а затем мы можем продолжить и создать лист.
Следующий фрагмент кода используется для создания электронной таблицы.
//Create Blank workbook XSSFWorkbook workbook = new XSSFWorkbook(); //Create a blank spreadsheet XSSFSheet spreadsheet = workbook.createSheet("Sheet Name");
Строки в таблице
Электронные таблицы имеют сетку. Строки и столбцы обозначены конкретными именами. Столбцы обозначены алфавитами, а строки – номерами.
Следующий фрагмент кода используется для создания строки.
XSSFRow row = spreadsheet.createRow((short)1);
Написать в электронную таблицу
Давайте рассмотрим пример данных о сотрудниках. Здесь данные о сотрудниках приведены в табличной форме.
| Emp Id | Имя Эмпайра | обозначение |
|---|---|---|
| TP01 | Гопал | Технический менеджер |
| TP02 | Маниша | Proof Reader |
| Tp03 | Masthan | Технический писатель |
| Tp04 | Сатиш | Технический писатель |
| Tp05 | Кришна | Технический писатель |
Следующий код используется для записи вышеуказанных данных в электронную таблицу.
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.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class Writesheet { public static void main(String[] args) throws Exception { //Create blank workbook XSSFWorkbook workbook = new XSSFWorkbook(); //Create a blank sheet XSSFSheet spreadsheet = workbook.createSheet(" Employee Info "); //Create row object XSSFRow row; //This data needs to be written (Object[]) Map < String, Object[] > empinfo = new TreeMap < String, Object[] >(); empinfo.put( "1", new Object[] { "EMP ID", "EMP NAME", "DESIGNATION" }); empinfo.put( "2", new Object[] { "tp01", "Gopal", "Technical Manager" }); empinfo.put( "3", new Object[] { "tp02", "Manisha", "Proof Reader" }); empinfo.put( "4", new Object[] { "tp03", "Masthan", "Technical Writer" }); empinfo.put( "5", new Object[] { "tp04", "Satish", "Technical Writer" }); empinfo.put( "6", new Object[] { "tp05", "Krishna", "Technical Writer" }); //Iterate over data and write to sheet Set < String > keyid = empinfo.keySet(); int rowid = 0; for (String key : keyid) { row = spreadsheet.createRow(rowid++); Object [] objectArr = empinfo.get(key); int cellid = 0; for (Object obj : objectArr) { Cell cell = row.createCell(cellid++); cell.setCellValue((String)obj); } } //Write the workbook in file system FileOutputStream out = new FileOutputStream(new File("Writesheet.xlsx")); workbook.write(out); out.close(); System.out.println("Writesheet.xlsx written successfully"); } }
Сохраните приведенный выше Java-код как Writesheet.java , а затем скомпилируйте и запустите его из командной строки следующим образом:
$javac Writesheet.java $java Writesheet
Он скомпилируется и выполнится для создания файла Excel с именем Writesheet.xlsx в вашем текущем каталоге, и вы получите следующий вывод в командной строке.
Writesheet.xlsx written successfully
Файл Writesheet.xlsx выглядит следующим образом.
Читать из таблицы
Давайте рассмотрим вышеупомянутый файл Excel с именем Writesheet.xslx в качестве входных данных. Соблюдайте следующий код; он используется для чтения данных из электронной таблицы.
import java.io.File; import java.io.FileInputStream; import java.util.Iterator; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class Readsheet { static XSSFRow row; public static void main(String[] args) throws Exception { FileInputStream fis = new FileInputStream(new File("WriteSheet.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() + " tt "); break; case Cell.CELL_TYPE_STRING: System.out.print( cell.getStringCellValue() + " tt "); break; } } System.out.println(); } fis.close(); } }
Давайте сохраним приведенный выше код в файле Readsheet.java , а затем скомпилируем и запустим его из командной строки следующим образом:
$javac Readsheet.java $java Readsheet
Если ваша системная среда сконфигурирована с библиотекой POI, она будет скомпилирована и выполнена для генерации следующего вывода в командной строке.
Интеграция электронных таблиц 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
Ссылки на полезные ресурсы
- https://habr.com/post/56817/
- https://poi.apache.org/apidocs/index.html — официальная документация
- http://java-online.ru/java-excel.xhtml
Задание:
В данной работе вы должны реализовать следующее:
-
Чтение с ячейки MS Excel в Java
-
Запись с 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);
Подготовка: загрузка библиотек и зависимостей
Конечно, существует достаточно много открытых библиотек, которые позволяют работать с Excel файлами в Java, например, JXL, но мы будем использовать имеющую самый обширный API и самую популярную — Apache POI. Чтобы её использовать, вам нужно скачать jar файлы и добавить их через Eclipse вручную, или вы можете предоставить это Maven.
Во втором случае вам нужно просто добавить следующие две зависимости:
<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
Выполнение:
-
Создать проект на java с помощью maven.
-
Следовать инструкции «Подготовка:…» описанная выше.
-
Создать Excel файл в корневой папке проекта.
-
Записать в A1 и A2 любые целые числа.
-
В папке src/main/java создать класс IOCell
- Создать поле
- Создать конструктор
IOCell(String filePath) { this.filePath = new File(filePath)}
- Создать метод для чтения 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); }
- Создать метод для записи с 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(); } } -
В папке src/main/java создать класс Main
- Создать поле
private static final String filePath = "NAME_OF_EXCEL_FILE";
- Создать метод
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"); }
-
Запускаем приложение и смотрим в консоль.

