XLS - Excel
Обработка пользовательских файлов Excel.
Введение
Netuno генерирует файлы EXCEL, совместимые с LibreOffice, OpenOffice, Microsoft Office, Google Drive и т. д., через ресурс XLS, который предоставляет low-code-абстракцию над Apache POI для различных языков программирования, поддерживаемых Netuno.
Можно генерировать файлы XLSX, XLS или ODS.
Приложение, поставляемое с Netuno и называемое demo (демонстрационное приложение), содержит множество примеров возможных реализаций кода на разных языках, включая демонстрацию экспорта электронных таблиц через сервис export-excel, который находится в:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
netuno/apps/demo/server/services/samples/javascript/export-excel.js
netuno/apps/demo/server/services/samples/typescript/export-excel.ts
netuno/apps/demo/server/services/samples/python/export-excel.py
netuno/apps/demo/server/services/samples/ruby/export-excel.rb
netuno/apps/demo/server/services/samples/kotlin/export-excel.kts
netuno/apps/demo/server/services/samples/groovy/export-excel.groovy
Инициализация
Для инициализации ресурса XLS:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const excel = _xls.create()
const excel = _xls.create()
excel = _xls.create()
excel = _xls.create()
val excel = _xls.create()
final excel = _xls.create()
Создаёт объект, содержащий контекст нового файла, который будет построен, с пустым листом.
Форматирование
Определение стилей визуального форматирования, то есть формата дат, времени, денежных значений и т. д., должно выполняться до определения значений ячеек, потому что при определении значений ячеек можно связать с ними стиль форматирования.
Как показано в примере из приложения demo, форматирования определяются в начале кода.
Для форматирования дат:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const стильДата = excel.cellStyleFormat("dd/mm/yy")
const стильДата = excel.cellStyleFormat("dd/mm/yy")
стильДата = excel.cellStyleFormat("dd/mm/yy")
стильДата = excel.cellStyleFormat("dd/mm/yy")
val стильДата = excel.cellStyleFormat("dd/mm/yy")
final стильДата = excel.cellStyleFormat("dd/mm/yy")
Для форматирования времени:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const стильВремя = excel.cellStyleFormat("hh:mm:ss")
const стильВремя = excel.cellStyleFormat("hh:mm:ss")
стильВремя = excel.cellStyleFormat("hh:mm:ss")
стильВремя = excel.cellStyleFormat("hh:mm:ss")
val стильВремя = excel.cellStyleFormat("hh:mm:ss")
final стильВремя = excel.cellStyleFormat("hh:mm:ss")
Для форматирования дат со временем:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const стильДатаВремя = excel.cellStyleFormat("dd/mm/yyyy hh:mm:ss")
const стильДатаВремя = excel.cellStyleFormat("dd/mm/yyyy hh:mm:ss")
стильДатаВремя = excel.cellStyleFormat("dd/mm/yyyy hh:mm:ss")
стильДатаВремя = excel.cellStyleFormat("dd/mm/yyyy hh:mm:ss")
val стильДатаВремя = excel.cellStyleFormat("dd/mm/yyyy hh:mm:ss")
final стильДатаВремя = excel.cellStyleFormat("dd/mm/yyyy hh:mm:ss")
Для форматирования денежных значений в евро:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const стильДеньгиЕвро = excel.cellStyleFormat("€#,##0.00;\-€#,##0.00")
const стильДеньгиЕвро = excel.cellStyleFormat("€#,##0.00;\-€#,##0.00")
стильДеньгиЕвро = excel.cellStyleFormat("€#,##0.00;\-€#,##0.00")
стильДеньгиЕвро = excel.cellStyleFormat("€#,##0.00;\-€#,##0.00")
val стильДеньгиЕвро = excel.cellStyleFormat("€#,##0.00;\-€#,##0.00")
final стильДеньгиЕвро = excel.cellStyleFormat("€#,##0.00;\-€#,##0.00")
Для форматирования денежных значений в реалах:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const стильДеньгиРеал = excel.cellStyleFormat("R$#,##0.00;\-R$#,##0.00")
const стильДеньгиРеал = excel.cellStyleFormat("R$#,##0.00;\-R$#,##0.00")
стильДеньгиРеал = excel.cellStyleFormat("R$#,##0.00;\-R$#,##0.00")
стильДеньгиРеал = excel.cellStyleFormat("R$#,##0.00;\-R$#,##0.00")
val стильДеньгиРеал = excel.cellStyleFormat("R$#,##0.00;\-R$#,##0.00")
final стильДеньгиРеал = excel.cellStyleFormat("R$#,##0.00;\-R$#,##0.00")
Для форматирования значений в процентах:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const стильПроцент = excel.cellStyleFormat("0.00%")
const стильПроцент = excel.cellStyleFormat("0.00%")
стильПроцент = excel.cellStyleFormat("0.00%")
стильПроцент = excel.cellStyleFormat("0.00%")
val стильПроцент = excel.cellStyleFormat("0.00%")
final стильПроцент = excel.cellStyleFormat("0.00%")
Внешний вид
Определение стилей визуального оформления, то есть внешнего вида ячеек, такого как цвета, шрифт, границы, выравнивание и другие, должно выполняться до определения значений ячеек, потому что при задании значений ячеек можно связать с ними стиль оформления.
Как показано в примере из приложения demo, оформление определяется в начале кода.
Пример определения цветов и выравнивания:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const стильЗаголовка = excel.cellStyle()
стильЗаголовка.setFillPattern(_xls.fillPattern("solid-foreground"))
стильЗаголовка.setFillBackgroundColor(excel.color("black"))
стильЗаголовка.setAlignment(_xls.horizontalAlignment("center"))
const стильЗаголовка = excel.cellStyle()
стильЗаголовка.setFillPattern(_xls.fillPattern("solid-foreground"))
стильЗаголовка.setFillBackgroundColor(excel.color("black"))
стильЗаголовка.setAlignment(_xls.horizontalAlignment("center"))
стильЗаголовка = excel.cellStyle()
стильЗаголовка.setFillPattern(_xls.fillPattern("solid-foreground"))
стильЗаголовка.setFillBackgroundColor(excel.color("black"))
стильЗаголовка.setAlignment(_xls.horizontalAlignment("center"))
стильЗаголовка = excel.cellStyle()
стильЗаголовка.setFillPattern(_xls.fillPattern("solid-foreground"))
стильЗаголовка.setFillBackgroundColor(excel.color("black"))
стильЗаголовка.setAlignment(_xls.horizontalAlignment("center"))
val стильЗаголовка = excel.cellStyle()
стильЗаголовка.setFillPattern(_xls.fillPattern("solid-foreground"))
стильЗаголовка.setFillBackgroundColor(excel.color("black"))
стильЗаголовка.setAlignment(_xls.horizontalAlignment("center"))
final стильЗаголовка = excel.cellStyle()
стильЗаголовка.setFillPattern(_xls.fillPattern("solid-foreground"))
стильЗаголовка.setFillBackgroundColor(excel.color("black"))
стильЗаголовка.setAlignment(_xls.horizontalAlignment("center"))
Документация со всеми методами объекта Стили в Apache POI.
Определение стиля границ:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const стильДанных = excel.cellStyle()
стильДанных.setBorderBottom(_xls.borderStyle("thin"))
стильДанных.setBorderTop(_xls.borderStyle("thin"))
стильДанных.setBorderLeft(_xls.borderStyle("thin"))
стильДанных.setBorderRight(_xls.borderStyle("thin"))
const стильДанных = excel.cellStyle()
стильДанных.setBorderBottom(_xls.borderStyle("thin"))
стильДанных.setBorderTop(_xls.borderStyle("thin"))
стильДанных.setBorderLeft(_xls.borderStyle("thin"))
стильДанных.setBorderRight(_xls.borderStyle("thin"))
стильДанных = excel.cellStyle()
стильДанных.setBorderBottom(_xls.borderStyle("thin"))
стильДанных.setBorderTop(_xls.borderStyle("thin"))
стильДанных.setBorderLeft(_xls.borderStyle("thin"))
стильДанных.setBorderRight(_xls.borderStyle("thin"))
стильДанных = excel.cellStyle()
стильДанных.setBorderBottom(_xls.borderStyle("thin"))
стильДанных.setBorderTop(_xls.borderStyle("thin"))
стильДанных.setBorderLeft(_xls.borderStyle("thin"))
стильДанных.setBorderRight(_xls.borderStyle("thin"))
val стильДанных = excel.cellStyle()
стильДанных.setBorderBottom(_xls.borderStyle("thin"))
стильДанных.setBorderTop(_xls.borderStyle("thin"))
стильДанных.setBorderLeft(_xls.borderStyle("thin"))
стильДанных.setBorderRight(_xls.borderStyle("thin"))
final стильДанных = excel.cellStyle()
стильДанных.setBorderBottom(_xls.borderStyle("thin"))
стильДанных.setBorderTop(_xls.borderStyle("thin"))
стильДанных.setBorderLeft(_xls.borderStyle("thin"))
стильДанных.setBorderRight(_xls.borderStyle("thin"))
Документация со всеми методами объекта Стили в Apache POI.
Создаёт новый стиль шрифта для текста и связывает определения шрифта с определённым уже существующим стилем ячейки:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const шрифтЗаголовка = excel.font()
шрифтЗаголовка.setBold(true)
шрифтЗаголовка.setFontHeightInPoints(14)
шрифтЗаголовка.setColor(excel.color("yellow"))
// Задаёт шрифт для стильЗаголовка
стильЗаголовка.setFont(шрифтЗаголовка)
const шрифтЗаголовка = excel.font()
шрифтЗаголовка.setBold(true)
шрифтЗаголовка.setFontHeightInPoints(14)
шрифтЗаголовка.setColor(excel.color("yellow"))
// Задаёт шрифт для стильЗаголовка
стильЗаголовка.setFont(шрифтЗаголовка)
шрифтЗаголовка = excel.font()
шрифтЗаголовка.setBold(true)
шрифтЗаголовка.setFontHeightInPoints(14)
шрифтЗаголовка.setColor(excel.color("yellow"))
# Задаёт шрифт для стильЗаголовка
стильЗаголовка.setFont(шрифтЗаголовка)
шрифтЗаголовка = excel.font()
шрифтЗаголовка.setBold(true)
шрифтЗаголовка.setFontHeightInPoints(14)
шрифтЗаголовка.setColor(excel.color("yellow"))
# Задаёт шрифт для стильЗаголовка
стильЗаголовка.setFont(шрифтЗаголовка)
val шрифтЗаголовка = excel.font()
шрифтЗаголовка.setBold(true)
шрифтЗаголовка.setFontHeightInPoints(14)
шрифтЗаголовка.setColor(excel.color("yellow"))
// Задаёт шрифт для стильЗаголовка
стильЗаголовка.setFont(шрифтЗаголовка)
final шрифтЗаголовка = excel.font()
шрифтЗаголовка.setBold(true)
шрифтЗаголовка.setFontHeightInPoints(14)
шрифтЗаголовка.setColor(excel.color("yellow"))
// Задаёт шрифт для стильЗаголовка
стильЗаголовка.setFont(шрифтЗаголовка)
Документация со всеми методами объекта Шрифт в Apache POI.
Изображение
Чтобы вставить изображение в лист, которое находится в storage/samples/export-excel/logo.png внутри приложения:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
excel.insertPicture(
_storage.filesystem("server", "samples/export-excel", "logo.png"),
1, // Номер столбца
1 // Номер строки
).resize(2.3)
excel.insertPicture(
_storage.filesystem("server", "samples/export-excel", "logo.png"),
1, // Номер столбца
1 // Номер строки
).resize(2.3)
excel.insertPicture(
_storage.filesystem("server", "samples/export-excel", "logo.png"),
1, # Номер столбца
1 # Номер строки
).resize(2.3)
excel.insertPicture(
_storage.filesystem("server", "samples/export-excel", "logo.png"),
1, # Номер столбца
1 # Номер строки
).resize(2.3)
excel.insertPicture(
_storage.filesystem("server", "samples/export-excel", "logo.png"),
1, // Номер столбца
1 // Номер строки
).resize(2.3)
excel.insertPicture(
_storage.filesystem("server", "samples/export-excel", "logo.png"),
1, // Номер столбца
1 // Номер строки
).resize(2.3)
Чтобы вставить изображение, которое находится в приложении по пути public/images/logo.png:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
excel.insertPicture(
_app.file("public/images/logo.png"),
10, // Номер столбца
1 // Номер строки
).resize(1.5)
excel.insertPicture(
_app.file("public/images/logo.png"),
10, // Номер столбца
1 // Номер строки
).resize(1.5)
excel.insertPicture(
_app.file("public/images/logo.png"),
10, # Номер столбца
1 # Номер строки
).resize(1.5)
excel.insertPicture(
_app.file("public/images/logo.png"),
10, # Номер столбца
1 # Номер строки
).resize(1.5)
excel.insertPicture(
_app.file("public/images/logo.png"),
10, // Номер столбца
1 // Номер строки
).resize(1.5)
excel.insertPicture(
_app.file("public/images/logo.png"),
10, // Номер столбца
1 // Номер строки
).resize(1.5)
Документация со всеми методами объекта Изображение в Apache POI.
Объединение ячеек
Для объединения ячеек в области используется метод mergedRegion.
Порядок параметров следующий:
- Начальная строка
- Начальный столбец
- Конечная строка
- Конечный столбец
Числовые ссылки позиционирования всегда начинаются с нуля.
В примере ниже будут объединены все ячейки с 10-го по 15-й столбец, находящиеся в строке 3:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
excel.mergedRegion(2, 9, 2, 14)
excel.mergedRegion(2, 9, 2, 14)
excel.mergedRegion(2, 9, 2, 14)
excel.mergedRegion(2, 9, 2, 14)
excel.mergedRegion(2, 9, 2, 14)
excel.mergedRegion(2, 9, 2, 14)
Ячейки
Чтобы получить объект, представляющий ячейку:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
// Получает ячейку в столбце B и строке 2:
const клетка = excel.cell(1, 1)
// Получает ячейку в столбце B и строке 2:
const клетка = excel.cell(1, 1)
# Получает ячейку в столбце B и строке 2:
клетка = excel.cell(1, 1)
# Получает ячейку в столбце B и строке 2:
клетка = excel.cell(1, 1)
// Получает ячейку в столбце B и строке 2:
val клетка = excel.cell(1, 1)
// Получает ячейку в столбце B и строке 2:
final клетка = excel.cell(1, 1)
Числовые ссылки позиционирования всегда начинаются с нуля.
Пример вывода в лог формулы ячейки:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
// Записывает в лог формулу строки 2 и столбца B.
_log.info(
"Формула ячейки B2: "+ excel.cell(1, 1).getCellFormula()
)
// Записывает в лог формулу строки 2 и столбца B.
_log.info(
"Формула ячейки B2: "+ excel.cell(1, 1).getCellFormula()
)
# Записывает в лог формулу строки 2 и столбца B.
_log.info(
"Формула ячейки B2: "+ excel.cell(1, 1).getCellFormula()
)
# Записывает в лог формулу строки 2 и столбца B.
_log.info(
"Формула ячейки B2: "+ excel.cell(1, 1).getCellFormula()
)
// Записывает в лог формулу строки 2 и столбца B.
_log.info(
"Формула ячейки B2: "+ excel.cell(1, 1).getCellFormula()
)
// Записывает в лог формулу строки 2 и столбца B.
_log.info(
"Формула ячейки B2: "+ excel.cell(1, 1).getCellFormula()
)
Пример получения текстового значения ячейки:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
// Записывает в лог текстовое значение ячейки строки 2 и столбца B.
_log.info(
"Значение ячейки B2: "+ excel.cell(1, 1).getStringCellValue()
)
// Записывает в лог текстовое значение ячейки строки 2 и столбца B.
_log.info(
"Значение ячейки B2: "+ excel.cell(1, 1).getStringCellValue()
)
# Записывает в лог текстовое значение ячейки строки 2 и столбца B.
_log.info(
"Значение ячейки B2: "+ excel.cell(1, 1).getStringCellValue()
)
# Записывает в лог текстовое значение ячейки строки 2 и столбца B.
_log.info(
"Значение ячейки B2: "+ excel.cell(1, 1).getStringCellValue()
)
// Записывает в лог текстовое значение ячейки строки 2 и столбца B.
_log.info(
"Значение ячейки B2: "+ excel.cell(1, 1).getStringCellValue()
)
// Записывает в лог текстовое значение ячейки строки 2 и столбца B.
_log.info(
"Значение ячейки B2: "+ excel.cell(1, 1).getStringCellValue()
)
Документация со всеми методами объекта Ячейка в Apache POI.
Строки
Чтобы получить объект, представляющий строку:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
// Получает объект, представляющий строку 2.
const строка = excel.row(1)
// Получает объект, представляющий строку 2.
const строка = excel.row(1)
# Получает объект, представляющий строку 2.
строка = excel.row(1)
# Получает объект, представляющий строку 2.
строка = excel.row(1)
// Получает объект, представляющий строку 2.
val строка = excel.row(1)
// Получает объект, представляющий строку 2.
final строка = excel.row(1)
Числовые ссылки позиционирования всегда начинаются с нуля.
В примере выше, если строка не существует, новая строка будет создана автоматически.
Документация со всеми методами объекта Строка в Apache POI.
Вставка табличных данных
Можно вставить таблицу данных с помощью метода addDataTable.
Первые два параметра определяют позицию, в которую должна быть вставлена таблица данных: это номера строк и столбцов.
Обратите внимание, что позиционирование строк и столбцов в коде всегда начинается с нуля.
То есть строка 1 — это позиция
0, и столбец A также является позицией0.
Далее передаётся список строк, где каждая строка содержит другой список для столбцов, и только затем добавляется карта со значением ячейки.
Полный пример:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
excel.addDataTable(
6, 1,
_val.list() // Строки
.add(
_val.list() // Столбец
.add(
_val.map() // Ячейка
.set("value", "Имя")
)
.add(
_val.map()
.set("value", "Возраст")
)
)
.add( // Другая строка
_val.list()
.add( // Первый столбец
_val.map()
.set("value", "Мария")
)
.add( // Второй столбец
_val.map()
.set("value", 26)
)
)
)
excel.addDataTable(
6, 1,
_val.list() // Строки
.add(
_val.list() // Столбец
.add(
_val.map() // Ячейка
.set("value", "Имя")
)
.add(
_val.map()
.set("value", "Возраст")
)
)
.add( // Другая строка
_val.list()
.add( // Первый столбец
_val.map()
.set("value", "Мария")
)
.add( // Второй столбец
_val.map()
.set("value", 26)
)
)
)
excel.addDataTable(
6, 1,
_val.list() # Строки
.add(
_val.list() # Столбец
.add(
_val.map() # Ячейка
.set("value", "Имя")
)
.add(
_val.map()
.set("value", "Возраст")
)
)
.add( # Другая строка
_val.list()
.add( # Первый столбец
_val.map()
.set("value", "Мария")
)
.add( # Второй столбец
_val.map()
.set("value", 26)
)
)
)
excel.addDataTable(
6, 1,
_val.list() # Строки
.add(
_val.list() # Столбец
.add(
_val.map() # Ячейка
.set("value", "Имя")
)
.add(
_val.map()
.set("value", "Возраст")
)
)
.add( # Другая строка
_val.list()
.add( # Первый столбец
_val.map()
.set("value", "Мария")
)
.add( # Второй столбец
_val.map()
.set("value", 26)
)
)
)
excel.addDataTable(
6, 1,
_val.list() // Строки
.add(
_val.list() // Столбец
.add(
_val.map() // Ячейка
.set("value", "Имя")
)
.add(
_val.map()
.set("value", "Возраст")
)
)
.add( // Другая строка
_val.list()
.add( // Первый столбец
_val.map()
.set("value", "Мария")
)
.add( // Второй столбец
_val.map()
.set("value", 26)
)
)
)
excel.addDataTable(
6, 1,
_val.list() // Строки
.add(
_val.list() // Столбец
.add(
_val.map() // Ячейка
.set("value", "Имя")
)
.add(
_val.map()
.set("value", "Возраст")
)
)
.add( // Другая строка
_val.list()
.add( // Первый столбец
_val.map()
.set("value", "Мария")
)
.add( // Второй столбец
_val.map()
.set("value", 26)
)
)
)
Внешний вид
В карте ячеек можно связать уже созданные стили, используя, например, стили, определённые в разделе о внешнем виде и форматировании, которые рассматривались ранее.
Ниже пример того, как связать стили с ячейками:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
excel.addDataTable(
6, 1,
_val.list()
.add(
_val.list()
.add(
_val.map()
.set("value", "Имя")
.set("style", стильЗаголовка)
)
.add(
_val.map()
.set("value", "Возраст")
.set("style", стильЗаголовка)
)
)
)
excel.addDataTable(
6, 1,
_val.list()
.add(
_val.list()
.add(
_val.map()
.set("value", "Имя")
.set("style", стильЗаголовка)
)
.add(
_val.map()
.set("value", "Возраст")
.set("style", стильЗаголовка)
)
)
)
excel.addDataTable(
6, 1,
_val.list()
.add(
_val.list()
.add(
_val.map()
.set("value", "Имя")
.set("style", стильЗаголовка)
)
.add(
_val.map()
.set("value", "Возраст")
.set("style", стильЗаголовка)
)
)
)
excel.addDataTable(
6, 1,
_val.list()
.add(
_val.list()
.add(
_val.map()
.set("value", "Имя")
.set("style", стильЗаголовка)
)
.add(
_val.map()
.set("value", "Возраст")
.set("style", стильЗаголовка)
)
)
)
excel.addDataTable(
6, 1,
_val.list()
.add(
_val.list()
.add(
_val.map()
.set("value", "Имя")
.set("style", стильЗаголовка)
)
.add(
_val.map()
.set("value", "Возраст")
.set("style", стильЗаголовка)
)
)
)
excel.addDataTable(
6, 1,
_val.list()
.add(
_val.list()
.add(
_val.map()
.set("value", "Имя")
.set("style", стильЗаголовка)
)
.add(
_val.map()
.set("value", "Возраст")
.set("style", стильЗаголовка)
)
)
)
Формулы
Для вставки формул используется ключ formula в карте определений ячейки.
В этом примере в последней ячейке будет выполнено суммирование всех значений других ячеек:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
excel.addDataTable(
6, 1,
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set("formula", "SUM(B7:C8)")
)
)
)
excel.addDataTable(
6, 1,
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set("formula", "SUM(B7:C8)")
)
)
)
excel.addDataTable(
6, 1,
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set("formula", "SUM(B7:C8)")
)
)
)
excel.addDataTable(
6, 1,
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set("formula", "SUM(B7:C8)")
)
)
)
excel.addDataTable(
6, 1,
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set("formula", "SUM(B7:C8)")
)
)
)
excel.addDataTable(
6, 1,
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set("formula", "SUM(B7:C8)")
)
)
)
Для получения буквы столбца из номера столбца можно использовать метод columnReference, что может помочь при определении формул. Этот же метод также можно использовать для получения номера столбца из буквенной ссылки, например:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
excel.addDataTable(
6, _xls.columnReference('B'),
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set(
"formula",
"SUM("+ _xls.columnReference(1) +"7:"+ _xls.columnReference(2) +"8)"
)
)
)
)
excel.addDataTable(
6, _xls.columnReference('B'),
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set(
"formula",
"SUM("+ _xls.columnReference(1) +"7:"+ _xls.columnReference(2) +"8)"
)
)
)
)
excel.addDataTable(
6, _xls.columnReference('B'),
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set(
"formula",
"SUM("+ _xls.columnReference(1) +"7:"+ _xls.columnReference(2) +"8)"
)
)
)
)
excel.addDataTable(
6, _xls.columnReference('B'),
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set(
"formula",
"SUM("+ _xls.columnReference(1) +"7:"+ _xls.columnReference(2) +"8)"
)
)
)
)
excel.addDataTable(
6, _xls.columnReference('B'),
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set(
"formula",
"SUM("+ _xls.columnReference(1) +"7:"+ _xls.columnReference(2) +"8)"
)
)
)
)
excel.addDataTable(
6, _xls.columnReference('B'),
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set(
"formula",
"SUM("+ _xls.columnReference(1) +"7:"+ _xls.columnReference(2) +"8)"
)
)
)
)
Листы
Чтобы создать новый лист (sheet) в самом документе, рассмотрите следующий пример:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const новыйЛист = excel.createSheet("Новый лист")
const новыйЛист = excel.createSheet("Новый лист")
новыйЛист = excel.createSheet("Новый лист")
новыйЛист = excel.createSheet("Новый лист")
val новыйЛист = excel.createSheet("Новый лист")
final новыйЛист = excel.createSheet("Новый лист")
В методах работы с ячейками, изображениями и данными в первый параметр можно добавить ссылку на объект листа.
В зависимости от того, какой лист активен, можно изменить активный лист с помощью метода activeSheet.
Пример вставки изображения в новый лист:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
excel.insertPicture(
новыйЛист,
_app.file("public/images/logo.png"),
10, // Номер столбца
1 // Номер строки
).resize(1.5)
excel.insertPicture(
новыйЛист,
_app.file("public/images/logo.png"),
10, // Номер столбца
1 // Номер строки
).resize(1.5)
excel.insertPicture(
новыйЛист,
_app.file("public/images/logo.png"),
10, # Номер столбца
1 # Номер строки
).resize(1.5)
excel.insertPicture(
новыйЛист,
_app.file("public/images/logo.png"),
10, # Номер столбца
1 # Номер строки
).resize(1.5)
excel.insertPicture(
новыйЛист,
_app.file("public/images/logo.png"),
10, // Номер столбца
1 // Номер строки
).resize(1.5)
excel.insertPicture(
новыйЛист,
_app.file("public/images/logo.png"),
10, // Номер столбца
1 // Номер строки
).resize(1.5)
Пример вставки таблицы данных в новый лист:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
excel.addDataTable(
новыйЛист,
6, 1,
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set("formula", "SUM(B7:C8)")
)
)
)
excel.addDataTable(
новыйЛист,
6, 1,
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set("formula", "SUM(B7:C8)")
)
)
)
excel.addDataTable(
новыйЛист,
6, 1,
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set("formula", "SUM(B7:C8)")
)
)
)
excel.addDataTable(
новыйЛист,
6, 1,
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set("formula", "SUM(B7:C8)")
)
)
)
excel.addDataTable(
новыйЛист,
6, 1,
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set("formula", "SUM(B7:C8)")
)
)
)
excel.addDataTable(
новыйЛист,
6, 1,
_val.list()
.add(
_val.list()
.add(_val.map().set("value", 45))
.add(_val.map().set("value", 26))
)
.add(
_val.list()
.add(_val.map().set("value", 51))
.add(_val.map().set("value", 30))
)
.add(
_val.list()
.add(
_val.map().set("value", "Итого")
)
.add(
_val.map().set("formula", "SUM(B7:C8)")
)
)
)
Активация
Таким образом, чтобы не указывать постоянно в методах, какой лист должен обрабатываться, как в примерах выше, можно альтернативно указать активный лист.
Все методы работы с ячейками, изображениями и данными используют активированный лист, когда конкретный лист не указан.
Ниже два способа активации конкретного листа: сначала по ссылке на объект, затем по индексу листа:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
excel.activeSheet(мойЛист) // Объект-ссылка на лист.
excel.activeSheet(1) // Индекс листа, который будет активирован.
excel.activeSheet(мойЛист) // Объект-ссылка на лист.
excel.activeSheet(1) // Индекс листа, который будет активирован.
excel.activeSheet(мойЛист) # Объект-ссылка на лист.
excel.activeSheet(1) # Индекс листа, который будет активирован.
excel.activeSheet(мойЛист) # Объект-ссылка на лист.
excel.activeSheet(1) # Индекс листа, который будет активирован.
excel.activeSheet(мойЛист) // Объект-ссылка на лист.
excel.activeSheet(1) // Индекс листа, который будет активирован.
excel.activeSheet(мойЛист) // Объект-ссылка на лист.
excel.activeSheet(1) // Индекс листа, который будет активирован.
Полезные возможности
Примеры других полезных методов для работы с листами.
Получение листа по имени:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
// Получает лист по его имени.
const мойЛист = excel.getSheet("Имя листа")
// Получает лист по его имени.
const мойЛист = excel.getSheet("Имя листа")
# Получает лист по его имени.
мойЛист = excel.getSheet("Имя листа")
# Получает лист по его имени.
мойЛист = excel.getSheet("Имя листа")
// Получает лист по его имени.
val мойЛист = excel.getSheet("Имя листа")
// Получает лист по его имени.
final мойЛист = excel.getSheet("Имя листа")
Получение листа по индексу:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
// Получает лист по его номеру.
const мойЛист = excel.getSheet(1)
// Получает лист по его номеру.
const мойЛист = excel.getSheet(1)
# Получает лист по его номеру.
мойЛист = excel.getSheet(1)
# Получает лист по его номеру.
мойЛист = excel.getSheet(1)
// Получает лист по его номеру.
val мойЛист = excel.getSheet(1)
// Получает лист по его номеру.
final мойЛист = excel.getSheet(1)
Для получения общего количества листов:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
// Общее количество листов.
const всегоЛистов = excel.getNumberOfSheets()
// Общее количество листов.
const всегоЛистов = excel.getNumberOfSheets()
# Общее количество листов.
всегоЛистов = excel.getNumberOfSheets()
# Общее количество листов.
всегоЛистов = excel.getNumberOfSheets()
// Общее количество листов.
val всегоЛистов = excel.getNumberOfSheets()
// Общее количество листов.
final всегоЛистов = excel.getNumberOfSheets()
Для вывода списка всех существующих в документе листов.
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
// Список всех листов.
const всеЛисты = excel.getAllSheets()
for (const лист of всеЛисты) {
...
}
// Список всех листов.
const всеЛисты = excel.getAllSheets()
for (const лист of всеЛисты) {
...
}
# Список всех листов.
всеЛисты = excel.getAllSheets()
for лист in всеЛисты:
...
# Список всех листов.
всеЛисты = excel.getAllSheets()
всеЛисты.each do |лист|
...
end
// Список всех листов.
val всеЛисты = excel.getAllSheets()
всеЛисты.forEach {
...
}
// Список всех листов.
def всеЛисты = excel.getAllSheets()
for (лист in всеЛисты) {
...
}
Документация со всеми методами объекта Лист в Apache POI.
Генерация файла
В методах save и output создаётся двоичное содержимое итогового файла.
Отправляет сгенерированный файл как вывод данных (output) сервиса:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
excel.output("файл.xlsx")
excel.output("файл.xlsx")
excel.output("файл.xlsx")
excel.output("файл.xlsx")
excel.output("файл.xlsx")
excel.output("файл.xlsx")
Чтобы сохранить сгенерированный файл в папку storage/filesystem приложения:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
excel.save(_storage.filesystem("server", "файл.xlsx"))
excel.save(_storage.filesystem("server", "файл.xlsx"))
excel.save(_storage.filesystem("server", "файл.xlsx"))
excel.save(_storage.filesystem("server", "файл.xlsx"))
excel.save(_storage.filesystem("server", "файл.xlsx"))
excel.save(_storage.filesystem("server", "файл.xlsx"))
Чтобы сохранить сгенерированный файл в папку /tmp файловой системы жёсткого диска:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
excel.save(_os.file("/tmp/файл.xlsx"))
excel.save(_os.file("/tmp/файл.xlsx"))
excel.save(_os.file("/tmp/файл.xlsx"))
excel.save(_os.file("/tmp/файл.xlsx"))
excel.save(_os.file("/tmp/файл.xlsx"))
excel.save(_os.file("/tmp/файл.xlsx"))
Редактирование файла
Можно редактировать файлы, открывая их, внося необходимые изменения и затем сохраняя новый отредактированный файл.
Ниже приведены некоторые примеры того, как можно открывать файлы.
Открытие файла в корне приложения:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const excel = _xls.open(_app.file("файл.xlsx"))
const excel = _xls.open(_app.file("файл.xlsx"))
excel = _xls.open(_app.file("файл.xlsx"))
excel = _xls.open(_app.file("файл.xlsx"))
val excel = _xls.open(_app.file("файл.xlsx"))
final excel = _xls.open(_app.file("файл.xlsx"))
Чтобы открыть файл, сгенерированный в папке storage/filesystem приложения:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const excel = _xls.open(_storage.filesystem("server", "файл.xlsx"))
const excel = _xls.open(_storage.filesystem("server", "файл.xlsx"))
excel = _xls.open(_storage.filesystem("server", "файл.xlsx"))
excel = _xls.open(_storage.filesystem("server", "файл.xlsx"))
val excel = _xls.open(_storage.filesystem("server", "файл.xlsx"))
final excel = _xls.open(_storage.filesystem("server", "файл.xlsx"))
А также чтобы открыть файл в папке /tmp файловой системы жёсткого диска:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const excel = _xls.open(_os.file("/tmp/файл.xlsx"))
const excel = _xls.open(_os.file("/tmp/файл.xlsx"))
excel = _xls.open(_os.file("/tmp/файл.xlsx"))
excel = _xls.open(_os.file("/tmp/файл.xlsx"))
val excel = _xls.open(_os.file("/tmp/файл.xlsx"))
final excel = _xls.open(_os.file("/tmp/файл.xlsx"))
В примерах выше константа excel будет содержать объект редактирования с контекстом соответствующего файла, поэтому можно выполнять любые виды манипуляций.
После завершения изменений выполните генерацию нового файла.
Невозможно напрямую изменить тот же открытый файл; необходимо сгенерировать новый файл с другим путём.
Чтобы напрямую изменить тот же файл, это можно сделать с помощью inputStream.
Ниже пример изменения значения ячейки:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const файлВвода = _app.file("файл.xlsx").inputStream()
const excel = _xls.open(файлВвода)
excel.setCellData(
10, 1,
_val.map()
.set(
"value",
excel.getCellData(10, 1).getInt("value") + 10
)
)
файлВвода.close() // Закрывает открытый файл.
excel.save(_app.file("файл.xlsx")) // Сохраняет новую версию.
const файлВвода = _app.file("файл.xlsx").inputStream()
const excel = _xls.open(файлВвода)
excel.setCellData(
10, 1,
_val.map()
.set(
"value",
excel.getCellData(10, 1).getInt("value") + 10
)
)
файлВвода.close() // Закрывает открытый файл.
excel.save(_app.file("файл.xlsx")) // Сохраняет новую версию.
файлВвода = _app.file("файл.xlsx").inputStream()
excel = _xls.open(файлВвода)
excel.setCellData(
10, 1,
_val.map()
.set(
"value",
excel.getCellData(10, 1).getInt("value") + 10
)
)
файлВвода.close() # Закрывает открытый файл.
excel.save(_app.file("файл.xlsx")) # Сохраняет новую версию.
файлВвода = _app.file("файл.xlsx").inputStream()
excel = _xls.open(файлВвода)
excel.setCellData(
10, 1,
_val.map()
.set(
"value",
excel.getCellData(10, 1).getInt("value") + 10
)
)
файлВвода.close() # Закрывает открытый файл.
excel.save(_app.file("файл.xlsx")) # Сохраняет новую версию.
val файлВвода = _app.file("файл.xlsx").inputStream()
val excel = _xls.open(файлВвода)
excel.setCellData(
10, 1,
_val.map()
.set(
"value",
excel.getCellData(10, 1).getInt("value") + 10
)
)
файлВвода.close() // Закрывает открытый файл.
excel.save(_app.file("файл.xlsx")) // Сохраняет новую версию.
final файлВвода = _app.file("файл.xlsx").inputStream()
final excel = _xls.open(файлВвода)
excel.setCellData(
10, 1,
_val.map()
.set(
"value",
excel.getCellData(10, 1).getInt("value") + 10
)
)
файлВвода.close() // Закрывает открытый файл.
excel.save(_app.file("файл.xlsx")) // Сохраняет новую версию.
Чтение файла
Извлечение данных из файлов Excel выполняется методом read.
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
const данные = _xls.read(_app.file("файл.xlsx"))
const данные = _xls.read(_app.file("файл.xlsx"))
данные = _xls.read(_app.file("файл.xlsx"))
данные = _xls.read(_app.file("файл.xlsx"))
val данные = _xls.read(_app.file("файл.xlsx"))
final данные = _xls.read(_app.file("файл.xlsx"))
Данные получаются в структуре объектов типа Values, которая содержит списки для листов, строк и столбцов и карты (ключ и значение) для ячеек.
Чтобы просмотреть все данные, можно вывести их как вывод данных сервиса:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
_out.json(данные)
_out.json(данные)
_out.json(данные)
_out.json(данные)
_out.json(данные)
_out.json(данные)
Для выполнения итерации нужно учитывать, что структура данных организована в следующем порядке:
sheets— Листыrows— Строкиcolumns— Столбцы
Пример полной итерации:
- JavaScript
- TypeScript
- Python
- Ruby
- Kotlin
- Groovy
for (const лист of данные.getValues("sheets")) {
_out.println(`<h4>Лист: ${лист.getInt("index")} - ${лист.getString("name")}</h4>`)
for (const строка of лист.getValues("rows")) {
_out.println(`<h4>Строка: ${строка.getInt("row")}</h4>`)
_out.println("<p>")
for (const столбец of строка.getValues("columns")) {
_out.print(`${столбец.getInt("row")}:${столбец.getInt("column")}`)
_out.print(` # ${столбец.getString("address")}`)
_out.print(` # ${столбец.getString("type")}`)
_out.print(` # ${столбец.getString("value")}`)
_out.println("<br>")
}
_out.println("</p>")
}
}
for (const лист of данные.getValues("sheets")) {
_out.println(`<h4>Лист: ${лист.getInt("index")} - ${лист.getString("name")}</h4>`)
for (const строка of лист.getValues("rows")) {
_out.println(`<h4>Строка: ${строка.getInt("row")}</h4>`)
_out.println("<p>")
for (const столбец of строка.getValues("columns")) {
_out.print(`${столбец.getInt("row")}:${столбец.getInt("column")}`)
_out.print(` # ${столбец.getString("address")}`)
_out.print(` # ${столбец.getString("type")}`)
_out.print(` # ${столбец.getString("value")}`)
_out.println("<br>")
}
_out.println("</p>")
}
}
for лист in данные.getValues("sheets"):
_out.println(f"<h4>Лист: {лист.getInt('index')} - {лист.getString('name')}</h4>")
for строка in лист.getValues("rows"):
_out.println(f"<h4>Строка: {строка.getInt('row')}</h4>")
_out.println("<p>")
for столбец in строка.getValues("columns"):
_out.print(f"{столбец.getInt('row')}:{столбец.getInt('column')}")
_out.print(f" # {столбец.getString('address')}")
_out.print(f" # {столбец.getString('type')}")
_out.print(f" # {столбец.getString('value')}")
_out.println("<br>")
_out.println("</p>")
данные.getValues("sheets").each do |лист|
_out.println("<h4>Лист: #{лист.getInt("index")} - #{лист.getString("name")}</h4>")
лист.getValues("rows").each do |строка|
_out.println("<h4>Строка: #{строка.getInt("row")}</h4>")
_out.println("<p>")
строка.getValues("columns").each do |столбец|
_out.print("#{столбец.getInt("row")}:#{столбец.getInt("column")}")
_out.print(" # #{столбец.getString("address")}")
_out.print(" # #{столбец.getString("type")}")
_out.print(" # #{столбец.getString("value")}")
_out.println("<br>")
end
_out.println("</p>")
end
end
данные.getValues("sheets").forEach {
val лист = it
_out.println("<h4>Лист: ${лист.getInt("index")} - ${лист.getString("name")}</h4>")
лист.getValues("rows").forEach {
val строка = it
_out.println("<h4>Строка: ${строка.getInt("row")}</h4>")
_out.println("<p>")
строка.getValues("columns").forEach {
val столбец = it
_out.print("${столбец.getInt("row")}:${столбец.getInt("column")}")
_out.print(" # ${столбец.getString("address")}")
_out.print(" # ${столбец.getString("type")}")
_out.print(" # ${столбец.getString("value")}")
_out.println("<br>")
}
_out.println("</p>")
}
}
for (лист in данные.getValues("sheets")) {
_out.println("<h4>Лист: ${лист.getInt('index')} - ${лист.getString('name')}</h4>")
for (строка in лист.getValues("rows")) {
_out.println("<h4>Строка: ${строка.getInt('row')}</h4>")
_out.println("<p>")
for (столбец in строка.getValues("columns")) {
_out.print("${столбец.getInt('row')}:${столбец.getInt('column')}")
_out.print(" # ${столбец.getString('address')}")
_out.print(" # ${столбец.getString('type')}")
_out.print(" # ${столбец.getString('value')}")
_out.println("<br>")
}
_out.println("</p>")
}
}
Тип ячейки получается с помощью кода:
столбец.getString("type")
Поддерживаемые типы:
string— Текстовое содержимое.numeric— Числовое содержимое или дата и/или время.boolean— Истина или ложь.blank— Пустая ячейка.formula— Ячейка, содержащая формулу.error— Ошибка при обработке ячейки.
Дополнительные параметры
Для каждого типа ячейки есть некоторые дополнительные параметры.
string — Тип ячейки с текстовым содержимым.
value— Текст ячейки.richValue— Форматирование ячейки.
numeric — Тип ячейки с числовым содержимым, а также датами и временем.
value— Значение числового содержимого ячейки.
В случае дат и времени есть ещё следующие дополнительные параметры:
localDateTime— Объект Java Time LocalDateTime, представляющий значение даты и времени ячейки.localDate— Объект Java Time LocalDate, представляющий значение даты ячейки.localTime— Объект Java Time LocalTime, представляющий значение времени ячейки.instant— Объект Java Time Instant, представляющий значение даты и/или времени ячейки.date— Объект Date из Java, представляющий значение даты и/или времени ячейки.
boolean — Тип ячейки с логическим содержимым, то есть истина или ложь.
value— Значение типа boolean,trueилиfalse.
blank — Тип ячейки без содержимого, поэтому не содержит дополнительных параметров.
formula — Тип ячейки, содержащей формулы вычисления.
value— Итоговое значение результата вычисления.formula— Содержит выражение формулы, использованной для вычисления.
error — Тип ячейки, содержащей ошибку.
value— Байтовое значение возникшей ошибки.code— Если при вычислении формулы возникли ошибки, здесь указывается код возникшей ошибки.
Видео
Ниже несколько примеров видео о том, как программно генерировать файлы Excel/XLSX: