Progress-servis55.ru

Новости из мира ПК
2 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java работа с таблицами

Работа с таблицей Excel из Java

Собственно возникла проблема — обработать данные из таблицы и на их основе получить другую таблицу.

Вариантов решения этой проблемы несколько:

  1. Макрос — единственной проблемой является VBA, на изучение которого времени нет совершенно, да и не нравится его синтаксис
  2. Приложение на C# тут вроде все хорошо, но к машине на которой будет выполняться данное приложение сразу предъявляется много дополнительных требований:
    • .NET Framework
    • Установленный офис
    • установленная основная сборка взаимодействия (PIA) для приложения Office

  3. связка Java и библиотека Apache POI—на этом способе я и хочу остановиться подробнее

Apache POI — это Java API для доступа к документам формата Microsoft.

Собственно для работы с таблицами Excel предназначен проект POI-HSSF. На данный момент есть 2 варианта библиотеки:

  1. POI 3.5 beta 5, and Office Open XML Support (2009-02-19)—идет работа над поддержкой формата Office 2007
  2. POI 3.2-FINAL Released (2008-10-19) — последний стабильный релиз

Я расскажу о работе с версией 3.2
Основным классом для работы с таблицей Excel является класс HSSFWorkbook пакета org.apache.poi.hssf.usermodel, представляющий книгу Excel.

Для чтения книги из файла можно применить следующий код:

Метод возвращает объект класса HSSFWorkbook если все удачно и null в другом случае.

Для сохранения изменений можно применить следующий метод:

Метод записывает книгу 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)
  • Через итератор

  • Создание новой строки
    HSSFRow row=sheet.createRow(0);

Ну и последним объектом на пути доступа к данным является объект класса HSSFCell — ячейка строки.
Получить доступ к ячейке можно из объекта строки следующими способами:

  • По индексу ячейки (индексация начинается с 0)
    HSSFCell cell = row.getCell(0);
  • Через итератор

  • Создание новой ячейки
    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.

Таблица в Java

Здравствуйте! Можно ли сделать в java таблицу с именами игроков и кол-вом их очков, ну ,например, как самую простую , размером 2 в ширину и n в высоту, как двумерный массив.

Как-то так, и возможно ли сделать так, чтоб , если кто-то побил чей-то рекорд, то таблица смещалась, ну как в играх.. Прошу прощения за такой вопрос, просто начинающий =)

Ivan 100
Masha 78
Jenya 37
Maks 26
Daniil 15
Andrey 2

07.10.2015, 18:24

Сравнительная таблица C# — Java, С++, Си
Не видел никто сравнительную таблицу как реализовано в C# и в сравнении на других языках Java, С++.

Таблица Java: сохранение и открытие
Ребят, подскажите, пожалуйста: сохранил созданную таблицу (после чего открыл текстовый файл -.

Java. Таблица рекордов для игры
Хочу в игру добавить таблицу рекордов,чтобы 20 лучших результатов сохраняло в таблицу. Подскажите.

ПодТаблицы с данными(Таблица-Таблица-Таблица-Таблица) и наследованием
Имеется такая база с таблицами Район-МО-Цель-Зачача. Несколько вариантов связей передумал уже, но.

07.10.2015, 19:132

в Java Swing тебе подойдёт JTable:

07.10.2015, 19:14307.10.2015, 20:14 [ТС]4

А можно консольную?

Добавлено через 5 минут
Просто я бы хотел, чтоб эта таблица забивалась во время цикла:
Игрок вводит имя, как только закончилась игра (кончились жизни) в таблицу заполняются имя и очки в топ 10.
Если это возможно конечно..

07.10.2015, 20:29507.10.2015, 20:33607.10.2015, 20:487

Так примерно ))) В Паскале раньше так строил )

Это тут она сместилась, в System.out.println(«══╝») нормально будет

Добавлено через 10 минут
Но есть небольшой косяк:
у каждой буквы разная ширина (I W K P)
Как я делал,
1. Я узнавал ширину пробела и записывал в массив двумерный int[33][2] — где 33 это кол-во букв а в другой ячейке ширину этой буквы;
2.Игроки все были с заглавных букв и только русские буквы;
4. Искал в массиве игроков самый длинный ник по ширине;
5. при прорисовке таблицы, после самого большого ника я ставил 1 пробел и рисовал стенку ║, а у других высчитывал
(ШиринаБольшогоНика — ШиринаДанногоНика) / Ширина пробела = кол-во пробелов +
6. Дополнял остальные ники с дополнительными пробелами, чтоб таблица была ровной

