2017-12-26 16 views
0

jTableを作成してExcel.Iにエクスポートするコードを作成しましたが、Excelファイルを開くとファイルが完全には復元されません。 以下の問題が表示されます。JtableをExcelファイルに変換する

修理された部品:/xl/worksheets/sheet2.xml部分にXMLエラーがあります。読み込みエラー。 2行目、0列。 修理部品:/xl/worksheets/sheet7.xml部分にXMLエラーがあります。読み込みエラー。 2行目、列0 削除レコード:名前付き/xl/workbook.xml一部の範囲(ワークブック) 削除レコード:表/xl/tables/table1.xml部分から(表)

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 

import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.WorkbookFactory; 
import org.apache.poi.xssf.usermodel.XSSFRow; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

import javax.swing.JTextField; 
import javax.swing.JLabel; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.awt.event.ActionEvent; 

public class GUI { 
    private static JTextField textField; 
    private static JTextField textField_1; 

public static void main(String args[]) throws IOException { 
    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    Object rowData[][] = null ; 
    Object columnNames[] = { "Column One", "Column Two"}; 
    DefaultTableModel model = new DefaultTableModel(rowData,columnNames); 
    frame.getContentPane().setLayout(null); 
    JTable table = new JTable(model); 
    table.setModel(model); 
    JScrollPane scrollPane = new JScrollPane(table); 
    scrollPane.setBounds(76, 106, 300, 200); 
    scrollPane.setVisible(true); 
    frame.getContentPane().add(scrollPane); 

    textField = new JTextField(); 
    textField.setBounds(76, 21, 86, 20); 
    frame.getContentPane().add(textField); 
    textField.setColumns(10); 

    textField_1 = new JTextField(); 
    textField_1.setBounds(76, 61, 86, 20); 
    frame.getContentPane().add(textField_1); 
    textField_1.setColumns(10); 

    JLabel lblNewLabel = new JLabel("Name"); 
    lblNewLabel.setBounds(20, 24, 46, 14); 
    frame.getContentPane().add(lblNewLabel); 

    JLabel lblAge = new JLabel("Age"); 
    lblAge.setBounds(20, 64, 46, 14); 
    frame.getContentPane().add(lblAge); 



    JButton btnNewButton = new JButton("Get Data"); 
    btnNewButton.setBounds(235, 40, 89, 23); 
    btnNewButton.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { 
      String name = textField.getText().toString(); 
      int age = Integer.parseInt(textField_1.getText()); 
      model.addRow(new Object[] {name,age}); 
      Object obj1 = GetData(table, 0,0); 
      System.out.println("Cell value of 1 column and 1 row :" + obj1); 
      Object obj2 = GetData(table, 0,1); 
      System.out.println("Cell value of 2 column and 1 row :" + obj2); 

     } 
    }); 



    frame.getContentPane().add(btnNewButton); 

    JButton btnNewButton_1 = new JButton("Excel"); 
    btnNewButton_1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
      try { 
       writeToExcel(table); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 
    btnNewButton_1.setBounds(340, 40, 89, 23); 
    frame.getContentPane().add(btnNewButton_1); 
    frame.setSize(455, 356); 
    frame.setVisible(true); 
    } 



protected static void writeToExcel(JTable table) throws Exception { 

    try { 
     File file = new File("IET.xlsx"); 
     FileInputStream inputStream = new FileInputStream(file); 
     XSSFWorkbook workbook = (XSSFWorkbook) WorkbookFactory.create(inputStream); 
     XSSFSheet sh = workbook.getSheet("UserInputs"); 
     TableModel model = table.getModel(); 
     String value1 = model.getValueAt(0, 0).toString(); 
     String value2 = model.getValueAt(0, 1).toString(); 

     workbook.getSheet("UserInputs").getRow(8).getCell(1).setCellValue(value2); 


    FileOutputStream fileOut = new FileOutputStream(file); 
    workbook.write(fileOut); 
    fileOut.close(); 
    workbook.close(); 
    System.out.println("File written successfully"); 
    } 
    catch(Exception e){ 
    System.out.print(e);} 
    } 



private static Object GetData(JTable table, int x, int y) { 

    return table.getValueAt(x, y).toString(); 
} 
    } 

がありますコードに何か問題がありますか?

+1

