0

我正在尝试将 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: <unbound>=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 ...

非常感谢任何帮助和见解。可能还值得一提的是,表模型是自定义的。

4

3 回答 3

1

您可以将 导出TableModel到剪贴板,如此此处所示。

附录:该表的模型是自定义模型。

只要您的表的模型是TableModel,您就可以提取数据,如下所示

如果可以接受 Office Open XML (OOXML) 格式,您可以使用Apache POI创建文件。

于 2013-04-14T20:50:22.523 回答
0

这是我写的代码,我使用 DOMParse。就我而言,我从中获取信息的 JTable 始终具有相同的列数,因此我只需将行与 FOR 缝合。

简而言之,为了使用 DOM 解析器创建 XML 文件,必须采取的基本步骤是:

  • 创建一个 DocumentBuilder 实例。
  • 创建一个 DocumentBuilder 实例。
  • 创建一个 DocumentBuilder 实例。
  • 从上面的 DocumentBuilder 创建一个 Document。
  • 使用 Element 类及其 appendChild 方法创建所需的元素。
  • 使用 Element 类及其 appendChild 方法创建所需的元素。
  • 创建一个新的 Transformer 实例和一个新的 DOMSource 实例。
  • 为要使用的输出流创建一个新的 StreamResult。
  • 使用 transform 方法将 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 的人。

于 2021-08-18T19:29:20.437 回答
-1

也许你应该试试这个:Java Swing -Export JTable To Excel File

void ExportToExel(JTable table, File file) {

    try {

        WritableWorkbook workbook1 = Workbook.createWorkbook(file);
        WritableSheet sheet1 = workbook1.createSheet("First Sheet", 0); 
        TableModel model = table.getModel();

        for (int i = 0; i < model.getColumnCount(); i++) {
            Label column = new Label(i, 0, model.getColumnName(i));
            sheet1.addCell(column);
        }
        int j = 0;
        for (int i = 0; i < model.getRowCount(); i++) {
            for (j = 0; j < model.getColumnCount(); j++) {
                Label row = new Label(j, i + 1, 
                        model.getValueAt(i, j).toString());
                sheet1.addCell(row);
            }
        }
        workbook1.write();
        workbook1.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
于 2014-09-09T08:04:42.357 回答