Добавлено через 21 секунду
Но есть небольшой косяк:
у каждой буквы разная ширина (I W K P)
Как я делал,
1. Я узнавал ширину пробела и записывал в массив двумерный int[33][2] — где 33 это кол-во букв а в другой ячейке ширину этой буквы;
2.Игроки все были с заглавных букв и только русские буквы;
4. Искал в массиве игроков самый длинный ник по ширине;
5. при прорисовке таблицы, после самого большого ника я ставил 1 пробел и рисовал стенку ║, а у других высчитывал
(ШиринаБольшогоНика — ШиринаДанногоНика) / Ширина пробела = кол-во пробелов +
6. Дополнял остальные ники с дополнительными пробелами, чтоб таблица была ровной

Java работа с таблицами

Поступил анонимный вопрос. 🙂

Q: Вопрос первый 🙂 Форматирование вывода информации в JTable. Числа и даты. Думаю и таким как я, пока еще не очень опытным будет интересно.

A: Будем говорить о форматировании дат, это более интересный для рассмотрения случай. Начнем, правда, с теории.

Подход к отображению информации — MVC

В Java повсеместно используется шаблон MVC — Model-View-Controller. Таблицы не исключение. Для тех, кто не в курсе, поясняю — это разделение данных и их отрисовки. Не случайно модель в таблице возвращает java.lang.Object в качестве значения. Модель только хранит данные, а отрисовкой их занимается специальный компонент, называемый renderer. Списки и деревья устроены точно так же.

Итак, renderer. В его задачу входит только отрисовка ячейки таблицы, и ничего больше. Для таблиц существует интерфейс javax.swing.table.TableCellRenderer , который надо реализовать. Он содержит единственный метод:

Этот метод должен вернуть компоненту, которая способна отрисовать объект, переданный в него. Т.е. получили компоненту, передали в ее метод paint Graphics таблицы — и получили отрисованную ячейку. Все просто.

Пройдемся по параметрам.

  • JTable table — таблица, отрисовка которой ведется. Иногда это нужно — например, если мы подкрашиваем фон в зависимости от значения в определенной колонке (простейший пример — male/female)
  • Object value — значение, которое мы отображаем
  • boolean isSelected — флаг, показывающий, что эта ячейка выделена
  • boolean hasFocus — флаг, показывающий, что в ячейке находится фокус. Отличие от isSelected в том, что в таблице может быть выделена вся строка (весь столбец), а фокус только на одной ячейке
  • int row — строка, в которой находится отрисовываемое значение
  • int column — столбец, в котором находится отрисовываемое значение

JTable позволяет установить renderer несколькими способами. Первый — по умолчанию для определенного класса — JTable.setDefaultRenderer(Class columnClass, TableCellRenderer renderer) . Т.е., например, можно поставить один на класс java.util.Date — и все даты будут отрисовываться с его помощью. Второй способ — установка на определенную колонку. Берем колонку, и устанавливаем у нее renderer: TableColumn.setCellRenderer(TableCellRen derer) . Таким образом можно, например, установить разные renderer-ы для данных одного типа. В случае дат это вряд ли понадобится, а вот различное форматирование вещественных чисел, например, может оказаться актуальным.

Перейдем к практике.

Для начала реализуем TableCellRenderer для типа java.util.Date . На мой взгляд, оптимальнее всего использовать класс javax.swing.JLabel в качестве основы. Единственное замечание — если мы хотим отрисовывать фон, то нужно сделать его непрозрачным ( setOpaque(true) ). Формат даты пусть задает пользователь класса.

Вот что получается:

Логика реализации тривиальная. Мы выставляем все необходимые атрибуты в своем классе — фактически, в JLabel , от которого мы унаследовались — и возвращаем себя. Далее вызывается наш метод paint, в котором отрисовывается наш компонент в той точке, где должна располагаться соответствующая ячейка таблицы. За настройку Graphics (смещение координат) отвечает сама таблица.

Хочу сделать одно замечание. Класс SimpleDateFormat — НЕ thread-safe. И в общем случае использовать один экземпляр на всех не рекомендуется. Однако, поскольку getTableCellRendererComponent вызывается только из GUI-потока, — в нашем случае это безопасно.

