- Экспорт JTable в файл XML
- 3 ответы
- Как сохранить таблицу JTable в XML
- Java jtable to xml
- JList — динамическое добавление и удаление элементов списка
- Как с помощью Java загрузить и сохранить рисунок из интернет
- Как сохранить таблицу JTable в XML
- Подтверждение закрытия JFrame
- Использование менеджера компоновки BoxLayout. Часть 3. Выравнивание компонентов по вертикали
Экспорт JTable в файл XML
Я пытаюсь экспортировать JTable в файл, используемый Microsoft Excel. Первоначально я записал данные в текстовый файл и установил расширение «.xls». Конечно, это было непрофессионально, и Excel продолжал жаловаться на неправильный формат. Справедливо. Во всяком случае, теперь я пытаюсь экспортировать его в таблицу XML, чтобы я мог открыть его с помощью Excel. Однако, когда я пытаюсь экспортировать его с помощью XMLEncoder, печатаются исключения, а при открытии в Excel он выглядит или работает неправильно. Вместо того, чтобы иметь данные из таблиц, таблица содержит данные об объектах и классах. Вот мой код:
public static void saveToXML(JTable table, File location, String name) throws Exception < XMLEncoder encoder; File file = new File(location.getAbsolutePath() + "/" + name + ".xml"); encoder = new XMLEncoder(new FileOutputStream(file)); encoder.writeObject(table); encoder.close(); >
java.lang.InstantiationException: fbla.evaluation.window.MainWindow$2 Continuing . java.lang.RuntimeException: failed to evaluate: =Class.new(); Continuing . java.lang.InstantiationException: javax.swing.plaf.basic.BasicTableHeaderUI$MouseInputHandler Continuing . java.lang.Exception: XMLEncoder: discarding statement JTableHeader.removeMouseMotionListener(BasicTableHeaderUI$MouseInputHandler); Continuing . java.lang.InstantiationException: fbla.evaluation.window.MainWindow$38 Continuing . java.lang.Exception: XMLEncoder: discarding statement JTable.addMouseListener(MainWindow$38); Continuing . java.lang.InstantiationException: javax.swing.plaf.basic.BasicTableUI$Handler Continuing . java.lang.Exception: XMLEncoder: discarding statement JTable.removeMouseMotionListener(BasicTableUI$Handler); Continuing .
Любая помощь и понимание очень ценятся. Вероятно, также стоит упомянуть, что модель таблиц является пользовательской.
3 ответы
Вы можете экспортировать TableModel в буфер обмена, как показано здесь и здесь. Приложение: Модель таблицы является пользовательской. Пока модель вашего стола является TableModel , вы можете извлечь данные, как показано здесь. Если формат Office Open XML (OOXML) приемлем, вы можете использовать POI Apache для создания файла.
Вы можете прочитать сгенерированный XML с помощью XMLDecoder , Для пример, но Excel не может; более здесь. — мусорный бог
Есть ли способ экспортировать JTable с помощью Java, чтобы Excel МОЖЕТ его прочитать? Это довольно важная функция, но я бы предпочел не использовать API из-за проблем с лицензированием. — Скоро
Вы можете написать CSV-файл, пока цикл по модели. Обратитесь за юридической консультацией по лицензированию. — мусорный бог
- Создайте экземпляр DocumentBuilder.
- Создайте экземпляр DocumentBuilder.
- Создайте экземпляр DocumentBuilder.
- Создайте документ из вышеуказанного DocumentBuilder.
- Создайте нужные элементы, используя класс Element и его метод appendChild.
- Создайте нужные элементы, используя класс Element и его метод appendChild.
- Создайте новый экземпляр Transformer и новый экземпляр DOMSource.
- Создайте новый StreamResult для выходного потока, который вы хотите использовать.
- Используйте метод преобразования, чтобы записать объект DOM в нужный выходной поток.
static String getPath = ""; public void setPath(String path) < getPath = getPath.concat(path); getPath = getPath.concat(".xml"); >public void importToXML(JTable tabla) < try < DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = documentFactory.newDocumentBuilder(); Document document = documentBuilder.newDocument(); Element root = document.createElement("calculos"); document.appendChild(root); for (int i = 0; i < tabla.getRowCount(); i++) < Element articulo = document.createElement("articulo"); root.appendChild(articulo); Element tipo = document.createElement("name1"); tipo.appendChild(document.createTextNode("" + tabla.getValueAt(i, 0))); articulo.appendChild(tipo); Element unidades = document.createElement("name2"); unidades.appendChild(document.createTextNode("" + tabla.getValueAt(i, 1))); articulo.appendChild(unidades); Element costounitarioDLS = document.createElement("name3"); costounitarioDLS.appendChild(document.createTextNode("" + tabla.getValueAt(i, 2))); articulo.appendChild(costounitarioDLS); Element costounitarioPesos = document.createElement("name4"); costounitarioPesos.appendChild(document.createTextNode("" + tabla.getValueAt(i, 3))); articulo.appendChild(costounitarioPesos); Element porcentajeIGI = document.createElement("name5"); porcentajeIGI.appendChild(document.createTextNode("" + tabla.getValueAt(i, 4))); articulo.appendChild(porcentajeIGI); Element montoIGI = document.createElement("name6"); montoIGI.appendChild(document.createTextNode("" + tabla.getValueAt(i, 5))); articulo.appendChild(montoIGI); >TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); DOMSource domSource = new DOMSource(document); StreamResult streamResult = new StreamResult(new File(getPath)); transformer.transform(domSource, streamResult); > catch (ParserConfigurationException | TransformerException pce) < JOptionPane.showMessageDialog(null, "Error: " + pce.toString()); >>
Я просто заставляю этот код работать, поэтому его можно оптимизировать. Надеюсь, это поможет любому, кто ищет aswe.
Как сохранить таблицу JTable в XML
Заметил, что в панели администрирования моего wordpress в секции «Ключевые слова — По этим словам люди нашли ваш блог» на первом месте последнее время запрос «java jtable to xml». Собственно об этом и будет всё ниже написанное. Возьму обычный JTable с какими-нибудь данными и при помощи Java DOM сохраню всё содержимое таблицы в xml. Первое, что необходимо сделать — это получить данные из таблицы. Кстати таблица редактируемая, поэтому данные в ячейках можно изменять и при очередном сохранении они будут обновляться в XML файле. Так как же получить данные с таблицы? Делаетcя это через TableModel — модель таблицы, в которой находятся все данные отображаемые в JTable в данный момент. Получить модель у таблицы можно при помощи метода getModel. Затем при помощи метода getValueAt(row, col) TableModel можно получить значение из конкретной ячейки таблицы, где row — индекс строки, а col — индекс колонки.
String[] columnNames = < "Name", "Modified", "Type", "Size" >; String[][] data = < < "addins", "02.11.2006 19:15", "Folder", "" >, < "AppPatch", "03.10.2006 14:10", "Folder", "" >, < "assembly", "02.11.2006 14:20", "Folder", "" >, < "Boot", "13.10.2007 10:46", "Folder", "" >, < "Branding", "13.10.2007 12:10", "Folder", "" >, < "Cursors", "23.09.2006 16:34", "Folder", "" >, < "Debug", "07.12.2006 17:45", "Folder", "" >, < "Fonts", "03.10.2006 14:08", "Folder", "" >, < "Help", "08.11.2006 18:23", "Folder", "" >, < "explorer.exe", "18.10.2006 14:13", "File", "2,93MB" >, < "helppane.exe", "22.08.2006 11:39", "File", "4,58MB" >, < "twunk.exe", "19.08.2007 10:37", "File", "1,08MB" >, < "nsreg.exe", "07.08.2007 11:14", "File", "2,10MB" >, < "avisp.exe", "17.12.2007 16:58", "File", "12,67MB" >, >; final JTable table = new JTable(data, columnNames); TableModel model = table.getModel(); int row = 1; int col = 2; String value = model.getValueAt(row, col).toString();
Кроме данных из ячеек таблицы мне понадобятся заголовки столбцов. Конечно заголовки столбцов известны заранее, но есть способ получить их из самой таблицы. Для это получаем ссылку на TableColumnModel при помощи метода getColumnModel. Теперь можно узнать количество столбцов и пробежавшись по всем столбцам получить заголовок каждого из них вот так.
TableModel model = table.getModel(); TableColumnModel columns = table.getColumnModel(); for (int i = 0; i < model.getRowCount(); i++) < for (int j = 0; j < columns.getColumnCount(); j++) < TableColumn col = columns.getColumn(j); String header = col.getHeaderValue().toString(); >>
Все необходимые данные получены. Теперь необходимо при помощи DOM создать в памяти объектное представление нашего будущего документа. Для начала создаем Document.
DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = f.newDocumentBuilder(); Document doc = builder.newDocument();
Далее с помощью DOM методов добавляем необходимые узлы и их атрибуты к документу. Затем при помощи следующей конструкции мы сохраняем получившийся документ в файл.
TransformerFactory tFactory = TransformerFactory.newInstance(); Transformer transformer = tFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(file); transformer.transform(source, result);
А теперь посмотрим на весь исходный код тестового примера, который выглядит вот так.
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; import javax.swing.table.TableModel; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.Element; public class TestFrame extends JFrame < public static void createGUI() < JFrame frame = new JFrame("Test frame"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); String[] columnNames = < "Name", "Modified", "Type", "Size" >; String[][] data = < < "addins", "02.11.2006 19:15", "Folder", "" >, < "AppPatch", "03.10.2006 14:10", "Folder", "" >, < "assembly", "02.11.2006 14:20", "Folder", "" >, < "Boot", "13.10.2007 10:46", "Folder", "" >, < "Branding", "13.10.2007 12:10", "Folder", "" >, < "Cursors", "23.09.2006 16:34", "Folder", "" >, < "Debug", "07.12.2006 17:45", "Folder", "" >, < "Fonts", "03.10.2006 14:08", "Folder", "" >, < "Help", "08.11.2006 18:23", "Folder", "" >, < "explorer.exe", "18.10.2006 14:13", "File", "2,93MB" >, < "helppane.exe", "22.08.2006 11:39", "File", "4,58MB" >, < "twunk.exe", "19.08.2007 10:37", "File", "1,08MB" >, < "nsreg.exe", "07.08.2007 11:14", "File", "2,10MB" >, < "avisp.exe", "17.12.2007 16:58", "File", "12,67MB" >, >; final JTable table = new JTable(data, columnNames); JScrollPane scrollPane = new JScrollPane(table); JButton button = new JButton("Save to xml"); button.addActionListener(new ActionListener() < public void actionPerformed(ActionEvent e) < try < DocumentBuilderFactory f = DocumentBuilderFactory .newInstance(); DocumentBuilder builder = f.newDocumentBuilder(); File file = new File("table.xml"); if (!file.exists()) < file.createNewFile(); >Document doc = builder.newDocument(); Element tableEl = doc.createElement("table"); doc.appendChild(tableEl); TableModel model = table.getModel(); TableColumnModel columns = table.getColumnModel(); for (int i = 0; i < model.getRowCount(); i++) < Element rowEl = doc.createElement("row"); tableEl.appendChild(rowEl); for (int j = 0; j < columns.getColumnCount(); j++) < TableColumn col = columns.getColumn(j); String header = col.getHeaderValue().toString(); String value = model.getValueAt(i, j).toString(); Element cellEl = doc.createElement("cell"); Attr colAttr = doc.createAttribute("colName"); cellEl.setAttributeNode(colAttr); rowEl.appendChild(cellEl); colAttr.appendChild(doc.createTextNode(header)); cellEl.appendChild(doc.createTextNode(value)); >> TransformerFactory tFactory = TransformerFactory .newInstance(); Transformer transformer = tFactory.newTransformer(); DOMSource source = new DOMSource(doc); StreamResult result = new StreamResult(file); transformer.transform(source, result); > catch (Exception exception) < exception.printStackTrace(); >> >); frame.getContentPane().add(button, BorderLayout.SOUTH); frame.getContentPane().add(scrollPane); frame.setPreferredSize(new Dimension(450, 200)); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); > public static void main(String[] args) < javax.swing.SwingUtilities.invokeLater(new Runnable() < public void run() < JFrame.setDefaultLookAndFeelDecorated(true); createGUI(); >>); > >
Java jtable to xml
JList — динамическое добавление и удаление элементов списка
Разрабатывая приложения на Java иногда возникает необходимость динамически добавлять и удалять элементы списка JList. Давайте посмотрим, как это сделать. Начнем с того, что есть такая парадигма программирования Модель-Вид-Контроллер. Если коротко, то она позволяет не сваливать весь код приложения в кучу, а разделять его на три большие блока. Модель — занимается обработкой данных и всё, что с ними связано. Вид — внешность приложения. Определяет то, как будет выглядеть приложение и что собственно будет отображаться пользователю. Продолжить чтение этой записи
Как с помощью Java загрузить и сохранить рисунок из интернет
Придумалось однажды мне написать приложение, которое бы рисунки с ресурса одного загружало и аккуратно складовало бы их в нужную папку. Придумалось мне и написалось. При написании мудрость постиг, а именно, как можно загрузить рисунки с интернета и сохранить. Решил поделиться знанием полученным. Давайте посмотрим, как загрузить эмблему Google с официального сайта, показать её в своем приложении и сохранить. Напишем тестовое приложение, как на рисунке. Продолжить чтение этой записи
Как сохранить таблицу JTable в XML
Заметил, что в панели администрирования моего wordpress в секции «Ключевые слова — По этим словам люди нашли ваш блог» на первом месте последнее время запрос «java jtable to xml». Собственно об этом и будет всё ниже написанное. Возьму обычный JTable с какими-нибудь данными и при помощи Java DOM сохраню всё содержимое таблицы в xml. Первое, что необходимо сделать — это получить данные из таблицы. Кстати таблица редактируемая, поэтому данные в ячейках можно изменять и при очередном сохранении они будут обновляться в XML файле. Так как же получить данные с таблицы? Делаетcя это через TableModel — модель таблицы, в которой находятся все данные отображаемые в JTable в данный момент. Получить модель у таблицы можно при помощи метода getModel. Затем при помощи метода getValueAt(row, col) TableModel можно получить значение из конкретной ячейки таблицы, где row — индекс строки, а col — индекс колонки. Продолжить чтение этой записи
Подтверждение закрытия JFrame
Всем известно, что у JFrame окна имеется заголовок, на котором помимо всего прочего имеется кнопка закрытия окна. Возникают ситуации, при которых необходимо показать пользователю окно с подтверждением после нажатия на кнопку закрытия окна. Давайте посмотрим, как можно реализовать такой функционал. Первое, на что нужно обратить внимание это метод setDefaultCloseOperation класса JFrame. С помощью данного метода разработчик говорит JFrame, который он создает, что необходимо сделать при закрытии окна. Продолжить чтение этой записи
Использование менеджера компоновки BoxLayout. Часть 3. Выравнивание компонентов по вертикали
Как я уже ранее замечал, у BoxLayout очень интересный механизм выравнивания компонентов. В зависимости от того, каким образом BoxLayout располагает компоненты внутри себя (по вертикали или по по горизонтали), выравнивание задается соответственно. Если BoxLayout вертикальный (BoxLayout.Y_AXIS), то каждому компоненту задать выравнивание по левому краю, по центру или по правому краю. Если BoxLayout горизонтальный (BoxLayout.X_AXIS), то выравнивать можно по верху, по центру или по низу. Для того, чтобы не нагружать лишним текстом с объяснением особенностей выравнивания по вертикали, давайте посмотрим тестовый пример, который нам все демонстрирует. Продолжить чтение этой записи