おそらく直近の問題には関係しませんが、Java GUIは異なるロケールで異なるPLAFを使用する異なるOS、画面サイズ、画面解像度などで動作する必要があります。したがって、ピクセルの完全なレイアウトには役立ちません。代わりに、レイアウトマネージャや[それらの組み合わせ](http://stackoverflow.com/a/5630271/418556)と[空白](http://stackoverflow.com/a/17874718/)のレイアウトパディングとボーダーを使用してください。 418556)。 –

+0

'workbook.write(fileOut);は' workbook.write(fileOut);でなければなりません。 fileOut.flush(); '? –

+0

シート「UserInputs」のセル「B9」が表内の表オブジェクトの見出しセルである場合に限り、「削除されたレコード:/xl/tables/table1.xmlの表(表)からの表」という動作を再現できます。シート。しかし、なぜあなたはJTableのコンテンツセルの内容でExcelテーブルの見出しを上書きしようとしていますか?だから助けを得るためには、 'IET.xlsx'にどのようなコンテンツが記述されているのか、そのコンテンツで何をしようとしているのか正確に説明する必要があります。 –

答えて

0

あなたのコードは、シートに1つのセルB9を上書きしません。

"修復されたパーツ:/xl/worksheets/sheet2.xmlパーツでXMLエラーが発生しました。エラー2行目、0行目:修復されたパーツ:/xl/worksheets/sheet7.xmlパーツXMLエラーです。行2、列0。削除されたレコード:/xl/workbook.xmlの部分(ワークブック)の名前付きの範囲削除されたレコード:/xl/tables/table1.xmlの部分(表)の表 "

Excelでワークブックを開いている間に、シートシートUserInputsのセルB9は、Excelテーブルオブジェクトのヘッダーセルの1つです。さらに、少なくともsheet2およびsheet7には、式で使用される=Tablename[Columnname]などの構造化されたテーブル参照があり、そのような構造化されたテーブル参照も名前付き範囲で使用されます。

したがって、シートシートUserInputsがExcelテーブルオブジェクトのヘッダーセルの1つで、今変更されている場合は、テーブルを更新せずに列名の1つが変更されたため、最初はテーブル自体が壊れています。しかし、のようなすべての構造化テーブル参照は、Columnnameが変更されているため、これらのすべての式は更新されないため、破損しています。

XSSFTable.updateHeadersを使用してテーブルヘッダーを更新できます。しかし、すべてのシートやすべての名前付き範囲のすべての数式ですべての構造化テーブル参照を更新することは、ほとんど不可能になるまで非常に高価になります。だからではなく、を使用して、Excelテーブルオブジェクトのヘッダーセルを変更することをお勧めします。ヘッダーはそのままセルに置き、表の内容範囲のみを変更します。

例:

のは、以下のIET.xlsxファイル持ってみましょう:見ての通り、テーブルがある

enter image description here

はシートUserInputTable1を命名し、ヘッダは、行9です。

今、私たちはそうのようなJTableからのコンテンツとコンテンツの範囲B10:F[10+n]を上書きすることができます。

import org.apache.poi.ss.usermodel.*; 
import org.apache.poi.xssf.usermodel.*; 
import org.apache.poi.ss.*; 
import org.apache.poi.ss.util.*; 

import java.io.File; 
import java.io.FileOutputStream; 
import java.io.FileInputStream; 

import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 

class ReadAndWriteExcelHavingTableObject { 

static void writeToExcel(XSSFTable exceltable, JTable table) throws Exception { 

    int exceltableStartRow = exceltable.getStartRowIndex(); 
    int exceltableStartCol = exceltable.getStartColIndex(); 

    XSSFSheet sheet = (XSSFSheet)exceltable.getParent(); 

    TableModel model = table.getModel(); 

    int exceltableEndRow = exceltableStartRow + model.getRowCount(); //as much rows as are in the model 
    int exceltableEndCol = exceltable.getEndColIndex(); 

    //write the content 
    for (int r = 0; r < model.getRowCount(); r++) { 
    for (int c = 0; c < exceltableEndCol - exceltableStartCol + 1; c++) { 
    XSSFRow row = sheet.getRow(exceltableStartRow + 1 + r); 
    if (row == null) row = sheet.createRow(exceltableStartRow + 1 + r); 
    XSSFCell cell = row.getCell(exceltableStartCol + c); 
    if (cell == null) cell = row.createCell(exceltableStartCol + c); 

    if (c < model.getColumnCount() && model.getValueAt(r, c) instanceof String) { 
    String str = (String)model.getValueAt(r, c); 
    cell.setCellValue(str); 
    } else if (c < model.getColumnCount() && model.getValueAt(r, c) instanceof Double) { 
    Double value = (Double)model.getValueAt(r, c); 
    cell.setCellValue(value); 
    } else if (c >= model.getColumnCount()) { //formula cells 
    XSSFCell firstCell = sheet.getRow(exceltableStartRow + 1).getCell(exceltableStartCol + c); 
    if (firstCell.getCellTypeEnum() == CellType.FORMULA) { 
     cell.setCellFormula(firstCell.getCellFormula()); 
    } 
    } 
    } 
    } 

    //update the size of exceltable 
    exceltable.setCellReferences(new AreaReference(
    new CellReference(exceltableStartRow, exceltableStartCol), 
    new CellReference(exceltableEndRow, exceltableEndCol), 
    SpreadsheetVersion.EXCEL2007)); 

} 


public static void main(String[] args) throws Exception { 

    Object rowData[][] = { 
      {"Bob", 12.0, 3.0}, 
      {"Alice", 34.0, 2.5}, 
      {"Jack", 56.0, 2.0}, 
      {"John", 78.0, 1.5} 
      }; 
    Object columnNames[] = {"Name", "Amount", "Factor"}; 
    DefaultTableModel model = new DefaultTableModel(rowData, columnNames); 
    JTable table = new JTable(model); 
    table.setModel(model); 

    File file = new File("IET.xlsx"); 
    FileInputStream inputStream = new FileInputStream(file); 
    XSSFWorkbook workbook = (XSSFWorkbook)WorkbookFactory.create(inputStream); 

    XSSFTable exceltable = workbook.getTable("Table1"); 

    writeToExcel(exceltable, table); 

    workbook.setForceFormulaRecalculation(true); 

    FileOutputStream fileOut = new FileOutputStream(file); 
    workbook.write(fileOut); 
    workbook.close(); 

} 
} 

結果は次のようになります。

enter image description here

とNOヘッダが変更されていないことから、テーブル自体この後は構造化された参照はすべて破損しません。

関連する問題