21
Jakarta POI 1 Jakarta POI (http://jakarta.apache.org/poi/index.html) jest zbiorem narzędzi umożliwiającym prace z dokumentami zapisanymi w formatach wspieranych przez Microsoft. W skład POI wchodzą następujące komponenty: POIFS – obsługa dokumentów OLE 2, HSSF – dokumenty w formacie Excel'a, HWPF – proste dokumenty w formacie Word 97, HPSF własności dokumentów OLE 2 (tytuł, autor, data ostatniej modyfikacji, ...).

Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

Jakarta POI

1

Jakarta POI (http://jakarta.apache.org/poi/index.html) jest zbiorem narzędzi

umożliwiającym prace z dokumentami zapisanymi w formatach wspieranych przez

Microsoft. W skład POI wchodzą następujące komponenty:

● POIFS – obsługa dokumentów OLE 2,

● HSSF – dokumenty w formacie Excel'a,

● HWPF – proste dokumenty w formacie Word 97,

● HPSF własności dokumentów OLE 2 (tytuł, autor, data ostatniej modyfikacji, ...).

Page 2: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

HSSF w skrócie

2

● odczyt i zapis arkusza:POIFSFileSystem fs = new POIFSFileSystem(

new FileInputStream("input.xls"));HSSFWorkbook wb = new HSSFWorkbook(fs);FileOutputStream fileOut =

new FileOutputStream("output.xls");wb.write(fileOut);fileOut.close();

● nowy, pusty dokument:

HSSFWorkbook wb = new HSSFWorkbook();● nowy arkusz:

HSSFSheet sheet1 = wb.createSheet("pierwszy arkusz");HSSFSheet sheet2 = wb.createSheet("drugi arkusz");

Page 3: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

HSSF w skrócie

3

● dodawanie komórek do formularza:

HSSFRow row = sheet.createRow((short)0);HSSFCell cell = row.createCell((short)0);cell.setCellValue(1);row.createCell((short)1).setCellValue("jakis tekst");row.createCell((short)2).setCellValue(true);

● daty

HSSFCell cell = row.createCell((short)3);cell.setCellValue(new Date());HSSFCellStyle cellStyle = wb.createCellStyle();cellStyle.setDataFormat(

HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));cell = row.createCell((short)4);cell.setCellValue(new Date()); cell.setCellStyle(cellStyle);

Page 4: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

HSSF w skrócie

4

● justowanie:HSSFCell cell = row.createCell((short)5);cell.setCellValue("justowanie");HSSFCellStyle cellStyle = wb.createCellStyle();cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);cell.setCellStyle(cellStyle);

Więcej informacji: http://jakarta.apache.org/poi/hssf/quick-guide.html.

Page 5: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

Przykład

5

Jako przykład zastosowania pakietu Jakarta POI przygotujemy klasę rozszerzającą

JTable o metodę public void exportTable(File file), która zapisuje

dane znajdujące się w tabeli do pliku xls.

1 A Literka a2 B Literka b3 C Literka c4 D Literka d

JXMLTable

TableRow

Page 6: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

TableRow.java

6

public interface TableRow {

public Object getAttribute(int i);public void setAttribute(int i, Object obj);public boolean isEditable(int i);

}

Interfejs określa metody obiektu, który może być umieszczony w naszej tabeli.

Page 7: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

TestObject.java

7

import java.util.Date;

public class TestObject implements TableRow {private int id;private String name;private String description;private Date date;public TestObject(int i, String s1, String s2, Date d) {

this.id = i;this.name = s1;this.description = s2;this.date = d;

}

public boolean isEditable(int i) {if (this.id > 0)

return true;return false;

}

Page 8: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

TestObject.java

8

public Object getAttribute(int i) {switch (i) {case 0:

return new Integer(this.id);case 1:

return this.name;case 2:

return this.description;case 3:

return this.date;default:

return null;}

}

Page 9: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

TestObject.java

9

public void setAttribute(int i, Object obj) {switch (i) {case 0:

if (obj instanceof Integer) {this.id = ((Integer) obj).intValue();

} break;case 1:

if (obj instanceof String) {this.name = (String) obj;

} break;case 2:

if (obj instanceof String) {this.description = (String) obj;

}break;case 3:

if (obj instanceof Date) {this.date = (Date) obj;

} break;default:}return;

}}

Page 10: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

Model tabeli

10

Dane, oraz inne informacje potrzebne do wyświetlenia tabeli JTable są zwykle

pamiętane w instancji klasy JTableModel. Pozwala to na rozdzielenie danych,

sposobu prezentacji i widoku.

ModelTableModel Widok

JTable

Page 11: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

XSLTableModel.java

11

iimport javax.swing.table.AbstractTableModel;