Итак. Сначала мы проверяем — а с датой ли вообще имеем дело. Если нет — выставляем соответствующие атрибуты. Если мы имеем дело с датой — мы ее форматируем, выставляем полученную строку в качестве текста, прописываем остальные атрибуты. Вроде все понятно. Кроме, разве что, обработки isSelected и hasFocus . Остановимся на этом подробнее.

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

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

Вариант второй — использование системных цветов. Существенно ближе к истине. Если приложение будет иметь такие же цвета, как и в системе — подсветка в таблицах выделяться и резать глаз не будет. Недостаток очевиден — как только мы меняем LookAndFeel, наша подсветка начинает бросаться в глаза, отличаясь от окружающей действительности. Прежде всего это будет касаться цвета фона неподсвеченной ячейки — в Windows он у компонент ввода белый, а в L&F это не гарантировано.

И третий вариант, на мой взгляд, наиболее правильный — использование цветов из L&F. Именно этот вариант в коде является рабочим.

Фокус я решил отрисовать, используя рамку того же цвета, что и текст. Рамка на одну точку тоньше стандартной, что визуально создает эффект вдавленности для текста (это заметно при переключении между ячейками — текст на выделенной смещается влево и вверх).

Ну и в качестве добавочного штриха — устанавливаем иконку. Это для того, чтобы продемонстрировать, что возможности renderer-а не ограничены только текстом. В принципе, можно вообще генерировать картинку на лету — я когда-то такое делал, отображая в выпадающем списке палитры из шести цветов.

Проверка работы — простой пример

В первом примере реализуем простой вариант — одну колонку с датами. Реализуем простую модель таблицы (здесь я ее целиком не буду приводить), renderer устанавливаем для всей таблицы.

В результате получаем вот такую таблицу в стандартном LookAndFeel «Metal»:

Ну и в Motif для сравнения:

Как видите, один и тот же код дает разные результаты для разных L&F.

Проверка работы — сложный пример

В этом примере мы реализуем таблицу с тремя колонками с датами. Содержимое колонок совпадает, изменяется только формат. Опять-таки реализуем модель таблицы, которая будет содержать данные в виде дат. В качестве имен колонок используем форматы, которые в них применяются.

В этом примере мы для каждой колонки устанавливаем свой renderer. И вот, что получается в итоге.

Собственно, это всё. Совершенно идентично реализуются renderer-ы для списков и деревьев, с той только разницей, что у списков нет колонок, а у деревьев есть дополнительные параметры — является ли объект узлом или листом, раскрыт ли он или нет и т.д. Их обработка зависит только от вас.

Форматирование чисел реализуется еще проще. Могу сказать, что стандартный renderer в таблице совершенно точно понимает классы-наследники Number, Date и Icon. Он берет стандартные форматы, соответствующие локальным настройкам. Необходимое условие — указывать правильный тип данных колонки в модели. Если мне не изменяет память, стандартный renderer понимает также и тип Boolean, отрисовывая его в виде checkbox-а.

Всё вышеперечисленное — и намного больше этого! — можно прочитать в стандартном Java Tutorial: http://java.sun.com/docs/books/tutorial/uiswing/components/table.html

Для самостоятельного изучения приведенных мною примеров используйте вот этот исходный код: http://lj.skipy.ru/samples/renderer.zip. Он, как и всегда, снабжен скриптом для сборки и запуска через ant.

Комментарии? Вопросы? Я что-то упустил?

Java. Swing. Кнопки. Списки. Таблицы

Кнопки

Работа с кнопками осуществляется потомками класса AbstractButton:

  • JButton — обычная командная кнопка;
  • JCheckBox — кнопка флажок;
  • JRadioButton — радио кнопка. Для логической группировки этих кнопок служит объект класса ButtonGroup.

В большинстве случаев в конструкторе кнопки указывается командная строка. Она же по умолчанию является текстом кнопки. Изменить и получить командную строку можно
методами setActionCommand и getActionCommand. Изменить и получить текст кнопки можно методами setText и getText.

Кнопкам можно назначить быструю клавишу:
mybutton.setMnemonic(KeyEvent.VK_F); // ALT+F

Обработка нажатия осуществляется через интерфейс ActionListener. Дополнительно для
кнопки флажка можно обрабатывать событие изменение состояния через интерфейс ItemListener.

Также предусмотрены методы для назначения изображений на различные состояния кнопки, например setPressedIcon.

Ниже приведен пример окна с тремя видами кнопок. При нажатии на любой кнопке в консоль выводится ее командная строка. А при нажатии кнопки «Ок» дополнительно выводятся текущие состояния остальных кнопок.

