IDEMPIERE-6117 POI: WorkbookFactory.create cannot be used to open XLSX files (#2357)

* IDEMPIERE-6117 POI: WorkbookFactory.create cannot be used to open XLSX files

* IDEMPIERE-6117 POI: WorkbookFactory.create cannot be used to open XLSX files

* IDEMPIERE-6117 POI: WorkbookFactory.create cannot be used to open XLSX files

- Incorporate patch from Carlos
This commit is contained in:
hengsin 2024-06-11 00:07:41 +08:00 committed by Carlos Ruiz
parent 0f02545dbb
commit 4875568cf2
17 changed files with 101 additions and 25 deletions

View File

@ -0,0 +1,25 @@
-- IDEMPIERE-6040 Improvements for CSV import template
SELECT register_migration_script('202405131534_IDEMPIERE-6040.sql') FROM dual;
SET SQLBLANKLINES ON
SET DEFINE OFF
-- May 13, 2024, 3:34:49 PM CEST
UPDATE AD_Ref_List SET Name='Comma-separated values (CSV)',Updated=TO_TIMESTAMP('2024-05-13 15:34:49','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=200704
;
-- May 13, 2024, 3:35:58 PM CEST
UPDATE AD_Ref_List SET Name='Excel (XLS/XLSX)',Updated=TO_TIMESTAMP('2024-05-13 15:35:58','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=200706
;
-- May 13, 2024, 3:36:02 PM CEST
UPDATE AD_Ref_List SET IsActive='N',Updated=TO_TIMESTAMP('2024-05-13 15:36:02','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=200705
;
UPDATE AD_ImportTemplate SET ImportTemplateType='XLSX' WHERE ImportTemplateType='XLS'
;
-- May 13, 2024, 3:59:49 PM CEST
UPDATE AD_Field SET SeqNo=120, ColumnSpan=2,Updated=TO_TIMESTAMP('2024-05-13 15:59:49','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=208476
;

View File

@ -0,0 +1,22 @@
-- IDEMPIERE-6040 Improvements for CSV import template
SELECT register_migration_script('202405131534_IDEMPIERE-6040.sql') FROM dual;
-- May 13, 2024, 3:34:49 PM CEST
UPDATE AD_Ref_List SET Name='Comma-separated values (CSV)',Updated=TO_TIMESTAMP('2024-05-13 15:34:49','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=200704
;
-- May 13, 2024, 3:35:58 PM CEST
UPDATE AD_Ref_List SET Name='Excel (XLS/XLSX)',Updated=TO_TIMESTAMP('2024-05-13 15:35:58','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=200706
;
-- May 13, 2024, 3:36:02 PM CEST
UPDATE AD_Ref_List SET IsActive='N',Updated=TO_TIMESTAMP('2024-05-13 15:36:02','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Ref_List_ID=200705
;
UPDATE AD_ImportTemplate SET ImportTemplateType='XLSX' WHERE ImportTemplateType='XLS'
;
-- May 13, 2024, 3:59:49 PM CEST
UPDATE AD_Field SET SeqNo=120, ColumnSpan=2,Updated=TO_TIMESTAMP('2024-05-13 15:59:49','YYYY-MM-DD HH24:MI:SS'),UpdatedBy=100 WHERE AD_Field_ID=208476
;

View File

@ -273,6 +273,10 @@
id="org.apache.commons.commons-compress"
version="0.0.0"/>
<plugin
id="org.apache.commons.commons-io"
version="0.0.0"/>
<plugin
id="org.apache.commons.commons-net"
version="0.0.0"/>

View File

@ -60,6 +60,7 @@
<setEntry value="org.apache.commons.commons-codec@default:default"/>
<setEntry value="org.apache.commons.commons-collections4@default:default"/>
<setEntry value="org.apache.commons.commons-compress@default:default"/>
<setEntry value="org.apache.commons.commons-io@default:default"/>
<setEntry value="org.apache.commons.commons-net@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>

View File

@ -68,6 +68,7 @@
<setEntry value="org.apache.commons.commons-codec@default:default"/>
<setEntry value="org.apache.commons.commons-collections4@default:default"/>
<setEntry value="org.apache.commons.commons-compress@default:default"/>
<setEntry value="org.apache.commons.commons-io@default:default"/>
<setEntry value="org.apache.commons.commons-net@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>

View File

@ -69,6 +69,7 @@
<setEntry value="org.apache.commons.commons-codec@default:default"/>
<setEntry value="org.apache.commons.commons-collections4@default:default"/>
<setEntry value="org.apache.commons.commons-compress@default:default"/>
<setEntry value="org.apache.commons.commons-io@default:default"/>
<setEntry value="org.apache.commons.commons-net@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>

View File

@ -69,6 +69,7 @@
<setEntry value="org.apache.commons.commons-codec@default:default"/>
<setEntry value="org.apache.commons.commons-collections4@default:default"/>
<setEntry value="org.apache.commons.commons-compress@default:default"/>
<setEntry value="org.apache.commons.commons-io@default:default"/>
<setEntry value="org.apache.commons.commons-net@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>

View File

@ -69,6 +69,7 @@
<setEntry value="org.apache.commons.commons-codec@default:default"/>
<setEntry value="org.apache.commons.commons-collections4@default:default"/>
<setEntry value="org.apache.commons.commons-compress@default:default"/>
<setEntry value="org.apache.commons.commons-io@default:default"/>
<setEntry value="org.apache.commons.commons-net@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>

View File

@ -28,6 +28,14 @@ import java.util.Map;
import java.util.Properties;
import org.adempiere.base.equinox.StackTraceCommand;
import org.apache.poi.extractor.ExtractorFactory;
import org.apache.poi.extractor.MainExtractorFactory;
import org.apache.poi.hssf.usermodel.HSSFWorkbookFactory;
import org.apache.poi.ooxml.extractor.POIXMLExtractorFactory;
import org.apache.poi.sl.usermodel.SlideShowFactory;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory;
import org.apache.poi.xslf.usermodel.XSLFSlideShowFactory;
import org.compiere.Adempiere;
import org.eclipse.osgi.framework.console.CommandProvider;
import org.osgi.framework.BundleActivator;
@ -61,6 +69,13 @@ public class BaseActivator implements BundleActivator {
context.registerService(CommandProvider.class.getName(), new StackTraceCommand(), null);
blacklistService = new ComponentBlackListService(context);
//setup poi factory
WorkbookFactory.addProvider(new HSSFWorkbookFactory());
WorkbookFactory.addProvider(new XSSFWorkbookFactory());
SlideShowFactory.addProvider(new XSLFSlideShowFactory());
ExtractorFactory.addProvider(new POIXMLExtractorFactory());
ExtractorFactory.addProvider(new MainExtractorFactory());
}
/*
@ -120,6 +135,14 @@ public class BaseActivator implements BundleActivator {
blacklistService.stop(context);
blacklistService = null;
}
//remove poi factory
WorkbookFactory.removeProvider(HSSFWorkbookFactory.class);
WorkbookFactory.removeProvider(XSSFWorkbookFactory.class);
SlideShowFactory.removeProvider(XSLFSlideShowFactory.class);
ExtractorFactory.removeProvider(POIXMLExtractorFactory.class);
ExtractorFactory.removeProvider(MainExtractorFactory.class);
Adempiere.stop();
}

View File

@ -22,7 +22,7 @@ import org.compiere.util.KeyNamePair;
/** Generated Interface for AD_ImportTemplate
* @author iDempiere (generated)
* @version Release 11
* @version Release 12
*/
public interface I_AD_ImportTemplate
{

View File

@ -34,13 +34,12 @@ import java.util.Properties;
import java.util.logging.Level;
import org.adempiere.exceptions.AdempiereException;
import org.apache.poi.hssf.usermodel.HSSFWorkbookFactory;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.compiere.util.CCache;
import org.compiere.util.CLogger;
import org.compiere.util.DB;
@ -238,8 +237,7 @@ public class MImportTemplate extends X_AD_ImportTemplate implements ImmutablePOS
*/
public InputStream validateFile(InputStream in) {
if ( MImportTemplate.IMPORTTEMPLATETYPE_XLS.equals(getImportTemplateType())
|| MImportTemplate.IMPORTTEMPLATETYPE_XLSX.equals(getImportTemplateType())) {
if (MImportTemplate.IMPORTTEMPLATETYPE_ExcelXLSXLSX.equals(getImportTemplateType())) {
try {
in = convertExcelToCSV(in);
} catch (Exception e) {
@ -308,17 +306,7 @@ public class MImportTemplate extends X_AD_ImportTemplate implements ImmutablePOS
*/
public InputStream convertExcelToCSV(InputStream excelIs) throws IOException {
Workbook workbook = null;
if (MImportTemplate.IMPORTTEMPLATETYPE_XLS.equals(getImportTemplateType())) {
HSSFWorkbookFactory xlsWbf = new HSSFWorkbookFactory();
workbook = xlsWbf.create(excelIs);
} else if (MImportTemplate.IMPORTTEMPLATETYPE_XLSX.equals(getImportTemplateType())) {
XSSFWorkbookFactory xlsxWbf = new XSSFWorkbookFactory();
workbook = xlsxWbf.create(excelIs);
} else {
// unexpected error
throw new AdempiereException("Wrong template type -> " + getImportTemplateType());
}
Workbook workbook = WorkbookFactory.create(excelIs);
List<Integer> colTypes = calculateAndValidateColumnTypes();

View File

@ -23,7 +23,7 @@ import org.compiere.util.KeyNamePair;
/** Generated Model for AD_ImportTemplate
* @author iDempiere (generated)
* @version Release 11 - $Id$ */
* @version Release 12 - $Id$ */
@org.adempiere.base.Model(table="AD_ImportTemplate")
public class X_AD_ImportTemplate extends PO implements I_AD_ImportTemplate, I_Persistent
{
@ -31,7 +31,7 @@ public class X_AD_ImportTemplate extends PO implements I_AD_ImportTemplate, I_Pe
/**
*
*/
private static final long serialVersionUID = 20240327L;
private static final long serialVersionUID = 20240513L;
/** Standard Constructor */
public X_AD_ImportTemplate (Properties ctx, int AD_ImportTemplate_ID, String trxName)
@ -300,12 +300,12 @@ public class X_AD_ImportTemplate extends PO implements I_AD_ImportTemplate, I_Pe
/** ImportTemplateType AD_Reference_ID=200268 */
public static final int IMPORTTEMPLATETYPE_AD_Reference_ID=200268;
/** CSV = CSV */
public static final String IMPORTTEMPLATETYPE_CSV = "CSV";
/** Comma-separated values (CSV) = CSV */
public static final String IMPORTTEMPLATETYPE_Comma_SeparatedValuesCSV = "CSV";
/** XLS = XLS */
public static final String IMPORTTEMPLATETYPE_XLS = "XLS";
/** XLSX = XLSX */
public static final String IMPORTTEMPLATETYPE_XLSX = "XLSX";
/** Excel (XLS/XLSX) = XLSX */
public static final String IMPORTTEMPLATETYPE_ExcelXLSXLSX = "XLSX";
/** Set Import Template Type.
@param ImportTemplateType Import Template Type
*/

View File

@ -58,6 +58,7 @@
<setEntry value="org.apache.commons.commons-codec@default:default"/>
<setEntry value="org.apache.commons.commons-collections4@default:default"/>
<setEntry value="org.apache.commons.commons-compress@default:default"/>
<setEntry value="org.apache.commons.commons-io@default:default"/>
<setEntry value="org.apache.commons.commons-net@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="org.apache.felix.gogo.runtime@default:default"/>

View File

@ -58,6 +58,7 @@
<setEntry value="org.apache.commons.commons-codec@default:default"/>
<setEntry value="org.apache.commons.commons-collections4@default:default"/>
<setEntry value="org.apache.commons.commons-compress@default:default"/>
<setEntry value="org.apache.commons.commons-io@default:default"/>
<setEntry value="org.apache.commons.commons-net@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="org.apache.felix.scr@1:true"/>

View File

@ -58,6 +58,7 @@
<setEntry value="org.apache.commons.commons-codec@default:default"/>
<setEntry value="org.apache.commons.commons-collections4@default:default"/>
<setEntry value="org.apache.commons.commons-compress@default:default"/>
<setEntry value="org.apache.commons.commons-io@default:default"/>
<setEntry value="org.apache.commons.commons-net@default:default"/>
<setEntry value="org.apache.commons.logging@default:default"/>
<setEntry value="org.apache.felix.scr@1:true"/>

View File

@ -30,6 +30,7 @@ osgi.bundles=org.apache.felix.scr@1:start,\
wrapped.org.apache.poi.poi-ooxml,\
wrapped.org.apache.poi.poi-ooxml-lite,\
org.apache.commons.commons-compress,\
org.apache.commons.commons-io,\
wrapped.org.apache.xmlbeans.xmlbeans,\
org.eclipse.core.jobs,\
org.eclipse.equinox.preferences,\

View File

@ -126,9 +126,14 @@
</requirement>
<requirement>
<type>eclipse-plugin</type>
<id>org.idempiere.tablepartition</id>
<versionRange>0.0.0</versionRange>
</requirement>
<id>org.idempiere.tablepartition</id>
<versionRange>0.0.0</versionRange>
</requirement>
<requirement>
<type>eclipse-plugin</type>
<id>wrapped.org.apache.xmlbeans.xmlbeans</id>
<versionRange>0.0.0</versionRange>
</requirement>
</extraRequirements>
</dependency-resolution>
</configuration>