package org.reldb.dbrowser.ui.content.rel; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Dialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Shell; import org.reldb.dbrowser.ui.DbConnection; import org.reldb.dbrowser.ui.RevDatabase; import org.reldb.rel.client.Attribute; import org.reldb.rel.client.Heading; import org.reldb.rel.client.NullTuples; import org.reldb.rel.client.Tuple; import org.reldb.rel.client.Tuples; import org.reldb.rel.client.Value; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.Iterator; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.DisposeEvent; public class ExporterDialog extends Dialog { private Shell shlExportToFile; private FileDialog exportDialog; private String name; private Value result; private Button btnRadioButtonCSV; private Button btnRadioButtonXLS; private Button btnRadioButtonXLSX; private static String lastPath = null; /** * Create the dialog. * @param parent * @param style */ public ExporterDialog(Shell parent, String name, Value result) { super(parent, SWT.DIALOG_TRIM | SWT.RESIZE); exportDialog = new FileDialog(Display.getCurrent().getActiveShell(), SWT.SAVE); exportDialog.setOverwrite(true); this.name = name; this.result = result; setText("Export to File"); } /** * Open the dialog. */ public void open() { createContents(); setupExportToCSV(); if (lastPath == null) lastPath = System.getProperty("user.home"); exportDialog.setFilterPath(lastPath); exportDialog.setFileName(name); shlExportToFile.open(); shlExportToFile.layout(); Display display = getParent().getDisplay(); while (!shlExportToFile.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } } /** * Create contents of the dialog. */ private void createContents() { shlExportToFile = new Shell(getParent(), getStyle()); shlExportToFile.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { lastPath = exportDialog.getFileName(); } }); shlExportToFile.setSize(600, 200); shlExportToFile.setText("Export to File"); shlExportToFile.setLayout(new FormLayout()); Group group = new Group(shlExportToFile, SWT.NONE); FormData fd_group = new FormData(); fd_group.top = new FormAttachment(0, 10); fd_group.right = new FormAttachment(100, -10); group.setLayoutData(fd_group); btnRadioButtonCSV = new Button(group, SWT.RADIO); btnRadioButtonCSV.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setupExportToCSV(); } }); btnRadioButtonCSV.setBounds(10, 10, 484, 18); btnRadioButtonCSV.setText("CSV text file"); btnRadioButtonCSV.setSelection(true); btnRadioButtonXLS = new Button(group, SWT.RADIO); btnRadioButtonXLS.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setupExportToXLS(); } }); btnRadioButtonXLS.setBounds(10, 34, 484, 18); btnRadioButtonXLS.setText("Excel spreadsheet file (.XLS)"); btnRadioButtonXLSX = new Button(group, SWT.RADIO); btnRadioButtonXLSX.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { setupExportToXLSX(); } }); btnRadioButtonXLSX.setBounds(10, 58, 484, 18); btnRadioButtonXLSX.setText("Excel spreadsheet file (.XLSX)"); Label lblExportTo = new Label(shlExportToFile, SWT.NONE); fd_group.left = new FormAttachment(lblExportTo, 6); FormData fd_lblExportTo = new FormData(); fd_lblExportTo.top = new FormAttachment(0, 10); fd_lblExportTo.left = new FormAttachment(0, 10); lblExportTo.setLayoutData(fd_lblExportTo); lblExportTo.setText("Export to:"); Button btnExport = new Button(shlExportToFile, SWT.NONE); btnExport.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { doExport(); } }); FormData fd_btnExport = new FormData(); fd_btnExport.top = new FormAttachment(group, 6); fd_btnExport.right = new FormAttachment(100, -10); btnExport.setLayoutData(fd_btnExport); btnExport.setText("Export"); Button btnCancel = new Button(shlExportToFile, SWT.NONE); btnCancel.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { close(); } }); btnCancel.setSelection(true); FormData fd_btnNewButton = new FormData(); fd_btnNewButton.top = new FormAttachment(group, 6); fd_btnNewButton.right = new FormAttachment(btnExport, -10); btnCancel.setLayoutData(fd_btnNewButton); btnCancel.setText("Cancel"); shlExportToFile.pack(); } private void setupExportToCSV() { exportDialog.setText("Export to CSV File"); exportDialog.setFilterExtensions(new String[] {"*.csv", "*.*"}); exportDialog.setFilterNames(new String[] {"CSV file", "All Files"}); } private void setupExportToXLS() { exportDialog.setText("Export to Excel File"); exportDialog.setFilterExtensions(new String[] {"*.xls", "*.*"}); exportDialog.setFilterNames(new String[] {"Excel spreadsheet file", "All Files"}); } private void setupExportToXLSX() { exportDialog.setText("Export to Excel File"); exportDialog.setFilterExtensions(new String[] {"*.xlsx", "*.*"}); exportDialog.setFilterNames(new String[] {"Excel spreadsheet file", "All Files"}); } private void doExport() { if (result == null || result instanceof NullTuples) { MessageDialog.openError(shlExportToFile, "Export Error", "Unable to export due to error."); return; } if (!(result instanceof Tuples)) { MessageDialog.openError(shlExportToFile, "Export Error", "Unable to export due to " + result); return; } String fname = exportDialog.open(); if (fname == null) return; Tuples tuples = (Tuples)result; File file = new File(fname); try { if (btnRadioButtonCSV.getSelection()) emitCSV(file, tuples); else if (btnRadioButtonXLS.getSelection()) emitXLS(file, tuples); else emitXLSX(file, tuples); MessageDialog.openInformation(shlExportToFile, "Export to File", "Successfully exported " + name + " to " + file + "."); close(); } catch (Exception error) { MessageDialog.openError(shlExportToFile, "Export Error", "Unable to export due to " + error); error.printStackTrace(); } } private void emitCSV(File file, Tuples tuples) throws FileNotFoundException { PrintWriter writer = null; try { writer = new PrintWriter(file); Heading heading = tuples.getHeading(); if (heading != null) writer.println(tuples.getHeading().toCSV()); Iterator<Tuple> tupleIterator = tuples.iterator(); if (tupleIterator != null) while (tupleIterator.hasNext()) { Tuple tuple = tupleIterator.next(); writer.println(tuple.toCSV()); } } finally { if (writer != null) writer.close(); } } private void emitXLS(File file, Tuples tuples) throws IOException { HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet(name); int rownum = 0; Heading resultsetHeading = tuples.getHeading(); Row row; int column = 0; if (resultsetHeading != null) { row = sheet.createRow(rownum++); column = 0; for (Attribute attribute: resultsetHeading.toArray()) { Cell cell = row.createCell(column++); cell.setCellValue(attribute.getName()); } } Iterator<Tuple> tupleIterator = tuples.iterator(); if (tupleIterator != null) while (tupleIterator.hasNext()) { Tuple tuple = tupleIterator.next(); row = sheet.createRow(rownum++); for (column=0; column < tuple.getAttributeCount(); column++) { Value value = tuple.get(column); Cell cell = row.createCell(column); cell.setCellValue(value.toString()); } } FileOutputStream out = null; try { out = new FileOutputStream(file); workbook.write(out); } finally { if (out != null) out.close(); } workbook.close(); } private void emitXLSX(File file, Tuples tuples) throws IOException { XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet(name); int rownum = 0; Heading resultsetHeading = tuples.getHeading(); Row row; int column; if (resultsetHeading != null) { row = sheet.createRow(rownum++); column = 0; for (Attribute attribute: resultsetHeading.toArray()) { Cell cell = row.createCell(column++); cell.setCellValue(attribute.getName()); } } Iterator<Tuple> tupleIterator = tuples.iterator(); if (tupleIterator != null) while (tupleIterator.hasNext()) { Tuple tuple = tupleIterator.next(); row = sheet.createRow(rownum++); for (column=0; column < tuple.getAttributeCount(); column++) { Value value = tuple.get(column); Cell cell = row.createCell(column); cell.setCellValue(value.toString()); } } FileOutputStream out = null; try { out = new FileOutputStream(file); workbook.write(out); } finally { if (out != null) out.close(); } workbook.close(); } public void close() { shlExportToFile.dispose(); } public static void runQueryToExport(Shell shell, DbConnection connection, String name, String query) { Value result = connection.evaluate(query); if (!(result instanceof NullTuples)) (new ExporterDialog(shell, name, result)).open(); } public static void runQueryToExport(Shell shell, RevDatabase database, String name, String query) { Value result = database.evaluate(query); if (!(result instanceof NullTuples)) (new ExporterDialog(shell, name, result)).open(); } }