public class XLSTableModel extends AbstractTableModel {private static final int columnCount = 4;private static final int[] columnWidths = { 100, 150, 100, 50 };private static final String[] columnNames = { "pierwsza", "druga",

"trzecia", "czwarta" };private static final String[] columnTips = { "pierwsza kolumna",

"druga kolumna", "trzecia kolumna", "czwarta kolumna" };private TableRow[] rows;public XLSTableModel(TableRow[] tra) {

super();this.rows = tra;

}

public void update(TableRow[] tra) {this.rows = tra;

}

public TableRow getObjectAt(int rowIndex) {if (rowIndex >= 0 && rowIndex > this.rows.length)

return this.rows[rowIndex];return null;

}

Page 12: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

XSLTableModel.java

12

public int getRowCount() {return this.rows.length;

}

public int getColumnCount() {return columnCount;

}

public String getColumnName(int i) {return columnNames[i];

}

public Class getColumnClass(int i) {if (this.rows.length > 0) {

return this.rows[0].getAttribute(i).getClass();}return String.class;

}

public int getColumnWidth(int i) {return columnWidths[i];

}

Page 13: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

XSLTableModel.java

13

public String getColumnTip(int i) {return columnTips[i];

}

public boolean isCellEditable(int row, int column) {TableRow tr = this.rows[row];if (tr != null)

return tr.isEditable(column);return false;

}

public Object getValueAt(int row, int column) {TableRow tr = this.rows[row];if (tr != null)

return tr.getAttribute(column);return null;

}

public void setValueAt(Object aValue, int row, int column) {Object obj = getValueAt(row, column);if (aValue == null || aValue.equals(obj))

return;TableRow tr = this.rows[row];tr.setAttribute(column, aValue);

}}

Page 14: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

JXLSTable.java

14

...

import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;public class JXLSTable extends JTable {

protected JTableHeader createDefaultTableHeader() {return new JTableHeader(this.columnModel) {

public String getToolTipText(MouseEvent e) {Point p = e.getPoint();int index = this.columnModel.getColumnIndexAtX(p.x);if (index < 0)

return null;int realIndex = this.columnModel.getColumn(index)

.getModelIndex();return ((XLSTableModel) JXLSTable.this.getModel())

.getColumnTip(realIndex);}

};}

Page 15: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

JXLSTable.java

15

public JXLSTable(TableRow[] ta) {super();this.setModel(new XLSTableModel(ta));

}

public void exportTable(File file) {int iRow, iColumn, i;Object obj;TableCellRenderer r;Component c;String sTmp;HSSFRow row;HSSFCell cell;HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet();TableModel tm = this.getModel();row = sheet.createRow(sheet.getPhysicalNumberOfRows());for (iColumn=0, i=0; iColumn<tm.getColumnCount(); iColumn++) {

sTmp = tm.getColumnName(iColumn);if (sTmp == null)

sTmp = "";cell = row.createCell((short) i);cell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue(sTmp);i++;

}

Page 16: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

JXLSTable.java

16

for (iRow = 0; iRow < tm.getRowCount(); iRow++) {row = sheet.createRow(sheet.getPhysicalNumberOfRows());

for (iColumn=0, i=0; iColumn<tm.getColumnCount(); iColumn++){cell = row.createCell((short) i);obj = tm.getValueAt(iRow, iColumn);sTmp = "";if (obj != null) {

r = this.getCellRenderer(iRow, iColumn);c = this.prepareRenderer(r, iRow, iColumn);if (c != null) {

if (c instanceof JLabel)sTmp = ((JLabel) c).getText();

elsesTmp = obj.toString();

}// if c}// if objcell.setEncoding(HSSFCell.ENCODING_UTF_16);cell.setCellValue(sTmp);i++;

}// for}// for

Page 17: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

JXLSTable.java

17

try {FileOutputStream fos = new FileOutputStream(file);workbook.write(fos);fos.close();

} catch (IOException e) {e.printStackTrace();

}}

}

Page 18: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

Example.java

18

Klasa Example służy do przetestowania przygotowanego pakietu narzędzi:

import ...public class Example implements ActionListener {

private JXLSTable table;private JTextField filename;public static void main(String[] args) {

TestObject[] toa = new TestObject[4];toa[0] = new TestObject(1, "a", "literka a", new Date());toa[1] = new TestObject(2, "b", "literka b", new Date());toa[2] = new TestObject(3, "c", "literka c", new Date());toa[3] = new TestObject(4, "d", "literka d", new Date());JXLSTable table = new JXLSTable(toa);JScrollPane sp = new JScrollPane(table);JTextField tf = new JTextField("output.xls");Example ex = new Example();ex.filename = tf;ex.table = table;

Page 19: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

Example.java

19

JButton b = new JButton("Export");b.setActionCommand("export");b.addActionListener(ex);JPanel p = new JPanel(new BorderLayout());p.add(tf, BorderLayout.NORTH);p.add(sp, BorderLayout.CENTER);p.add(b, BorderLayout.SOUTH);JFrame f = new JFrame("XLSExample");f.getContentPane().add(p);f.pack();f.setLocationRelativeTo(null);f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setVisible(true);

}

public void actionPerformed(ActionEvent ae) {if (ae.getActionCommand().equals("export")) {

this.table.exportTable(new File(this.filename.getText()));JOptionPane.showMessageDialog(null,

"plik zosta\u0142 zapisany","Informacja", JOptionPane.INFORMATION_MESSAGE);

}}

}

Page 20: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

Uruchomienie programu

20

● do ścieżki klas należy dodać bibliotekę poi-2.0-final-20040126.jar● kompilacja i uruchomienie za pomocą komend javac i java.

Page 21: Jakarta POI - Jagiellonian Universityusers.uj.edu.pl/~ciesla/java/java_08.pdf · HSSF w skrócie 2 odczyt i zapis arkusza: POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("input.xls"));

Podsumowanie

21

Dzięki różnorodnym bibliotekom programy napisane w Javie mogą obsługiwać

wiele formatów dokumentów. Projekt Jakarta POI jest jednym z przykładów takiej

powszechnie wykorzystywanej, biblioteki.