Skip to content

Commit f873c0e

Browse files
committed
Feature: #46
SQL result and table export to MS-Excel files: New options to make exported sheets auto filtered and to choose if header rows are bold, centered and/or frozen. Note: Export to MS-Excel files and other formats is available through the right mouse menu of tables. The SQL editor allows to export SQL results through the right mouse menu and tools popup (ctrl+t).
1 parent d56dabc commit f873c0e

13 files changed

+297
-77
lines changed

sql12/core/doc/changes.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ Not yet released, available in our GIT repository, snapshots and future releases
66

77
Enhancements:
88

9+
https://github.com/squirrel-sql-client/squirrel-sql-code/issues/46
10+
SQL result and table export to MS-Excel files: New options to make exported sheets
11+
auto filtered and to choose if header rows are bold, centered and/or frozen.
12+
Note: Export to MS-Excel files and other formats is available through the right mouse menu of tables.
13+
The SQL editor allows to export SQL results through the right mouse menu and tools popup (ctrl+t).
14+
915
https://github.com/squirrel-sql-client/squirrel-sql-code/issues/45
1016
Table cell data popup dialog now offers a toggle button to pin the dialog.
1117
When pinned any further cell data will be displayed in the pinned dialog.

sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/fileexport/AbstractDataExportFileWriter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public long write(IExportData exportData) throws Exception
7272

7373
if (_fileExportService.getPrefs().isWithHeaders())
7474
{
75-
Iterator<String> headers = exportData.getHeaders();
75+
Iterator<String> headers = exportData.getHeaderColumns();
7676

7777
int colIdx = 0;
7878
beforeHeader();

sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/fileexport/DataExportExcelWriter.java

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,13 @@
2424
import net.sourceforge.squirrel_sql.fw.util.StringManager;
2525
import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory;
2626
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
27-
import org.apache.poi.ss.usermodel.*;
27+
import org.apache.poi.ss.usermodel.Cell;
28+
import org.apache.poi.ss.usermodel.CellStyle;
29+
import org.apache.poi.ss.usermodel.CreationHelper;
30+
import org.apache.poi.ss.usermodel.Row;
31+
import org.apache.poi.ss.usermodel.Sheet;
32+
import org.apache.poi.ss.usermodel.Workbook;
33+
import org.apache.poi.ss.util.CellRangeAddress;
2834
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
2935
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
3036

@@ -53,15 +59,15 @@ public class DataExportExcelWriter
5359
private final FileExportService _fileExportService;
5460
private Workbook _workbook; // The streaming api export for (very) large xlsx files
5561
private Sheet _sheet; // We write the data to this sheet
56-
private boolean withHeader = false;
57-
private HashMap<String, CellStyle> formatCache = null;
62+
private boolean _withHeader = false;
63+
private HashMap<String, CellStyle> _formatCache = null;
5864

5965
public DataExportExcelWriter(File file, TableExportPreferences prefs, ProgressAbortCallback progressController)
6066
{
6167
_fileExportService = new FileExportService(file, prefs, progressController);
6268
}
6369

64-
public long write(ExportDataInfoList exportDataInfoList) throws Exception
70+
public long write(ExportDataInfoList exportDataInfoList, TableExportPreferences prefs) throws Exception
6571
{
6672
long rowsCount = 0;
6773

@@ -73,7 +79,17 @@ public long write(ExportDataInfoList exportDataInfoList) throws Exception
7379
{
7480
this._sheet = _workbook.createSheet(exportDataInfo.getExcelSheetTabName());
7581

76-
rowsCount += _writeExcelTab(exportDataInfo.getExportData());
82+
rowsCount += _writeExcelTab(exportDataInfo.getExportData(), prefs);
83+
84+
if(prefs.isExcelFirstRowFrozen())
85+
{
86+
_sheet.createFreezePane(0, 1);
87+
}
88+
89+
if(prefs.isExcelAutoFilter())
90+
{
91+
_sheet.setAutoFilter(new CellRangeAddress(0, 0, 0, exportDataInfo.getExportData().getColumnCount()));
92+
}
7793
}
7894
_fileExportService.progress(s_stringMgr.getString("DataExportExcelWriter.finishedLoading", NumberFormat.getInstance().format(rowsCount)));
7995

@@ -96,17 +112,23 @@ public long write(ExportDataInfoList exportDataInfoList) throws Exception
96112

97113
}
98114

99-
private long _writeExcelTab(IExportData data)
115+
private long _writeExcelTab(IExportData data, TableExportPreferences prefs)
100116
{
101117
if (_fileExportService.getPrefs().isWithHeaders())
102118
{
103-
Iterator<String> headers = data.getHeaders();
119+
_withHeader = true;
120+
121+
Iterator<String> headerColumns = data.getHeaderColumns();
122+
ExcelHeaderRowBuilder excelHeaderRowBuilder = new ExcelHeaderRowBuilder(prefs, _sheet, _workbook);
104123

105124
int colIdx = 0;
106-
while (headers.hasNext())
125+
while (headerColumns.hasNext())
107126
{
108-
String columnName = headers.next();
109-
addHeaderCell(colIdx, columnName);
127+
Row headerRow = excelHeaderRowBuilder.getHeaderRow();
128+
129+
Cell cell = headerRow.createCell(colIdx);
130+
cell.setCellValue(headerColumns.next());
131+
110132
colIdx++;
111133
}
112134
}
@@ -209,21 +231,21 @@ private void makeTemporalCell(Cell retVal, Date cellObj, String format)
209231
{
210232
CreationHelper creationHelper = _workbook.getCreationHelper();
211233
CellStyle cellStyle;
212-
if (formatCache == null)
234+
if (_formatCache == null)
213235
{
214236
cellStyle = _workbook.createCellStyle();
215237
cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat(format));
216-
formatCache = new HashMap<String, CellStyle>();
217-
formatCache.put(format, cellStyle);
238+
_formatCache = new HashMap<String, CellStyle>();
239+
_formatCache.put(format, cellStyle);
218240
}
219241
else
220242
{
221-
cellStyle = formatCache.get(format);
243+
cellStyle = _formatCache.get(format);
222244
if (cellStyle == null)
223245
{
224246
cellStyle = _workbook.createCellStyle();
225247
cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat(format));
226-
formatCache.put(format, cellStyle);
248+
_formatCache.put(format, cellStyle);
227249
}
228250
}
229251
retVal.setCellStyle(cellStyle);
@@ -267,18 +289,6 @@ private void beforeWorking()
267289
}
268290
}
269291

270-
private void addHeaderCell(int colIdx, String columnName)
271-
{
272-
this.withHeader = true;
273-
Row headerRow = _sheet.getRow(0);
274-
if (headerRow == null)
275-
{
276-
headerRow = _sheet.createRow(0);
277-
}
278-
Cell cell = headerRow.createCell(colIdx);
279-
cell.setCellValue(columnName);
280-
}
281-
282292
private void addCell(ExportCellData cell)
283293
{
284294
final Cell excelCell;
@@ -296,7 +306,7 @@ private void addCell(ExportCellData cell)
296306

297307
private int calculateRowIdx(ExportCellData cell)
298308
{
299-
if (this.withHeader)
309+
if (this._withHeader)
300310
{
301311
return cell.getRowIndex() + 1;
302312
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package net.sourceforge.squirrel_sql.fw.gui.action.fileexport;
2+
3+
import org.apache.poi.ss.usermodel.CellStyle;
4+
import org.apache.poi.ss.usermodel.Font;
5+
import org.apache.poi.ss.usermodel.Row;
6+
import org.apache.poi.ss.usermodel.Sheet;
7+
import org.apache.poi.ss.usermodel.Workbook;
8+
9+
public class ExcelHeaderRowBuilder
10+
{
11+
private Row _headerRow;
12+
13+
public ExcelHeaderRowBuilder(TableExportPreferences prefs, Sheet sheet, Workbook workbook)
14+
{
15+
_headerRow = sheet.getRow(0);
16+
if (_headerRow == null)
17+
{
18+
_headerRow = sheet.createRow(0);
19+
}
20+
21+
CellStyle cellStyle = null;
22+
if(prefs.isExcelFirstRowBold())
23+
{
24+
cellStyle = workbook.createCellStyle();
25+
26+
Font boldFont = workbook.createFont();
27+
boldFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
28+
cellStyle.setFont(boldFont);
29+
_headerRow.setRowStyle(cellStyle);
30+
}
31+
32+
if(prefs.isExcelFirstRowCentered())
33+
{
34+
if(null == cellStyle)
35+
{
36+
cellStyle = workbook.createCellStyle();
37+
}
38+
39+
cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
40+
_headerRow.setRowStyle(cellStyle);
41+
}
42+
}
43+
44+
public Row getHeaderRow()
45+
{
46+
return _headerRow;
47+
}
48+
}

sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/action/fileexport/ExportController.java

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@
77
import net.sourceforge.squirrel_sql.fw.util.StringUtilities;
88
import org.apache.commons.lang3.StringUtils;
99

10-
import javax.swing.*;
10+
import javax.swing.JFileChooser;
11+
import javax.swing.JOptionPane;
12+
import javax.swing.SwingUtilities;
1113
import javax.swing.event.DocumentEvent;
1214
import javax.swing.event.DocumentListener;
13-
import java.awt.*;
15+
import java.awt.Toolkit;
16+
import java.awt.Window;
1417
import java.awt.event.KeyAdapter;
1518
import java.awt.event.KeyEvent;
1619
import java.io.File;
@@ -153,6 +156,11 @@ private void onFormat(boolean replaceEnding)
153156

154157
_dlg.chkUseColoring.setEnabled(false);
155158
_dlg.btnUseColoringInfo.setEnabled(false);
159+
_dlg.chkExcelAutoFilter.setEnabled(false);
160+
_dlg.chkExcelFirstRowFrozen.setEnabled(false);
161+
_dlg.chkExcelFirstRowCentered.setEnabled(false);
162+
_dlg.chkExcelFirstRowBold.setEnabled(false);
163+
156164

157165

158166
if(_dlg.chkSeparatorTab.isSelected())
@@ -184,6 +192,11 @@ else if (_dlg.radFormatXLSX.isSelected() || _dlg.radFormatXLS.isSelected())
184192
_dlg.chkUseColoring.setEnabled(_dlg.radFormatXLSX.isSelected());
185193
_dlg.btnUseColoringInfo.setEnabled(_dlg.radFormatXLSX.isSelected());
186194

195+
_dlg.chkExcelAutoFilter.setEnabled(true);
196+
_dlg.chkExcelFirstRowFrozen.setEnabled(true);
197+
_dlg.chkExcelFirstRowCentered.setEnabled(_dlg.radFormatXLSX.isSelected());
198+
_dlg.chkExcelFirstRowBold.setEnabled(_dlg.radFormatXLSX.isSelected());
199+
187200

188201
if(replaceEnding)
189202
{
@@ -202,7 +215,10 @@ else if (_dlg.radFormatXML.isSelected() || _dlg.radFormatJSON.isSelected())
202215

203216
_dlg.chkUseColoring.setEnabled(false);
204217
_dlg.btnUseColoringInfo.setEnabled(false);
205-
218+
_dlg.chkExcelAutoFilter.setEnabled(false);
219+
_dlg.chkExcelFirstRowFrozen.setEnabled(false);
220+
_dlg.chkExcelFirstRowCentered.setEnabled(false);
221+
_dlg.chkExcelFirstRowBold.setEnabled(false);
206222

207223
if(replaceEnding)
208224
{
@@ -432,40 +448,29 @@ private boolean warnIfExcel()
432448

433449
private void writeControlsToPrefs(TableExportPreferences prefs)
434450
{
435-
// Preferences.put(PREF_KEY_CSV_FILE, );
436451
prefs.setFile(_cboFileHandler.getItem());
437452
_cboFileHandler.saveCurrentItem();
438453

439-
//Preferences.put(PREF_KEY_CSV_ENCODING, _dlg.charsets.getSelectedItem().toString());
440454
prefs.setEncoding(_dlg.cboCharsets.getSelectedItem().toString());
441-
442-
//Preferences.putBoolean(PREF_KEY_WITH_HEADERS, _dlg.chkWithHeaders.isSelected());
443455
prefs.setWithHeaders(_dlg.chkWithHeaders.isSelected());
444-
445-
//Preferences.putBoolean(PREF_KEY_FORMAT_CSV, _dlg.radFormatCSV.isSelected());
446456
prefs.setFormatCSV(_dlg.radFormatCSV.isSelected());
447457

448-
//Preferences.putBoolean(PREF_KEY_FORMAT_XLS, _dlg.radFormatXLSX.isSelected());
449458
prefs.setFormatXLS(_dlg.radFormatXLSX.isSelected());
450-
451459
prefs.setUseColoring(_dlg.chkUseColoring.isSelected());
452-
453-
//Preferences.putBoolean(PREF_KEY_FORMAT_XLS_OLD, _dlg.radFormatXLS.isSelected());
454460
prefs.setFormatXLSOld(_dlg.radFormatXLS.isSelected());
461+
prefs.setExcelAutoFilter(_dlg.chkExcelAutoFilter.isSelected());
462+
prefs.setExcelFirstRowFrozen(_dlg.chkExcelFirstRowFrozen.isSelected());
463+
prefs.setExcelFirstRowCentered(_dlg.chkExcelFirstRowCentered.isSelected());
464+
prefs.setExcelFirstRowBold(_dlg.chkExcelFirstRowBold.isSelected());
455465

456-
//Preferences.putBoolean(PREF_KEY_FORMAT_XML, _dlg.radFormatXML.isSelected());
457-
prefs.setFormatXML(_dlg.radFormatXML.isSelected());
458466

459-
//Preferences.putBoolean(PREF_KEY_FORMAT_XML, _dlg.radFormatXML.isSelected());
467+
prefs.setFormatXML(_dlg.radFormatXML.isSelected());
460468
prefs.setFormatJSON(_dlg.radFormatJSON.isSelected());
461469

462-
//Preferences.putBoolean(PREF_KEY_SEPERATOR_TAB, _dlg.chkSeparatorTab.isSelected());
463470
prefs.setSeperatorTab(_dlg.chkSeparatorTab.isSelected());
464471

465-
//Preferences.put(PREF_KEY_SEPERATOR_CHAR, _dlg.txtSeparatorChar.getText());
466472
prefs.setSeperatorChar(_dlg.txtSeparatorChar.getText());
467473

468-
//Preferences.put(PREF_KEY_LINE_SEPERATOR, ((LineSeparator)_dlg._lineSeparators.getSelectedItem()).name());
469474
prefs.setLineSeperator(((LineSeparator)_dlg.cboLineSeparators.getSelectedItem()).name());
470475

471476
_exportSelectionPanelController.writeControlsToPrefs(prefs);
@@ -492,6 +497,10 @@ private void initData()
492497
_cboFileHandler.addOrReplaceCurrentItem(prefs.getFile());
493498
}
494499
_dlg.chkUseColoring.setSelected(prefs.isUseColoring());
500+
_dlg.chkExcelAutoFilter.setSelected(prefs.isExcelAutoFilter());
501+
_dlg.chkExcelFirstRowFrozen.setSelected(prefs.isExcelFirstRowFrozen());
502+
_dlg.chkExcelFirstRowCentered.setSelected(prefs.isExcelFirstRowCentered());
503+
_dlg.chkExcelFirstRowBold.setSelected(prefs.isExcelFirstRowBold());
495504

496505
_dlg.cboCharsets.setSelectedItem(prefs.getEncoding());
497506
_dlg.chkWithHeaders.setSelected(prefs.isWithHeaders());
@@ -556,7 +565,7 @@ else if(prefs.isFormatJSON())
556565

557566
private boolean formatIsNewXlsx(TableExportPreferences preferences)
558567
{
559-
return preferences.isFormatXLS();
568+
return preferences.isFormatXLS(); // instead of preferences.isFormatXLSOld();
560569
}
561570

562571
private String replaceXlsByXlsx(String fileName)

0 commit comments

Comments
 (0)