Списки

Для работы со списками по необходимости используются следующие классы:

  • JList — визуальный компонент отображения списка. Массив элементов можно указать при инициализации или методом setListData;
  • DefaultListModel — класс по управлению данными списка. Если необходимо добавление/удаление одиночных элементов в режиме реального времени, то объект этого типа необходимо создавать явно (чтобы иметь к нему доступ);
  • ListCellRenderer — интерфейс для пользовательского отображения элементов списка. По умолчанию элемент списка отображается в виде текста. Если объект представляющий элемент не является строкой, то используется метод toString.

настройка списка

  • setLayoutOrientation — определяет порядок отображения элементов
    • VERTICAL — по вертикали в один столбец;
    • HORIZONTAL_WRAP — горизонтали в несколько строк;
    • VERTICAL_WRAP — по вертикали в несколько столбцов.
  • setVisibleRowCount — определяет желательное число отображаемых строк,
    значение -1 указывает максимальное число строк;
  • setPrototypeCellValue — устанавливает объект, чьи размеры будут шаблоном для всех элементов. Это позволяет ускорить отрисовку списка (доп. см. методы setFixedCellWidth и setFixedCellHeight).

выделение элементов

  • addListSelectionListener — добавить обработчик на выделение элемента;
  • getSelectedIndex — получить индекс первого выделенного элемента;
  • getSelectedIndices — получить индексы выделенных элементов;
  • getSelectedValue — получить выделенный элемент(ы);
  • setSelectedIndex — выделеить указанный элемент;
  • setSelectedIndices — выделить указанные элементы;
  • setSelectedValue — выделить указанный объект;
  • addSelectionInterval — добавить интервал элементов к текущему выделению;
  • isSelectedIndex — выделен ли указанный элемент;
  • isSelectionEmpty — истина, если выделенных элементов нет;
  • clearSelection — снять выделение.

внутренняя структура списка

  • setModel/getModel — определяют текущую модель управления элементами. Сама модель описывается интерфейсом ListModel (реализован в классе DefaultListModel);
  • setSelectionModel/getSelectionModel — определяют текущую модель выбора элементов. Сама модель описывается интерфейсом ListSelectionModel (реализован в
    классе DefaultListSelectionModel);
  • setCellRenderer/getCellRenderer — определяют текущий отрисовщик элемента.
    Сам отрисовщик описывается интерфейсом ListCellRenderer (реализован в классе
    DefaultListCellRenderer и других).

список флажков

Ниже приведен пример как, заменяя отрисовщик (ChkRender), получить новый элемент управления. В данном случае список кнопок флажков (чекбоксы).

Таблицы

Таблица описывается классом JTable.

Ниже приведен пример создания простой таблицы с зеленой сеткой и возможностью
сортировать по столбцу. Сортировка происходит при клике на заголовок с использованием сортировщика по умолчанию. Также мышкой можно поменять местами столбцы. Таблица помещается в окно прокрутки для просмотра всех строк, когда их много.

сетка

  • getGridColor() — цвет сетки;
  • setGridColor(Color c) — установить цвет сетки;
  • setShowGrid(boolean a) — включает/выключает отображение сетки вокруг ячеек;
  • setShowHorizontalLines(boolean a) — включает/выключает отображение горизонтальных линий сетки;
  • setShowVerticalLines(boolean a) — включает/выключает отображение вертикальных линий сетки;
  • getShowHorizontalLines() — определяет, выводятся ли горизонтальные линии между ячейками;
  • getShowVerticalLines() — определяет, выводятся ли вертикальные линии между
    ячейками.

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

Работа с выделением в JTable осуществляется двумя объектами c интерфейсом ListSelectionModel. Первый управляет выделенными строками, он доступен через метод getSelectionModel. Второй управляет выделенными столбцами. Он входит в состав объекта управления столбцами, и доступен через вызов
getColumnModel().getSelectionModel() .

В качестве обработчиков выделения строк и столбцов используются объекты с интерфейсами ListSelectionListener и TableColumnModelListener соответственно.

Ниже приведен переделанный предыдущий пример для демонстрации обработки событий выделения строки и столбца.

Сам класс JTable также реализует интерфейсы ListSelectionListener и TableColumnModelListener. Таким образом, второй способ обработки событий — создание потомка от JTable с подменой методов valueChanged() и columnSelectionChanged().

Читать еще:  Относительная ошибка прогноза
Ссылка на основную публикацию
Adblock
detector