Время на прочтение
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"); }
-
Запускаем приложение и смотрим в консоль.