IDEMPIERE-2924: Adding XLSX Export support (#6)
This commit is contained in:
parent
9ec91aa1d9
commit
503ca8eb62
|
@ -0,0 +1,11 @@
|
||||||
|
SET SQLBLANKLINES ON
|
||||||
|
SET DEFINE OFF
|
||||||
|
|
||||||
|
-- Excel 2007 support in idempiere
|
||||||
|
-- Apr 12, 2018 3:12:17 PM IST
|
||||||
|
INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','xlsx - Excel file',0,0,'Y',TO_DATE('2018-04-12 15:12:16','YYYY-MM-DD HH24:MI:SS'),100,TO_DATE('2018-04-12 15:12:16','YYYY-MM-DD HH24:MI:SS'),100,200451,'FileXLSX','D','48cc5032-f2c7-4b27-99bc-05c6269d032b')
|
||||||
|
;
|
||||||
|
|
||||||
|
SELECT register_migration_script('201804121850_Extend_Export_Feature.sql') FROM dual
|
||||||
|
;
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
-- Excel 2007 support in idempiere
|
||||||
|
-- Apr 12, 2018 3:12:17 PM IST
|
||||||
|
INSERT INTO AD_Message (MsgType,MsgText,AD_Client_ID,AD_Org_ID,IsActive,Created,CreatedBy,Updated,UpdatedBy,AD_Message_ID,Value,EntityType,AD_Message_UU) VALUES ('E','xlsx - Excel file',0,0,'Y',TO_TIMESTAMP('2018-04-12 15:12:16','YYYY-MM-DD HH24:MI:SS'),100,TO_TIMESTAMP('2018-04-12 15:12:16','YYYY-MM-DD HH24:MI:SS'),100,200451,'FileXLSX','D','48cc5032-f2c7-4b27-99bc-05c6269d032b')
|
||||||
|
;
|
||||||
|
|
||||||
|
SELECT register_migration_script('201804121850_Extend_Export_Feature.sql') FROM dual
|
||||||
|
;
|
||||||
|
|
|
@ -517,4 +517,11 @@
|
||||||
version="0.0.0"
|
version="0.0.0"
|
||||||
unpack="false"/>
|
unpack="false"/>
|
||||||
|
|
||||||
|
<plugin
|
||||||
|
id="org.apache.poi.poi-ooxml"
|
||||||
|
download-size="0"
|
||||||
|
install-size="0"
|
||||||
|
version="0.0.0"
|
||||||
|
unpack="false"/>
|
||||||
|
|
||||||
</feature>
|
</feature>
|
||||||
|
|
|
@ -140,4 +140,13 @@
|
||||||
</run>
|
</run>
|
||||||
</application>
|
</application>
|
||||||
</extension>
|
</extension>
|
||||||
|
<extension
|
||||||
|
id="org.adempiere.impexp.GridTabXLSXExporter"
|
||||||
|
name="Grid data excel exporter"
|
||||||
|
point="org.adempiere.base.IGridTabExporter">
|
||||||
|
<exporter
|
||||||
|
class="org.adempiere.impexp.GridTabXLSXExporter"
|
||||||
|
priority="0">
|
||||||
|
</exporter>
|
||||||
|
</extension>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
|
|
@ -0,0 +1,570 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* Copyright (C) 2018 Logilite Technologies LLP *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms version 2 of the GNU General Public License as published *
|
||||||
|
* by the Free Software Foundation. This program is distributed in the hope *
|
||||||
|
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
|
||||||
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
||||||
|
* See the GNU General Public License for more details. *
|
||||||
|
* You should have received a copy of the GNU General Public License along *
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||||
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
||||||
|
*****************************************************************************/
|
||||||
|
package org.adempiere.impexp;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
import java.text.DecimalFormat;
|
||||||
|
import java.text.NumberFormat;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFHeader;
|
||||||
|
import org.apache.poi.ss.usermodel.BorderStyle;
|
||||||
|
import org.apache.poi.ss.usermodel.Footer;
|
||||||
|
import org.apache.poi.ss.usermodel.Header;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFCell;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFFont;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFPrintSetup;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFRow;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
|
import org.compiere.util.CLogger;
|
||||||
|
import org.compiere.util.DisplayType;
|
||||||
|
import org.compiere.util.Env;
|
||||||
|
import org.compiere.util.Ini;
|
||||||
|
import org.compiere.util.Language;
|
||||||
|
import org.compiere.util.Msg;
|
||||||
|
import org.compiere.util.Util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract MS Excel Format (xlsx) Exporter
|
||||||
|
*
|
||||||
|
* @author Deepak Pansheriya
|
||||||
|
*/
|
||||||
|
public abstract class AbstractXLSXExporter
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Is the current Row a Function Row
|
||||||
|
*
|
||||||
|
* @return true if function row
|
||||||
|
*/
|
||||||
|
public abstract boolean isFunctionRow();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Columns Count
|
||||||
|
*
|
||||||
|
* @return number of columns
|
||||||
|
*/
|
||||||
|
public abstract int getColumnCount();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Rows Count
|
||||||
|
*
|
||||||
|
* @return number of rows
|
||||||
|
*/
|
||||||
|
public abstract int getRowCount();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set current row
|
||||||
|
*
|
||||||
|
* @param row row index
|
||||||
|
*/
|
||||||
|
protected abstract void setCurrentRow(int row);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return current row index
|
||||||
|
*/
|
||||||
|
protected abstract int getCurrentRow();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if column is printed (displayed)
|
||||||
|
*
|
||||||
|
* @param col column index
|
||||||
|
* @return true if is visible
|
||||||
|
*/
|
||||||
|
public abstract boolean isColumnPrinted(int col);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get column header name
|
||||||
|
*
|
||||||
|
* @param col column index
|
||||||
|
* @return header name
|
||||||
|
*/
|
||||||
|
public abstract String getHeaderName(int col);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get cell display type (see {@link DisplayType})
|
||||||
|
*
|
||||||
|
* @param row row index
|
||||||
|
* @param col column index
|
||||||
|
* @return display type
|
||||||
|
*/
|
||||||
|
public abstract int getDisplayType(int row, int col);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get cell value
|
||||||
|
*
|
||||||
|
* @param row row index
|
||||||
|
* @param col column index
|
||||||
|
* @return cell value
|
||||||
|
*/
|
||||||
|
public abstract Object getValueAt(int row, int col);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if there is a page break on given cell
|
||||||
|
*
|
||||||
|
* @param row row index
|
||||||
|
* @param col column index
|
||||||
|
* @return true if there is a page break
|
||||||
|
*/
|
||||||
|
public abstract boolean isPageBreak(int row, int col);
|
||||||
|
|
||||||
|
/** Logger */
|
||||||
|
protected final CLogger log = CLogger.getCLogger(getClass());
|
||||||
|
//
|
||||||
|
private XSSFWorkbook m_workbook;
|
||||||
|
private XSSFDataFormat m_dataFormat;
|
||||||
|
private XSSFFont m_fontHeader = null;
|
||||||
|
private XSSFFont m_fontDefault = null;
|
||||||
|
private Language m_lang = null;
|
||||||
|
private int m_sheetCount = 0;
|
||||||
|
//
|
||||||
|
private int m_colSplit = 1;
|
||||||
|
private int m_rowSplit = 1;
|
||||||
|
private boolean currentRowOnly = false;
|
||||||
|
/** Styles cache */
|
||||||
|
private HashMap<String, XSSFCellStyle> m_styles = new HashMap<String, XSSFCellStyle>();
|
||||||
|
|
||||||
|
protected Boolean[] colSuppressRepeats;
|
||||||
|
|
||||||
|
public AbstractXLSXExporter()
|
||||||
|
{
|
||||||
|
m_workbook = new XSSFWorkbook();
|
||||||
|
m_dataFormat = m_workbook.createDataFormat();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Properties getCtx()
|
||||||
|
{
|
||||||
|
return Env.getCtx();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setFreezePane(int colSplit, int rowSplit)
|
||||||
|
{
|
||||||
|
m_colSplit = colSplit;
|
||||||
|
m_rowSplit = rowSplit;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String fixString(String str)
|
||||||
|
{
|
||||||
|
// ms excel doesn't support UTF8 charset
|
||||||
|
return Util.stripDiacritics(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Language getLanguage()
|
||||||
|
{
|
||||||
|
if (m_lang == null)
|
||||||
|
m_lang = Env.getLanguage(getCtx());
|
||||||
|
return m_lang;
|
||||||
|
}
|
||||||
|
|
||||||
|
private XSSFFont getFont(boolean isHeader)
|
||||||
|
{
|
||||||
|
XSSFFont font = null;
|
||||||
|
if (isHeader)
|
||||||
|
{
|
||||||
|
if (m_fontHeader == null)
|
||||||
|
{
|
||||||
|
m_fontHeader = m_workbook.createFont();
|
||||||
|
m_fontHeader.setBold(true);
|
||||||
|
}
|
||||||
|
font = m_fontHeader;
|
||||||
|
}
|
||||||
|
else if (isFunctionRow())
|
||||||
|
{
|
||||||
|
font = m_workbook.createFont();
|
||||||
|
font.setBold(true);
|
||||||
|
font.setItalic(true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (m_fontDefault == null)
|
||||||
|
{
|
||||||
|
m_fontDefault = m_workbook.createFont();
|
||||||
|
}
|
||||||
|
font = m_fontDefault;
|
||||||
|
}
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get Excel number format string by given {@link NumberFormat}
|
||||||
|
*
|
||||||
|
* @param df number format
|
||||||
|
* @param isHighlightNegativeNumbers highlight negative numbers using RED
|
||||||
|
* color
|
||||||
|
* @return number excel format string
|
||||||
|
*/
|
||||||
|
private String getFormatString(NumberFormat df, boolean isHighlightNegativeNumbers)
|
||||||
|
{
|
||||||
|
StringBuffer format = new StringBuffer();
|
||||||
|
int integerDigitsMin = df.getMinimumIntegerDigits();
|
||||||
|
int integerDigitsMax = df.getMaximumIntegerDigits();
|
||||||
|
for (int i = 0; i < integerDigitsMax; i++)
|
||||||
|
{
|
||||||
|
if (i < integerDigitsMin)
|
||||||
|
format.insert(0, "0");
|
||||||
|
else
|
||||||
|
format.insert(0, "#");
|
||||||
|
if (i == 2)
|
||||||
|
{
|
||||||
|
format.insert(0, ",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int fractionDigitsMin = df.getMinimumFractionDigits();
|
||||||
|
int fractionDigitsMax = df.getMaximumFractionDigits();
|
||||||
|
for (int i = 0; i < fractionDigitsMax; i++)
|
||||||
|
{
|
||||||
|
if (i == 0)
|
||||||
|
format.append(".");
|
||||||
|
if (i < fractionDigitsMin)
|
||||||
|
format.append("0");
|
||||||
|
else
|
||||||
|
format.append("#");
|
||||||
|
}
|
||||||
|
if (isHighlightNegativeNumbers)
|
||||||
|
{
|
||||||
|
String f = format.toString();
|
||||||
|
format = new StringBuffer(f).append(";[RED]-").append(f);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
if (log.isLoggable(Level.FINEST))
|
||||||
|
log.finest("NumberFormat: " + format);
|
||||||
|
return format.toString();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private XSSFCellStyle getStyle(int row, int col)
|
||||||
|
{
|
||||||
|
int displayType = getDisplayType(row, col);
|
||||||
|
String key = "cell-" + col + "-" + displayType;
|
||||||
|
XSSFCellStyle cs = m_styles.get(key);
|
||||||
|
if (cs == null)
|
||||||
|
{
|
||||||
|
boolean isHighlightNegativeNumbers = true;
|
||||||
|
cs = m_workbook.createCellStyle();
|
||||||
|
XSSFFont font = getFont(false);
|
||||||
|
cs.setFont(font);
|
||||||
|
// Border
|
||||||
|
cs.setBorderLeft(BorderStyle.THIN);
|
||||||
|
cs.setBorderTop(BorderStyle.THIN);
|
||||||
|
cs.setBorderRight(BorderStyle.THIN);
|
||||||
|
cs.setBorderBottom(BorderStyle.THIN);
|
||||||
|
//
|
||||||
|
if (DisplayType.isDate(displayType))
|
||||||
|
{
|
||||||
|
cs.setDataFormat(m_dataFormat.getFormat(DisplayType.getDateFormat(getLanguage()).toPattern()));
|
||||||
|
}
|
||||||
|
else if (DisplayType.isNumeric(displayType))
|
||||||
|
{
|
||||||
|
DecimalFormat df = DisplayType.getNumberFormat(displayType, getLanguage());
|
||||||
|
String format = getFormatString(df, isHighlightNegativeNumbers);
|
||||||
|
cs.setDataFormat(m_dataFormat.getFormat(format));
|
||||||
|
}
|
||||||
|
m_styles.put(key, cs);
|
||||||
|
}
|
||||||
|
return cs;
|
||||||
|
}
|
||||||
|
|
||||||
|
private XSSFCellStyle getHeaderStyle(int col)
|
||||||
|
{
|
||||||
|
String key = "header-" + col;
|
||||||
|
XSSFCellStyle cs_header = m_styles.get(key);
|
||||||
|
if (cs_header == null)
|
||||||
|
{
|
||||||
|
XSSFFont font_header = getFont(true);
|
||||||
|
cs_header = m_workbook.createCellStyle();
|
||||||
|
cs_header.setFont(font_header);
|
||||||
|
cs_header.setBorderLeft(BorderStyle.MEDIUM);
|
||||||
|
cs_header.setBorderTop(BorderStyle.MEDIUM);
|
||||||
|
cs_header.setBorderRight(BorderStyle.MEDIUM);
|
||||||
|
cs_header.setBorderBottom(BorderStyle.MEDIUM);
|
||||||
|
cs_header.setDataFormat(HSSFDataFormat.getBuiltinFormat("text"));
|
||||||
|
cs_header.setWrapText(true);
|
||||||
|
m_styles.put(key, cs_header);
|
||||||
|
}
|
||||||
|
return cs_header;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fixColumnWidth(XSSFSheet sheet, int lastColumnIndex)
|
||||||
|
{
|
||||||
|
for (short colnum = 0; colnum < lastColumnIndex; colnum++)
|
||||||
|
{
|
||||||
|
sheet.autoSizeColumn(colnum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void closeTableSheet(XSSFSheet prevSheet, String prevSheetName, int colCount)
|
||||||
|
{
|
||||||
|
if (prevSheet == null)
|
||||||
|
return;
|
||||||
|
//
|
||||||
|
fixColumnWidth(prevSheet, colCount);
|
||||||
|
if (m_colSplit >= 0 || m_rowSplit >= 0)
|
||||||
|
prevSheet.createFreezePane(m_colSplit >= 0 ? m_colSplit : 0, m_rowSplit >= 0 ? m_rowSplit : 0);
|
||||||
|
if (!Util.isEmpty(prevSheetName, true) && m_sheetCount > 0)
|
||||||
|
{
|
||||||
|
int prevSheetIndex = m_sheetCount - 1;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
m_workbook.setSheetName(prevSheetIndex, prevSheetName);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
log.log(Level.WARNING, "Error setting sheet " + prevSheetIndex + " name to " + prevSheetName, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private XSSFSheet createTableSheet()
|
||||||
|
{
|
||||||
|
XSSFSheet sheet = m_workbook.createSheet();
|
||||||
|
formatPage(sheet);
|
||||||
|
createHeaderFooter(sheet);
|
||||||
|
createTableHeader(sheet);
|
||||||
|
m_sheetCount++;
|
||||||
|
//
|
||||||
|
return sheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createTableHeader(XSSFSheet sheet)
|
||||||
|
{
|
||||||
|
int colnumMax = 0;
|
||||||
|
|
||||||
|
XSSFRow row = sheet.createRow(0);
|
||||||
|
// for all columns
|
||||||
|
int colnum = 0;
|
||||||
|
for (int col = 0; col < getColumnCount(); col++)
|
||||||
|
{
|
||||||
|
if (colnum > colnumMax)
|
||||||
|
colnumMax = colnum;
|
||||||
|
//
|
||||||
|
if (isColumnPrinted(col))
|
||||||
|
{
|
||||||
|
XSSFCell cell = row.createCell(colnum);
|
||||||
|
// header row
|
||||||
|
XSSFCellStyle style = getHeaderStyle(col);
|
||||||
|
cell.setCellStyle(style);
|
||||||
|
String str = fixString(getHeaderName(col));
|
||||||
|
cell.setCellValue(new XSSFRichTextString(str));
|
||||||
|
colnum++;
|
||||||
|
} // printed
|
||||||
|
} // for all columns
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void createHeaderFooter(XSSFSheet sheet)
|
||||||
|
{
|
||||||
|
// Sheet Header
|
||||||
|
Header header = sheet.getHeader();
|
||||||
|
header.setRight(HSSFHeader.page() + " / " + HSSFHeader.numPages());
|
||||||
|
// Sheet Footer
|
||||||
|
Footer footer = sheet.getFooter();
|
||||||
|
footer.setLeft(Env.getStandardReportFooterTrademarkText());
|
||||||
|
footer.setCenter(Env.getHeader(getCtx(), 0));
|
||||||
|
Timestamp now = new Timestamp(System.currentTimeMillis());
|
||||||
|
footer.setRight(DisplayType.getDateFormat(DisplayType.DateTime, getLanguage()).format(now));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void formatPage(XSSFSheet sheet)
|
||||||
|
{
|
||||||
|
sheet.setFitToPage(true);
|
||||||
|
// Print Setup
|
||||||
|
XSSFPrintSetup ps = sheet.getPrintSetup();
|
||||||
|
ps.setFitWidth((short) 1);
|
||||||
|
ps.setNoColor(true);
|
||||||
|
ps.setPaperSize(XSSFPrintSetup.A4_PAPERSIZE);
|
||||||
|
ps.setLandscape(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean isCurrentRowOnly()
|
||||||
|
{
|
||||||
|
return currentRowOnly;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setCurrentRowOnly(boolean b)
|
||||||
|
{
|
||||||
|
currentRowOnly = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export to given stream
|
||||||
|
*
|
||||||
|
* @param out
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
private void export(OutputStream out) throws Exception
|
||||||
|
{
|
||||||
|
XSSFSheet sheet = createTableSheet();
|
||||||
|
String sheetName = null;
|
||||||
|
//
|
||||||
|
int colnumMax = 0;
|
||||||
|
int rownum = isCurrentRowOnly() ? getCurrentRow() : 0;
|
||||||
|
int lastRowNum = isCurrentRowOnly() ? getCurrentRow() + 1 : getRowCount();
|
||||||
|
Object[] preValues = null;
|
||||||
|
int printColIndex = -1;
|
||||||
|
if (colSuppressRepeats != null)
|
||||||
|
{
|
||||||
|
preValues = new Object[colSuppressRepeats.length];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int xls_rownum = 1; rownum < lastRowNum; rownum++, xls_rownum++)
|
||||||
|
{
|
||||||
|
if (!isCurrentRowOnly())
|
||||||
|
setCurrentRow(rownum);
|
||||||
|
|
||||||
|
boolean isPageBreak = false;
|
||||||
|
XSSFRow row = sheet.createRow(xls_rownum);
|
||||||
|
printColIndex = -1;
|
||||||
|
// for all columns
|
||||||
|
int colnum = 0;
|
||||||
|
for (int col = 0; col < getColumnCount(); col++)
|
||||||
|
{
|
||||||
|
if (colnum > colnumMax)
|
||||||
|
colnumMax = colnum;
|
||||||
|
//
|
||||||
|
if (isColumnPrinted(col))
|
||||||
|
{
|
||||||
|
printColIndex++;
|
||||||
|
XSSFCell cell = row.createCell(colnum);
|
||||||
|
|
||||||
|
// line row
|
||||||
|
Object obj = getValueAt(rownum, col);
|
||||||
|
int displayType = getDisplayType(rownum, col);
|
||||||
|
if (obj == null)
|
||||||
|
{
|
||||||
|
if (colSuppressRepeats != null && colSuppressRepeats[printColIndex])
|
||||||
|
{
|
||||||
|
preValues[printColIndex] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (colSuppressRepeats != null && colSuppressRepeats[printColIndex]
|
||||||
|
&& obj.equals(preValues[printColIndex]))
|
||||||
|
{
|
||||||
|
// suppress
|
||||||
|
}
|
||||||
|
else if (DisplayType.isDate(displayType))
|
||||||
|
{
|
||||||
|
Timestamp value = (Timestamp) obj;
|
||||||
|
cell.setCellValue(value);
|
||||||
|
}
|
||||||
|
else if (DisplayType.isNumeric(displayType))
|
||||||
|
{
|
||||||
|
double value = 0;
|
||||||
|
if (obj instanceof Number)
|
||||||
|
{
|
||||||
|
value = ((Number) obj).doubleValue();
|
||||||
|
}
|
||||||
|
cell.setCellValue(value);
|
||||||
|
}
|
||||||
|
else if (DisplayType.YesNo == displayType)
|
||||||
|
{
|
||||||
|
boolean value = false;
|
||||||
|
if (obj instanceof Boolean)
|
||||||
|
value = (Boolean) obj;
|
||||||
|
else
|
||||||
|
value = "Y".equals(obj);
|
||||||
|
cell.setCellValue(new XSSFRichTextString(Msg.getMsg(getLanguage(), value == true ? "Y" : "N")));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
String value = fixString(obj.toString()); // formatted
|
||||||
|
cell.setCellValue(new XSSFRichTextString(value));
|
||||||
|
}
|
||||||
|
//
|
||||||
|
XSSFCellStyle style = getStyle(rownum, col);
|
||||||
|
cell.setCellStyle(style);
|
||||||
|
// Page break
|
||||||
|
if (isPageBreak(rownum, col))
|
||||||
|
{
|
||||||
|
isPageBreak = true;
|
||||||
|
sheetName = fixString(cell.getRichStringCellValue().getString());
|
||||||
|
}
|
||||||
|
//
|
||||||
|
colnum++;
|
||||||
|
if (colSuppressRepeats != null)
|
||||||
|
preValues[printColIndex] = obj;
|
||||||
|
} // printed
|
||||||
|
} // for all columns
|
||||||
|
//
|
||||||
|
// Page Break
|
||||||
|
if (isPageBreak)
|
||||||
|
{
|
||||||
|
closeTableSheet(sheet, sheetName, colnumMax);
|
||||||
|
sheet = createTableSheet();
|
||||||
|
xls_rownum = 0;
|
||||||
|
isPageBreak = false;
|
||||||
|
}
|
||||||
|
} // for all rows
|
||||||
|
closeTableSheet(sheet, sheetName, colnumMax);
|
||||||
|
//
|
||||||
|
|
||||||
|
if (out != null)
|
||||||
|
{
|
||||||
|
m_workbook.write(out);
|
||||||
|
out.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Workbook Info
|
||||||
|
if (log.isLoggable(Level.FINE))
|
||||||
|
{
|
||||||
|
log.fine("Sheets #" + m_sheetCount);
|
||||||
|
log.fine("Styles used #" + m_styles.size());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export to file
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @param language reporting language
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void export(File file, Language language) throws Exception
|
||||||
|
{
|
||||||
|
export(file, language, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export to file
|
||||||
|
*
|
||||||
|
* @param file
|
||||||
|
* @param language reporting language
|
||||||
|
* @param autoOpen auto open file after generated
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void export(File file, Language language, boolean autoOpen) throws Exception
|
||||||
|
{
|
||||||
|
m_lang = language;
|
||||||
|
if (file == null)
|
||||||
|
file = File.createTempFile("Report_", ".xlsx");
|
||||||
|
FileOutputStream out = new FileOutputStream(file);
|
||||||
|
export(out);
|
||||||
|
if (autoOpen && Ini.isClient())
|
||||||
|
Env.startBrowser(file.toURI().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void exportToWorkbook(XSSFWorkbook workbook, Language language) throws Exception
|
||||||
|
{
|
||||||
|
m_lang = language;
|
||||||
|
m_workbook = workbook;
|
||||||
|
export(null);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,202 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* Copyright (C) 2018 Logilite Technologies LLP *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms version 2 of the GNU General Public License as published *
|
||||||
|
* by the Free Software Foundation. This program is distributed in the hope *
|
||||||
|
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
|
||||||
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
||||||
|
* See the GNU General Public License for more details. *
|
||||||
|
* You should have received a copy of the GNU General Public License along *
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||||
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
||||||
|
*****************************************************************************/
|
||||||
|
package org.adempiere.impexp;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.adempiere.base.IGridTabExporter;
|
||||||
|
import org.adempiere.exceptions.AdempiereException;
|
||||||
|
import org.compiere.model.GridField;
|
||||||
|
import org.compiere.model.GridTab;
|
||||||
|
import org.compiere.model.Lookup;
|
||||||
|
import org.compiere.model.MLookup;
|
||||||
|
import org.compiere.model.MLookupFactory;
|
||||||
|
import org.compiere.util.DisplayType;
|
||||||
|
import org.compiere.util.Env;
|
||||||
|
import org.compiere.util.Msg;
|
||||||
|
import org.compiere.util.Util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Excel Exporter Adapter for GridTab
|
||||||
|
*
|
||||||
|
* @author Deepak Pansheriya
|
||||||
|
*/
|
||||||
|
public class GridTabXLSXExporter extends AbstractXLSXExporter implements IGridTabExporter
|
||||||
|
{
|
||||||
|
private GridTab m_tab = null;
|
||||||
|
|
||||||
|
public GridTabXLSXExporter()
|
||||||
|
{
|
||||||
|
setFreezePane(0, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getColumnCount()
|
||||||
|
{
|
||||||
|
return m_tab.getFieldCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDisplayType(int row, int col)
|
||||||
|
{
|
||||||
|
return m_tab.getField(col).getDisplayType();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getHeaderName(int col)
|
||||||
|
{
|
||||||
|
return m_tab.getField(col).getHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getRowCount()
|
||||||
|
{
|
||||||
|
return m_tab.getRowCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getValueAt(int row, int col)
|
||||||
|
{
|
||||||
|
GridField f = m_tab.getField(col);
|
||||||
|
Object key = m_tab.getValue(row, f.getColumnName());
|
||||||
|
Object value = key;
|
||||||
|
Lookup lookup = f.getLookup();
|
||||||
|
if (lookup != null)
|
||||||
|
{
|
||||||
|
;
|
||||||
|
}
|
||||||
|
else if (f.getDisplayType() == DisplayType.Button)
|
||||||
|
{
|
||||||
|
lookup = getButtonLookup(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lookup != null)
|
||||||
|
{
|
||||||
|
value = lookup.getDisplay(key);
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isColumnPrinted(int col)
|
||||||
|
{
|
||||||
|
GridField f = m_tab.getField(col);
|
||||||
|
// Hide not displayed fields
|
||||||
|
if (!f.isDisplayed())
|
||||||
|
return false;
|
||||||
|
// Hide encrypted fields
|
||||||
|
if (f.isEncrypted())
|
||||||
|
return false;
|
||||||
|
// Hide simple button fields without a value
|
||||||
|
if (f.getDisplayType() == DisplayType.Button && f.getAD_Reference_Value_ID() == 0)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isFunctionRow()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPageBreak(int row, int col)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setCurrentRow(int row)
|
||||||
|
{
|
||||||
|
; // nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getCurrentRow()
|
||||||
|
{
|
||||||
|
return m_tab.getCurrentRow();
|
||||||
|
}
|
||||||
|
|
||||||
|
private HashMap<String, MLookup> m_buttonLookups = new HashMap<String, MLookup>();
|
||||||
|
|
||||||
|
private MLookup getButtonLookup(GridField mField)
|
||||||
|
{
|
||||||
|
MLookup lookup = m_buttonLookups.get(mField.getColumnName());
|
||||||
|
if (lookup != null)
|
||||||
|
return lookup;
|
||||||
|
// TODO: refactor with org.compiere.grid.ed.VButton.setField(GridField)
|
||||||
|
if (mField.getColumnName().endsWith("_ID") && !mField.getColumnName().equals("Record_ID"))
|
||||||
|
{
|
||||||
|
lookup = MLookupFactory.get(Env.getCtx(), mField.getWindowNo(), 0, mField.getAD_Column_ID(),
|
||||||
|
DisplayType.Search);
|
||||||
|
}
|
||||||
|
else if (mField.getAD_Reference_Value_ID() != 0)
|
||||||
|
{
|
||||||
|
// Assuming List
|
||||||
|
lookup = MLookupFactory.get(Env.getCtx(), mField.getWindowNo(), 0, mField.getAD_Column_ID(),
|
||||||
|
DisplayType.List);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
m_buttonLookups.put(mField.getColumnName(), lookup);
|
||||||
|
return lookup;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void export(GridTab gridTab, List<GridTab> childs, boolean currentRowOnly, File file, int indxDetailSelected)
|
||||||
|
{
|
||||||
|
m_tab = gridTab;
|
||||||
|
setCurrentRowOnly(currentRowOnly);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
export(file, null);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new AdempiereException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFileExtension()
|
||||||
|
{
|
||||||
|
return "xlsx";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getFileExtensionLabel()
|
||||||
|
{
|
||||||
|
return Msg.getMsg(Env.getCtx(), "FileXLSX");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getContentType()
|
||||||
|
{
|
||||||
|
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSuggestedFileName(GridTab gridTab)
|
||||||
|
{
|
||||||
|
return gridTab.getName() + "." + getFileExtension();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc} no detail tab is support to export with excel
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean isExportableTab(GridTab gridTab)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,216 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* Copyright (C) 2018 Logilite Technologies LLP *
|
||||||
|
* This program is free software; you can redistribute it and/or modify it *
|
||||||
|
* under the terms version 2 of the GNU General Public License as published *
|
||||||
|
* by the Free Software Foundation. This program is distributed in the hope *
|
||||||
|
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
|
||||||
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
|
||||||
|
* See the GNU General Public License for more details. *
|
||||||
|
* You should have received a copy of the GNU General Public License along *
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc., *
|
||||||
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. *
|
||||||
|
*****************************************************************************/
|
||||||
|
package org.adempiere.print.export;
|
||||||
|
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import javax.print.attribute.standard.MediaSizeName;
|
||||||
|
|
||||||
|
import org.adempiere.impexp.AbstractXLSXExporter;
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFPrintSetup;
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFSheet;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
|
import org.compiere.print.MPrintFormat;
|
||||||
|
import org.compiere.print.MPrintFormatItem;
|
||||||
|
import org.compiere.print.MPrintPaper;
|
||||||
|
import org.compiere.print.PrintData;
|
||||||
|
import org.compiere.print.PrintDataElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Export PrintData to Excel (XLSX) file
|
||||||
|
*
|
||||||
|
* @author Deepak Pansheriya
|
||||||
|
*/
|
||||||
|
public class PrintDataXLSXExporter extends AbstractXLSXExporter
|
||||||
|
{
|
||||||
|
private PrintData m_printData;
|
||||||
|
private MPrintFormat m_printFormat;
|
||||||
|
|
||||||
|
public PrintDataXLSXExporter(PrintData printData, MPrintFormat printFormat, Boolean[] colSuppressRepeats)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
this.m_printData = printData;
|
||||||
|
this.m_printFormat = printFormat;
|
||||||
|
this.colSuppressRepeats = colSuppressRepeats;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getColumnCount()
|
||||||
|
{
|
||||||
|
return m_printFormat.getItemCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
private PrintDataElement getPDE(int row, int col)
|
||||||
|
{
|
||||||
|
if (m_printData.getRowIndex() != row)
|
||||||
|
m_printData.setRowIndex(row);
|
||||||
|
//
|
||||||
|
MPrintFormatItem item = m_printFormat.getItem(col);
|
||||||
|
int AD_Column_ID = item.getAD_Column_ID();
|
||||||
|
Object obj = null;
|
||||||
|
if (AD_Column_ID > 0)
|
||||||
|
obj = m_printData.getNode(Integer.valueOf(AD_Column_ID));
|
||||||
|
if (obj != null && obj instanceof PrintDataElement)
|
||||||
|
{
|
||||||
|
return (PrintDataElement) obj;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getDisplayType(int row, int col)
|
||||||
|
{
|
||||||
|
PrintDataElement pde = getPDE(row, col);
|
||||||
|
if (pde != null)
|
||||||
|
{
|
||||||
|
return pde.getDisplayType();
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getValueAt(int row, int col)
|
||||||
|
{
|
||||||
|
PrintDataElement pde = getPDE(row, col);
|
||||||
|
Object value = null;
|
||||||
|
if (pde == null)
|
||||||
|
;
|
||||||
|
else if (pde.isDate())
|
||||||
|
{
|
||||||
|
Object o = pde.getValue();
|
||||||
|
if (o instanceof Date)
|
||||||
|
value = new Timestamp(((Date) o).getTime());
|
||||||
|
else
|
||||||
|
value = (Timestamp) pde.getValue();
|
||||||
|
}
|
||||||
|
else if (pde.isNumeric())
|
||||||
|
{
|
||||||
|
Object o = pde.getValue();
|
||||||
|
if (o instanceof Number)
|
||||||
|
{
|
||||||
|
value = ((Number) o).doubleValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (pde.isYesNo())
|
||||||
|
{
|
||||||
|
value = pde.getValue();
|
||||||
|
}
|
||||||
|
else if (pde.isPKey())
|
||||||
|
{
|
||||||
|
value = pde.getValueAsString();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
value = pde.getValueDisplay(getLanguage());
|
||||||
|
}
|
||||||
|
//
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getHeaderName(int col)
|
||||||
|
{
|
||||||
|
return m_printFormat.getItem(col).getPrintName(getLanguage());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getRowCount()
|
||||||
|
{
|
||||||
|
return m_printData.getRowCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isColumnPrinted(int col)
|
||||||
|
{
|
||||||
|
MPrintFormatItem item = m_printFormat.getItem(col);
|
||||||
|
return item.isPrinted();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPageBreak(int row, int col)
|
||||||
|
{
|
||||||
|
PrintDataElement pde = getPDE(row, col);
|
||||||
|
return pde != null ? pde.isPageBreak() : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void setCurrentRow(int row)
|
||||||
|
{
|
||||||
|
m_printData.setRowIndex(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getCurrentRow()
|
||||||
|
{
|
||||||
|
return m_printData.getRowIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isFunctionRow()
|
||||||
|
{
|
||||||
|
return m_printData.isFunctionRow();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void formatPage(XSSFSheet sheet)
|
||||||
|
{
|
||||||
|
super.formatPage(sheet);
|
||||||
|
MPrintPaper paper = MPrintPaper.get(this.m_printFormat.getAD_PrintPaper_ID());
|
||||||
|
|
||||||
|
// Set paper size:
|
||||||
|
short paperSize = -1;
|
||||||
|
MediaSizeName mediaSizeName = paper.getMediaSize().getMediaSizeName();
|
||||||
|
if (MediaSizeName.NA_LETTER.equals(mediaSizeName))
|
||||||
|
{
|
||||||
|
paperSize = HSSFPrintSetup.LETTER_PAPERSIZE;
|
||||||
|
}
|
||||||
|
else if (MediaSizeName.NA_LEGAL.equals(mediaSizeName))
|
||||||
|
{
|
||||||
|
paperSize = HSSFPrintSetup.LEGAL_PAPERSIZE;
|
||||||
|
}
|
||||||
|
else if (MediaSizeName.EXECUTIVE.equals(mediaSizeName))
|
||||||
|
{
|
||||||
|
paperSize = HSSFPrintSetup.EXECUTIVE_PAPERSIZE;
|
||||||
|
}
|
||||||
|
else if (MediaSizeName.ISO_A4.equals(mediaSizeName))
|
||||||
|
{
|
||||||
|
paperSize = HSSFPrintSetup.A4_PAPERSIZE;
|
||||||
|
}
|
||||||
|
else if (MediaSizeName.ISO_A5.equals(mediaSizeName))
|
||||||
|
{
|
||||||
|
paperSize = HSSFPrintSetup.A5_PAPERSIZE;
|
||||||
|
}
|
||||||
|
else if (MediaSizeName.NA_NUMBER_10_ENVELOPE.equals(mediaSizeName))
|
||||||
|
{
|
||||||
|
paperSize = HSSFPrintSetup.ENVELOPE_10_PAPERSIZE;
|
||||||
|
}
|
||||||
|
else if (MediaSizeName.MONARCH_ENVELOPE.equals(mediaSizeName))
|
||||||
|
{
|
||||||
|
paperSize = HSSFPrintSetup.ENVELOPE_MONARCH_PAPERSIZE;
|
||||||
|
}
|
||||||
|
if (paperSize != -1)
|
||||||
|
{
|
||||||
|
sheet.getPrintSetup().setPaperSize(paperSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set Landscape/Portrait:
|
||||||
|
sheet.getPrintSetup().setLandscape(paper.isLandscape());
|
||||||
|
|
||||||
|
// Set Paper Margin:
|
||||||
|
sheet.setMargin(HSSFSheet.TopMargin, ((double) paper.getMarginTop()) / 72);
|
||||||
|
sheet.setMargin(HSSFSheet.RightMargin, ((double) paper.getMarginRight()) / 72);
|
||||||
|
sheet.setMargin(HSSFSheet.LeftMargin, ((double) paper.getMarginLeft()) / 72);
|
||||||
|
sheet.setMargin(HSSFSheet.BottomMargin, ((double) paper.getMarginBottom()) / 72);
|
||||||
|
}
|
||||||
|
}
|
|
@ -63,6 +63,7 @@ import javax.xml.transform.stream.StreamResult;
|
||||||
import org.adempiere.exceptions.AdempiereException;
|
import org.adempiere.exceptions.AdempiereException;
|
||||||
import org.adempiere.pdf.Document;
|
import org.adempiere.pdf.Document;
|
||||||
import org.adempiere.print.export.PrintDataExcelExporter;
|
import org.adempiere.print.export.PrintDataExcelExporter;
|
||||||
|
import org.adempiere.print.export.PrintDataXLSXExporter;
|
||||||
import org.apache.ecs.XhtmlDocument;
|
import org.apache.ecs.XhtmlDocument;
|
||||||
import org.apache.ecs.xhtml.a;
|
import org.apache.ecs.xhtml.a;
|
||||||
import org.apache.ecs.xhtml.script;
|
import org.apache.ecs.xhtml.script;
|
||||||
|
@ -1483,6 +1484,20 @@ queued-job-count = 0 (class javax.print.attribute.standard.QueuedJobCount)
|
||||||
exp.export(outFile, language);
|
exp.export(outFile, language);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create ExcelX file
|
||||||
|
* @param outFile output file
|
||||||
|
* @param language
|
||||||
|
* @throws Exception if error
|
||||||
|
*/
|
||||||
|
public void createXLSX(File outFile, Language language)
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
Boolean [] colSuppressRepeats = m_layout == null || m_layout.colSuppressRepeats == null? LayoutEngine.getColSuppressRepeats(m_printFormat):m_layout.colSuppressRepeats;
|
||||||
|
PrintDataXLSXExporter exp = new PrintDataXLSXExporter(getPrintData(), getPrintFormat(), colSuppressRepeats);
|
||||||
|
exp.export(outFile, language);
|
||||||
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* Get Report Engine for process info
|
* Get Report Engine for process info
|
||||||
* @param ctx context
|
* @param ctx context
|
||||||
|
|
|
@ -67,7 +67,8 @@ osgi.bundles=org.eclipse.equinox.ds@1:start,\
|
||||||
com.google.zxing.core,\
|
com.google.zxing.core,\
|
||||||
org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec,\
|
org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec,\
|
||||||
jakarta.xml.bind-api,\
|
jakarta.xml.bind-api,\
|
||||||
org.eclipse.osgi@start
|
org.eclipse.osgi@start,\
|
||||||
|
org.dom4j
|
||||||
osgi.framework.extensions=
|
osgi.framework.extensions=
|
||||||
osgi.bundles.defaultStartLevel=4
|
osgi.bundles.defaultStartLevel=4
|
||||||
osgi.compatibility.bootdelegation=true
|
osgi.compatibility.bootdelegation=true
|
||||||
|
|
|
@ -470,6 +470,7 @@ public class WReportCustomization implements IFormController,EventListener<Even
|
||||||
cboType.appendItem("ssv" + " - " + Msg.getMsg(Env.getCtx(), "FileSSV"), "ssv");
|
cboType.appendItem("ssv" + " - " + Msg.getMsg(Env.getCtx(), "FileSSV"), "ssv");
|
||||||
cboType.appendItem("csv" + " - " + Msg.getMsg(Env.getCtx(), "FileCSV"), "csv");
|
cboType.appendItem("csv" + " - " + Msg.getMsg(Env.getCtx(), "FileCSV"), "csv");
|
||||||
cboType.appendItem("xls" + " - " + Msg.getMsg(Env.getCtx(), "FileXLS"), "xls");
|
cboType.appendItem("xls" + " - " + Msg.getMsg(Env.getCtx(), "FileXLS"), "xls");
|
||||||
|
cboType.appendItem("xlsx" + " - " + Msg.getMsg(Env.getCtx(), "FileXLSX"), "xlsx");
|
||||||
cboType.setSelectedItem(li);
|
cboType.setSelectedItem(li);
|
||||||
|
|
||||||
Hbox hb = new Hbox();
|
Hbox hb = new Hbox();
|
||||||
|
@ -565,6 +566,11 @@ public class WReportCustomization implements IFormController,EventListener<Even
|
||||||
inputFile = File.createTempFile("Export", ".xls");
|
inputFile = File.createTempFile("Export", ".xls");
|
||||||
m_reportEngine.createXLS(inputFile, m_reportEngine.getPrintFormat().getLanguage());
|
m_reportEngine.createXLS(inputFile, m_reportEngine.getPrintFormat().getLanguage());
|
||||||
}
|
}
|
||||||
|
else if (ext.equals("xlsx"))
|
||||||
|
{
|
||||||
|
inputFile = File.createTempFile("Export", ".xlsx");
|
||||||
|
m_reportEngine.createXLSX(inputFile, m_reportEngine.getPrintFormat().getLanguage());
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FDialog.error(m_WindowNo, winExportFile, "FileInvalidExtension");
|
FDialog.error(m_WindowNo, winExportFile, "FileInvalidExtension");
|
||||||
|
|
|
@ -118,6 +118,7 @@ public class ReportAction implements EventListener<Event>
|
||||||
cboExportType.appendItem("txt" + " - " + Msg.getMsg(Env.getCtx(), "FileTXT"), "txt");
|
cboExportType.appendItem("txt" + " - " + Msg.getMsg(Env.getCtx(), "FileTXT"), "txt");
|
||||||
cboExportType.appendItem("ssv" + " - " + Msg.getMsg(Env.getCtx(), "FileSSV"), "ssv");
|
cboExportType.appendItem("ssv" + " - " + Msg.getMsg(Env.getCtx(), "FileSSV"), "ssv");
|
||||||
cboExportType.appendItem("csv" + " - " + Msg.getMsg(Env.getCtx(), "FileCSV"), "csv");
|
cboExportType.appendItem("csv" + " - " + Msg.getMsg(Env.getCtx(), "FileCSV"), "csv");
|
||||||
|
cboExportType.appendItem("xlsx" + " - " + Msg.getMsg(Env.getCtx(), "FileXLSX"), "xlsx");
|
||||||
ListItem li = cboExportType.appendItem("xls" + " - " + Msg.getMsg(Env.getCtx(), "FileXLS"), "xls");
|
ListItem li = cboExportType.appendItem("xls" + " - " + Msg.getMsg(Env.getCtx(), "FileXLS"), "xls");
|
||||||
cboExportType.setSelectedItem(li);
|
cboExportType.setSelectedItem(li);
|
||||||
cboExportType.setVisible(false);
|
cboExportType.setVisible(false);
|
||||||
|
@ -440,6 +441,11 @@ public class ReportAction implements EventListener<Event>
|
||||||
inputFile = File.createTempFile("Export", ".xls");
|
inputFile = File.createTempFile("Export", ".xls");
|
||||||
re.createXLS(inputFile, re.getPrintFormat().getLanguage());
|
re.createXLS(inputFile, re.getPrintFormat().getLanguage());
|
||||||
}
|
}
|
||||||
|
else if (ext.equals("xlsx"))
|
||||||
|
{
|
||||||
|
inputFile = File.createTempFile("Export", ".xlsx");
|
||||||
|
re.createXLSX(inputFile, re.getPrintFormat().getLanguage());
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FDialog.error(0, winReport, "FileInvalidExtension");
|
FDialog.error(0, winReport, "FileInvalidExtension");
|
||||||
|
|
|
@ -280,6 +280,7 @@ public class ZkReportViewer extends Window implements EventListener<Event>, ITab
|
||||||
{
|
{
|
||||||
previewType.appendItem("Excel", "XLS");
|
previewType.appendItem("Excel", "XLS");
|
||||||
previewType.appendItem("CSV", "CSV");
|
previewType.appendItem("CSV", "CSV");
|
||||||
|
previewType.appendItem("Excel X", "XLSX");
|
||||||
}
|
}
|
||||||
|
|
||||||
toolBar.appendChild(previewType);
|
toolBar.appendChild(previewType);
|
||||||
|
@ -658,6 +659,8 @@ public class ZkReportViewer extends Window implements EventListener<Event>, ITab
|
||||||
future = Adempiere.getThreadPoolExecutor().submit(new DesktopRunnable(new XLSRendererRunnable(this),getDesktop()));
|
future = Adempiere.getThreadPoolExecutor().submit(new DesktopRunnable(new XLSRendererRunnable(this),getDesktop()));
|
||||||
} else if ("CSV".equals(previewType.getSelectedItem().getValue())) {
|
} else if ("CSV".equals(previewType.getSelectedItem().getValue())) {
|
||||||
future = Adempiere.getThreadPoolExecutor().submit(new DesktopRunnable(new CSVRendererRunnable(this),getDesktop()));
|
future = Adempiere.getThreadPoolExecutor().submit(new DesktopRunnable(new CSVRendererRunnable(this),getDesktop()));
|
||||||
|
} else if ("XLSX".equals(previewType.getSelectedItem().getValue())) {
|
||||||
|
future = Adempiere.getThreadPoolExecutor().submit(new DesktopRunnable(new XLSXRendererRunnable(this),getDesktop()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1135,6 +1138,7 @@ public class ZkReportViewer extends Window implements EventListener<Event>, ITab
|
||||||
cboType.appendItem("ssv" + " - " + Msg.getMsg(Env.getCtx(), "FileSSV"), "ssv");
|
cboType.appendItem("ssv" + " - " + Msg.getMsg(Env.getCtx(), "FileSSV"), "ssv");
|
||||||
cboType.appendItem("csv" + " - " + Msg.getMsg(Env.getCtx(), "FileCSV"), "csv");
|
cboType.appendItem("csv" + " - " + Msg.getMsg(Env.getCtx(), "FileCSV"), "csv");
|
||||||
cboType.appendItem("xls" + " - " + Msg.getMsg(Env.getCtx(), "FileXLS"), "xls");
|
cboType.appendItem("xls" + " - " + Msg.getMsg(Env.getCtx(), "FileXLS"), "xls");
|
||||||
|
cboType.appendItem("xlsx" + " - " + Msg.getMsg(Env.getCtx(), "FileXLSX"), "xlsx");
|
||||||
cboType.setSelectedItem(li);
|
cboType.setSelectedItem(li);
|
||||||
|
|
||||||
Hbox hb = new Hbox();
|
Hbox hb = new Hbox();
|
||||||
|
@ -1218,6 +1222,11 @@ public class ZkReportViewer extends Window implements EventListener<Event>, ITab
|
||||||
m_reportEngine.createHTML(sw, false, m_reportEngine.getPrintFormat().getLanguage(), new HTMLExtension(contextPath, "rp", this.getUuid()), true);
|
m_reportEngine.createHTML(sw, false, m_reportEngine.getPrintFormat().getLanguage(), new HTMLExtension(contextPath, "rp", this.getUuid()), true);
|
||||||
data = sw.getBuffer().toString().getBytes();
|
data = sw.getBuffer().toString().getBytes();
|
||||||
}
|
}
|
||||||
|
else if (ext.equals("xlsx"))
|
||||||
|
{
|
||||||
|
inputFile = File.createTempFile("Export", ".xlsx");
|
||||||
|
m_reportEngine.createXLSX(inputFile, m_reportEngine.getPrintFormat().getLanguage());
|
||||||
|
}
|
||||||
else if (ext.equals("xls"))
|
else if (ext.equals("xls"))
|
||||||
{
|
{
|
||||||
inputFile = File.createTempFile("Export", ".xls");
|
inputFile = File.createTempFile("Export", ".xls");
|
||||||
|
@ -1724,4 +1733,61 @@ public class ZkReportViewer extends Window implements EventListener<Event>, ITab
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static class XLSXRendererRunnable extends ContextRunnable implements IServerPushCallback
|
||||||
|
{
|
||||||
|
|
||||||
|
private ZkReportViewer viewer;
|
||||||
|
|
||||||
|
public XLSXRendererRunnable(ZkReportViewer viewer)
|
||||||
|
{
|
||||||
|
super();
|
||||||
|
this.viewer = viewer;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doRun()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!ArchiveEngine.isValid(viewer.m_reportEngine.getLayout()))
|
||||||
|
log.warning("Cannot archive Document");
|
||||||
|
String path = System.getProperty("java.io.tmpdir");
|
||||||
|
String prefix = viewer.makePrefix(viewer.m_reportEngine.getName());
|
||||||
|
if (log.isLoggable(Level.FINE))
|
||||||
|
{
|
||||||
|
log.log(Level.FINE, "Path=" + path + " Prefix=" + prefix);
|
||||||
|
}
|
||||||
|
File file = File.createTempFile(prefix, ".xlsx", new File(path));
|
||||||
|
viewer.m_reportEngine.createXLSX(file, viewer.m_reportEngine.getPrintFormat().getLanguage());
|
||||||
|
viewer.media = new AMedia(file.getName(), "xlsx",
|
||||||
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", file, true);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
if (e instanceof RuntimeException)
|
||||||
|
throw (RuntimeException) e;
|
||||||
|
else
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
Desktop desktop = AEnv.getDesktop();
|
||||||
|
if (desktop != null && desktop.isAlive())
|
||||||
|
{
|
||||||
|
new ServerPushTemplate(desktop).executeAsync(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateUI()
|
||||||
|
{
|
||||||
|
viewer.labelDrill.setVisible(false);
|
||||||
|
viewer.comboDrill.setVisible(false);
|
||||||
|
viewer.onPreviewReport();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue