Revision 576

View differences:

org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.app/org.gvsig.jexcel.app.mainplugin/src/main/resources-plugin/test1.txt
1
>>> from  jxl import Workbook
2
>>> Workbook.getWorkbook
3
<java function getWorkbook 1>
4
>>> from java.io import File
5
>>> f=File("/home/usuario/datos/geodata/tables/torrent_4-es-excel2003.xls")
6
>>> f.exists()
7
1
8
>>> w=Workbook.getWorkbook(f)
9
>>> dir(w)
10
['XCTRecords', 'addInFunctionNames', 'buttonPropertySet', 'class', 'close', 'compoundFile', 'containsMacros', 'countryRecord', 'createWorkbook', 'drawingGroup', 'equals', 'externalSheetRecord', 'findByName', 'findCellByName', 'fonts', 'formattingRecords', 'getAddInFunctionNames', 'getButtonPropertySet', 'getCell', 'getClass', 'getCompoundFile', 'getCountryRecord', 'getDrawingGroup', 'getExternalSheetIndex', 'getExternalSheetName', 'getExternalSheetRecord', 'getFonts', 'getFormattingRecords', 'getIndex', 'getLastExternalSheetIndex', 'getLastExternalSheetName', 'getMsoDrawingGroupRecord', 'getName', 'getNameIndex', 'getNameRecords', 'getNumberOfSheets', 'getRangeNames', 'getReadSheet', 'getSettings', 'getSheet', 'getSheetNames', 'getSheets', 'getSupbookRecords', 'getVersion', 'getWorkbook', 'getWorkbookBof', 'getXCTRecords', 'hashCode', 'isProtected', 'msoDrawingGroupRecord', 'nameRecords', 'notify', 'notifyAll', 'numberOfSheets', 'protected', 'rangeNames', 'settings', 'sheetNames', 'sheets', 'supbookRecords', 'toString', 'wait', 'workbookBof']
11
>>> w.numberOfSheets
12
1
13
>>> w.sheetNames
14
array(java.lang.String,['Hoja1']) 
15
>>> w.sheets
16
array(jxl.Sheet,[jxl.read.biff.SheetImpl@3a4f51e8]) 
17
>>> s=w.sheets[0]
18
>>> s
19
jxl.read.biff.SheetImpl@3a4f51e8
20
>>> dir(s)
21
['PLS', 'autoFilter', 'buttonPropertySet', 'charts', 'class', 'columnInfos', 'columnPageBreaks', 'columns', 'conditionalFormats', 'dataValidation', 'drawingData', 'drawings', 'equals', 'findCell', 'findLabelCell', 'getAutoFilter', 'getButtonPropertySet', 'getCell', 'getCharts', 'getClass', 'getColumn', 'getColumnFormat', 'getColumnInfo', 'getColumnInfos', 'getColumnPageBreaks', 'getColumnView', 'getColumnWidth', 'getColumns', 'getConditionalFormats', 'getDataValidation', 'getDrawing', 'getDrawingData', 'getDrawings', 'getHyperlinks', 'getMaxColumnOutlineLevel', 'getMaxRowOutlineLevel', 'getMergedCells', 'getName', 'getNumberOfImages', 'getPLS', 'getRow', 'getRowHeight', 'getRowPageBreaks', 'getRowProperties', 'getRowView', 'getRows', 'getSettings', 'getSheetBof', 'getWorkbook', 'getWorkbookBof', 'getWorkspaceOptions', 'hashCode', 'hidden', 'hyperlinks', 'isHidden', 'isProtected', 'maxColumnOutlineLevel', 'maxRowOutlineLevel', 'mergedCells', 'name', 'notify', 'notifyAll', 'numberOfImages', 'protected', 'rowPageBreaks', 'rowProperties', 'rows', 'settings', 'sheetBof', 'toString', 'wait', 'workbook', 'workbookBof', 'workspaceOptions']
22
>>> 
23
>>> s.getRows()
24
382
25
>>> s.columns
26
5
27
>>> 
28
>>> c=s.getCell(0,0)
29
>>> dir(c)
30
['XFIndex', 'cellFeatures', 'cellFormat', 'class', 'column', 'contents', 'equals', 'getCellFeatures', 'getCellFormat', 'getClass', 'getColumn', 'getContents', 'getRow', 'getString', 'getType', 'getXFIndex', 'hashCode', 'hidden', 'isHidden', 'notify', 'notifyAll', 'row', 'setCellFeatures', 'string', 'toString', 'type', 'wait']
31
>>> 
32
>>> c.toString()
33
'jxl.read.biff.LabelSSTRecord@14a614b5'
34
>>> c.contents
35
'B1'
36
>>> 
37
>>> s.getCell(0,s.getRows()-1)
38
jxl.read.biff.NumberValue@3e803098
39
>>> s.getCell(s.columns-1,s.getRows()-1)
40
jxl.read.biff.LabelSSTRecord@56dc16be
41
>>> s.getCell(s.columns-1,s.getRows()-1).contents
42
'R'
43
>>> 
44

  
45

  
46

  
47

  
48

  
49

  
50

  
51

  
52

  
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.app/org.gvsig.jexcel.app.mainplugin/src/main/resources-plugin/config.xml
1
<?xml version="1.0" encoding="ISO-8859-1"?>
2
<plugin-config>
3
  <libraries library-dir="lib/"/>
4
  <depends plugin-name="org.gvsig.app.mainplugin"/>
5
  <resourceBundle name="text"/>
6
  <extensions>
7
     <extension class-name="org.gvsig.andami.LibraryExtension" active="false"/>
8
  </extensions>
9
</plugin-config>
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.app/org.gvsig.jexcel.app.mainplugin/src/main/assembly/gvsig-plugin-package.xml
1
<assembly>
2
  <id>gvsig-plugin-package</id>
3
  <formats>
4
    <format>zip</format>
5
  </formats>
6
  <baseDirectory>${project.artifactId}</baseDirectory>
7
  <includeBaseDirectory>true</includeBaseDirectory>
8
  <files>
9
    <file>
10
      <source>target/${project.artifactId}-${project.version}.jar</source>
11
      <outputDirectory>lib</outputDirectory>
12
    </file>
13
    <file>
14
      <source>target/package.info</source>
15
    </file>
16
  </files>
17

  
18
  <fileSets>
19
    <fileSet>
20
      <directory>src/main/resources-plugin</directory>
21
      <outputDirectory>.</outputDirectory>
22
    </fileSet>
23
  </fileSets>
24

  
25
  <dependencySets>
26
  
27
    <dependencySet>
28
      <useProjectArtifact>false</useProjectArtifact>
29
      <useTransitiveDependencies>false</useTransitiveDependencies>
30
      <outputDirectory>lib</outputDirectory>
31
      <includes>
32
        <include>net.sourceforge.jexcelapi:jxl</include>
33
        <include>org.gvsig:org.gvsig.jexcel.provider</include>        
34
      </includes>
35
    </dependencySet>
36
    
37
  </dependencySets>
38

  
39
</assembly>
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.app/org.gvsig.jexcel.app.mainplugin/src/main/userdoc/user_manual.rst
1
jexcel plugin user manual v0.2
2
=================================
3

  
4
.. contents:: Contents
5

  
6
Introduction
7
--------------
8

  
9
The jexcel plugin add to gvSIG the following functionalities:
10

  
11
* Load Microsoft Excel spreadsheets as tables.
12
* Load Microsoft Excel spreadsheets as layers.
13
* Export a table to Excel spreadsheet format.
14

  
15
It supports the following Excel spreadsheet versions:
16

  
17
* Reading: Excel 95, 97, 2000, XP, and 2003 workbooks.
18
* Writing: Excel 2000
19

  
20
Installation
21
--------------
22

  
23
(TODO)
24

  
25
Loading a table from an Excel spreadsheet
26
------------------------------------------
27

  
28
From the gvSIG project manager, select the “Table” document (1) and click on “New” (2). In the “New table” window the “File” tab is selected by default. Click on “Add” (3) and find the Excel file that contains the spreadsheet you want to load (4). Finally click on “Open” (5).
29

  
30
|
31

  
32
.. image:: Selection_088.png
33
  :align: center
34
  :scale: 150
35

  
36
Once the file appears in the “New table” window, click on “Properties” (7) in order to set up the following parameters:
37

  
38
Data source properties
39
+++++++++++++++++++++++
40

  
41
General tab (default)
42
^^^^^^^^^^^^^^^^^^^^^^
43

  
44
 - **File:** File path.
45
 - **Locale:** Localization configuration. This determines the characters used as decimal and thousands separators.
46
 - **Sheet to load:** Position within the spreadsheet file of the sheet that we want to load. First position corresponds with the number "0", second with "1" and so on.
47
 - **Use first row as header:** In case this option is checked it will consider the first row values as the field names.
48
 - **CRS:** In case the sheet contains coordinates this parameter sets its Coordinate Reference System.
49
 - **Point (X,Y,Z):** Position of the fields that contains the coordinates. It should be provided at least two fields for X,Y coordinates.
50

  
51
|
52

  
53
.. image:: Selection_091.png
54
  :align: center
55
  :scale: 150
56

  
57
Advanced tab
58
^^^^^^^^^^^^^^
59

  
60
 - **ProviderName:** The provider name (internal use).
61
 - **Header:** In case the sheet doesn't have a header we can define it here. We have to type the name of the fields separated by a comma.
62
 - **Field types:** The is useful if we want to force the program to load the table with a specific field types. 
63
 - **Automatic types detection:** This options is checked by default. It tryes to figure out what the field types are. 
64
 - **Ignore errors:** This option forces the program to load the table even in case it finds erros.
65

  
66
|
67

  
68
.. image:: Selection_090.png
69
  :align: center
70
  :scale: 150
71

  
72
Once all the needed parameters have been set up click on “Accept” and finally on “Ok”. If everything worked fine the table should appear.
73

  
74
|
75

  
76
.. image:: Selection_092.png
77
  :align: center
78
  :scale: 150
79

  
80
Loading a layer from an Excel Spreadsheet
81
------------------------------------------
82

  
83
From the gvSIG project manager, select the “View” document (1) and click on “New” (2). In the “Add layer” window the “File” tab is selected by default. Click on “Add” (4) and find the Excel file that contains the spreadsheet you want to load (5). Finally click on “Open” (6).
84

  
85
|
86

  
87
.. image:: Selection_095.png
88
  :align: center
89
  :scale: 150
90

  
91
Once the file appears in the “Add layer” window, click on “Properties” (7) in order to set up the following parameters:
92

  
93
Data source properties
94
+++++++++++++++++++++++
95

  
96
General tab (default)
97
^^^^^^^^^^^^^^^^^^^^^^
98

  
99
 - **File:** File path.
100
 - **Locale:** Localization configuration. This determines the characters used as decimal and thousands separators.
101
 - **Sheet to load:** Position within the spreadsheet file of the sheet that we want to load. First position corresponds with the number "0", second with "1" and so on.
102
 - **Use first row as header:** In case this option is checked it will consider the first row values as the field names.
103
 - **CRS:** In case the sheet contains coordinates this parameter sets its Coordinate Reference System.
104
 - **Point (X,Y,Z):** Position of the fields that contains the coordinates. It should be provided at least two fields for X,Y coordinates.
105

  
106
|
107

  
108
.. image:: Selection_096.png
109
  :align: center
110
  :scale: 150
111

  
112
Advanced tab
113
^^^^^^^^^^^^^^
114

  
115
 - **ProviderName:** The provider name (internal use).
116
 - **Header:** In case the sheet doesn't have a header we can define it here. We have to type the name of the fields separated by a comma.
117
 - **Field types:** The is useful if we want to force the program to load the table with a specific field types. 
118
 - **Automatic types detection:** This options is checked by default. It tryes to figure out what the field types are. 
119
 - **Ignore errors:** This option forces the program to load the table even in case it finds erros.
120

  
121
|
122

  
123
.. image:: Selection_097.png
124
  :align: center
125
  :scale: 150
126

  
127
Once all the needed parameters have been set up click on “Accept” and finally on “Ok”. If everything worked fine the layer should appear in the view.
128

  
129
|
130

  
131
.. image:: Selection_098.png
132
  :align: center
133
  :scale: 150
134

  
135
Exporting a table to Excel spreadsheet format
136
----------------------------------------------
137

  
138
(TODO)
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.app/org.gvsig.jexcel.app.mainplugin/pom.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3
    <modelVersion>4.0.0</modelVersion>
4
    <artifactId>org.gvsig.jexcel.app.mainplugin</artifactId>
5
    <packaging>jar</packaging>
6
    <name>${project.artifactId}</name>
7
    <description>Excel file format support</description>
8
    <parent>
9
        <groupId>org.gvsig</groupId>
10
        <artifactId>org.gvsig.jexcel.app</artifactId>
11
        <version>1.0.87</version>
12
    </parent>
13

  
14
    <dependencies>
15
        <dependency>
16
            <groupId>org.gvsig</groupId>
17
            <artifactId>org.gvsig.tools.lib</artifactId>
18
            <scope>compile</scope>
19
        </dependency>
20
        <dependency>
21
            <groupId>org.gvsig</groupId>
22
            <artifactId>org.gvsig.andami</artifactId>
23
            <scope>compile</scope>
24
        </dependency>
25
        <dependency>
26
            <groupId>org.gvsig</groupId>
27
            <artifactId>org.gvsig.jexcel.provider</artifactId>
28
            <scope>compile</scope>
29
        </dependency>
30

  
31
        <dependency>
32
            <groupId>net.sourceforge.jexcelapi</groupId>
33
            <artifactId>jxl</artifactId>
34
            <scope>compile</scope>
35
        </dependency>
36

  
37
    </dependencies>
38

  
39
    <properties>
40
        <!-- Package info property values -->
41
        <!-- Default values in org.gvsig.desktop -->
42
        <gvsig.package.info.name>Formats: Excel file format support</gvsig.package.info.name>
43
        <gvsig.package.info.state>testing</gvsig.package.info.state>
44
        <gvsig.package.info.official>true</gvsig.package.info.official>
45
        <gvsig.package.info.dependencies>required: org.gvsig.app.mainplugin -ge 2.1.0-A</gvsig.package.info.dependencies>
46
        <gvsig.package.info.categories>Formats,Vector</gvsig.package.info.categories>
47
        <gvsig.package.info.poolURL>https://devel.gvsig.org/download/projects/gvsig-jexcel/pool/</gvsig.package.info.poolURL>
48
    </properties>
49

  
50
</project>
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.app/org.gvsig.jexcel.app.mainplugin/buildNumber.properties
1
#Wed Jan 29 15:03:31 CET 2020
2
buildNumber=91
0 3

  
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.app/pom.xml
1
<?xml version="1.0" encoding="UTF-8"?>
2
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3
  <modelVersion>4.0.0</modelVersion>
4
  <artifactId>org.gvsig.jexcel.app</artifactId>
5
  <packaging>pom</packaging>
6
  <name>${project.artifactId}</name>
7
  <parent>
8
      <groupId>org.gvsig</groupId>
9
      <artifactId>org.gvsig.jexcel</artifactId>
10
      <version>1.0.87</version>
11
  </parent>
12

  
13
  <modules>
14
    <module>org.gvsig.jexcel.app.mainplugin</module>
15
  </modules>
16

  
17

  
18
</project>
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.provider/src/main/resources/META-INF/services/org.gvsig.tools.library.Library
1
org.gvsig.jexcel.JExcelLibrary
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.provider/src/main/resources/org/gvsig/jexcel/dal/provider/JExcelMetadata.xml
1
<?xml version="1.0"?>
2
<!--
3
Definitions of metadata fields of a shp file.  
4
 -->
5
<definitions>
6
  <version>1.0.0</version>
7
  <classes>
8
    
9
    <class name="JExcel" namespace="Metadata">
10
      <extends>
11
      	<class namespace="Metadata" name="SpatialProvider"/>
12
      </extends>
13
      <description>Metadata of a JExcel store</description>
14
      <fields>
15
      </fields>
16
    </class>
17

  
18
  </classes>
19
</definitions>  
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.provider/src/main/resources/org/gvsig/jexcel/dal/provider/JExcelParameters.xml
1
<?xml version= "1.0 "?>
2
<definitions>
3
    <version>1.0.0</version>
4
    <classes>
5
        <class name="JExcel">
6
            <extends>
7
                <class namespace="dal" name="ProviderParameters"/>
8
            </extends>
9
            <description>Store the parameters need to open a Excel file</description>
10
            <fields>
11
                <field name="file" label="File" type="file" mandatory="true">
12
                    <description>Excel file</description>
13
                </field>
14
                <field name="locale" label="Locale" type="string" mandatory="true" defaultValue="DEFAULT">
15
                    <description>Locale used to parse double and float values (BCP47 language tag representing the locale)</description>
16
                    <availableValues>
17
                        <value label="Default (use system locale)">DEFAULT</value>
18
                        <value label="Canada (english)">en-CA</value>
19
                        <value label="Canada (french)">fr-CA</value>
20
                        <value label="Chinese">zh</value>
21
                        <value label="English">en</value>
22
                        <value label="French">fr</value>
23
                        <value label="German">de</value>
24
                        <value label="Italian">it</value>
25
                        <value label="Japanese">ja</value>
26
                        <value label="Korea">ko</value>
27
                        <value label="Spain">es</value>
28
                        <value label="Uk">en-GB</value>
29
                        <value label="Us">en-US</value>
30
                    </availableValues>          
31
                </field>
32
                <field name="sheet" label="Sheet to load" type="integer" subtype="jexcel.sheet.selector" mandatory="false" defaultValue="0">
33
                    <description>Sheet to use.</description>
34
                </field>
35
                <field name="isFirstRowHeadeer" label="Use first row as header" type="boolean" mandatory="false" defaultValue="false">
36
                    <description>Check for use first row as header.</description>
37
                </field>
38
                <field name="CRS" type="crs" mandatory="false">
39
                    <description>The coordinate reference system used when use the point parameter to generate a layer</description>
40
                </field>
41
                <field name="point" label="Point (X,Y,Z)" type="string" mandatory="false" defaultValue="" >
42
                    <description>This field allow to add a Geometry column to the table. It is a list of field names separated by commas used as dimensions for the attribute GEOM of type point to add to the table.</description>
43
                </field>
44

  
45
                <field name="header" label="Header" type="string" mandatory="false" defaultValue="" group="Advanced">
46
                    <description>The header or empty if parsed automatically</description>
47
                </field>
48
                <field name="fieldtypes" label="Field types" type="string" mandatory="false" defaultValue="" group="Advanced">
49
                    <description>Comma separated list of field types. If empty strings are assumed (Eg: integer,string,double,boolean,float,geometry).</description>
50
                </field>
51
                <field name="automaticTypesDetection" label="Automatic types detection" type="boolean" mandatory="false" defaultValue="true" group="Advanced">
52
                    <description>This flag activate the autodetection of types in the CSV. Can be slow.</description>
53
                </field>
54
                <field name="ignoreErrors" label="Ignore errors" type="boolean" mandatory="false" defaultValue="false" group="Advanced">
55
                    <description>Set to true to ignore errors during load of data.</description>
56
                </field>
57
            </fields>
58
      
59
        </class>
60
    </classes>
61
</definitions>  
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.provider/src/main/java/org/gvsig/jexcel/JExcelSpread.java
1
package org.gvsig.jexcel;
2

  
3
import java.io.File;
4
import java.io.IOException;
5
import java.util.ArrayList;
6
import java.util.Collections;
7
import java.util.List;
8
import java.util.Locale;
9
import java.util.Objects;
10
import org.apache.commons.lang3.StringUtils;
11
import java.awt.Rectangle;
12
import java.util.Arrays;
13
import jxl.Cell;
14
import jxl.Workbook;
15
import org.slf4j.Logger;
16
import org.slf4j.LoggerFactory;
17

  
18
/**
19
 *
20
 * @author jjdelcerro
21
 */
22
@SuppressWarnings("UseSpecificCatch")
23
public class JExcelSpread implements Spread {
24

  
25
    private static final Logger LOGGER = LoggerFactory.getLogger(JExcelSpread.class);
26
    
27
    private static class SheetJExcel implements Sheet {
28

  
29
        private final Workbook workbook;        
30
        private final File spreadFile;
31
        private final int sheetIndex;
32
        private final jxl.Sheet sheetExcel;
33

  
34
        public SheetJExcel(File spreadFile, int sheetIndex) throws IOException {
35
            try {
36
                this.spreadFile = spreadFile;
37
                this.sheetIndex = sheetIndex;
38
                this.workbook = Workbook.getWorkbook(spreadFile);
39
                this.sheetExcel = this.workbook.getSheet(sheetIndex);
40
            } catch (Exception ex) {
41
                throw new IOException("Can't open sheet "+sheetIndex+" from '"+Objects.toString(spreadFile)+"'.", ex);
42
            }
43
        }
44

  
45
        @Override
46
        public int getColumnCount() {
47
            return this.sheetExcel.getColumns();
48
        }
49

  
50
        @Override
51
        public Rectangle getUsedRange() {
52
            return null;
53
        }
54
        
55
        @Override
56
        public List<String> getColumnNames(boolean isFirstLineHedaer) {
57
            int columns = this.getColumnCount();
58
            List<String> columnNames = new ArrayList<>(columns);
59

  
60
            String abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
61
            if (columns > abc.length()) {
62
                for (int i = 0; i < columns; i++) {
63
                    columnNames.add("C" + i);
64
                }
65
            } else {
66
                for (int i = 0; i < columns; i++) {
67
                    columnNames.add(abc.substring(i, i + 1));
68
                }
69
            }
70
            if (isFirstLineHedaer) {
71
                for (int col = 0; col < columns; col++) {
72
                    Object value = this.getValueAt(col, 0);
73
                    String s = Objects.toString(value);
74
                    if (!StringUtils.isBlank(s)) {
75
                        columnNames.set(col, s);
76
                    }
77
                }
78
            }
79
            return columnNames;
80
        }
81

  
82
        @Override
83
        public File getFile() {
84
            return this.spreadFile;
85
        }
86

  
87
        @Override
88
        public String getName() {
89
            return this.sheetExcel.getName();
90
        }
91

  
92
        @Override
93
        public int getRowCount() {
94
            return this.sheetExcel.getRows();
95
        }
96

  
97
        @Override
98
        public int getSheetIndex() {
99
            return this.sheetIndex;
100
        }
101

  
102
        @Override
103
        public Object getValueAt(int col, int row) {
104
            Cell cell = this.sheetExcel.getCell(col, row);
105
            Object value = cell.getContents();
106
            return value;
107
        }
108

  
109
    }
110

  
111
    private File spreadFile;
112

  
113
    public JExcelSpread() {
114

  
115
    }
116

  
117
    @Override
118
    public void open(File spreadFile) {
119
        this.spreadFile = spreadFile;
120
    }
121

  
122
    @Override
123
    public File getFile() {
124
        return this.spreadFile;
125
    }
126

  
127
    @Override
128
    public Sheet getSheet(int sheetIndex) {
129
        try {
130
            if (spreadFile == null || sheetIndex < 0) {
131
                return null;
132
            }
133
            return new SheetJExcel(spreadFile, sheetIndex);
134
        } catch (IOException ex) {
135
            return null;
136
        }
137
    }
138

  
139
    @Override
140
    public List<String> getSheetNames() {
141
        try {
142
            List<String> r = new ArrayList<>();
143
            Workbook workbook = Workbook.getWorkbook(spreadFile);
144
            r.addAll(Arrays.asList(workbook.getSheetNames()));
145
            return r;
146
        } catch (Exception ex) {
147
            return Collections.EMPTY_LIST;
148
        }
149
    }
150

  
151
}
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.provider/src/main/java/org/gvsig/jexcel/Spread.java
1
package org.gvsig.jexcel;
2

  
3
import java.awt.Rectangle;
4
import java.io.File;
5
import java.util.List;
6

  
7
/**
8
 *
9
 * @author jjdelcerro
10
 */
11
public interface Spread {
12

  
13
    public static String NAME = "Excel";
14

  
15
    public static Spread create(File file, Object... args) {
16
        JExcelSpread spread = new JExcelSpread();
17
        spread.open(file);
18
        return spread;
19
    }
20

  
21
    public interface Sheet {
22

  
23
        int getColumnCount();
24

  
25
        List<String> getColumnNames(boolean isFirstLineHedaer);
26

  
27
        File getFile();
28

  
29
        String getName();
30

  
31
        int getRowCount();
32

  
33
        int getSheetIndex();
34

  
35
        Object getValueAt(int col, int row);
36

  
37
        public Rectangle getUsedRange();
38
    }
39

  
40
    public void open(File spreadFile);
41

  
42
    public File getFile();
43

  
44
    public Sheet getSheet(int sheetIndex);
45

  
46
    public List<String> getSheetNames();
47
}
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.provider/src/main/java/org/gvsig/jexcel/JExcelLibrary.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.jexcel;
25

  
26
import java.util.ArrayList;
27
import java.util.List;
28

  
29
import org.gvsig.fmap.dal.DALFileLibrary;
30
import org.gvsig.fmap.dal.DALFileLocator;
31
import org.gvsig.fmap.dal.DALLibrary;
32
import org.gvsig.fmap.dal.DALLocator;
33
import org.gvsig.fmap.dal.FileHelper;
34
import org.gvsig.fmap.dal.spi.DataManagerProviderServices;
35
import org.gvsig.jexcel.dal.provider.JExcelFilesystemServerProvider;
36
import org.gvsig.jexcel.dal.provider.JExcelStoreParameters;
37
import org.gvsig.jexcel.dal.provider.JExcelStoreProvider;
38
import org.gvsig.jexcel.dal.provider.JExcelStoreProviderFactory;
39
import org.gvsig.jexcel.dynformfield.point.JDynFormFieldExcelPointFieldsFactory;
40
import org.gvsig.jexcel.dynformfield.sheet.JDynFormFieldExcelSheetFactory;
41
import org.gvsig.metadata.exceptions.MetadataException;
42
import org.gvsig.tools.dynform.spi.DynFormSPILocator;
43
import org.gvsig.tools.dynform.spi.DynFormSPIManager;
44
import org.gvsig.tools.library.AbstractLibrary;
45
import org.gvsig.tools.library.LibraryException;
46

  
47
public class JExcelLibrary extends AbstractLibrary {
48

  
49
    @Override
50
    public void doRegistration() {
51
        registerAsServiceOf(DALLibrary.class);
52
        require(DALFileLibrary.class);
53
    }
54

  
55
    @Override
56
    protected void doInitialize() throws LibraryException {
57
    }
58

  
59
    @Override
60
    protected void doPostInitialize() throws LibraryException {
61
        List<Throwable> exs = new ArrayList<Throwable>();
62

  
63
        FileHelper.registerParametersDefinition(
64
                JExcelStoreParameters.PARAMETERS_DEFINITION_NAME,
65
                JExcelStoreParameters.class, "JExcelParameters.xml");
66
        try {
67
            FileHelper.registerMetadataDefinition(
68
                    JExcelStoreProvider.METADATA_DEFINITION_NAME,
69
                    JExcelStoreProvider.class, "JExcelMetadata.xml");
70
        } catch (MetadataException e) {
71
            exs.add(e);
72
        }
73

  
74
        DataManagerProviderServices dataman = (DataManagerProviderServices) DALLocator
75
                .getDataManager();
76

  
77
        try {
78
            if (!dataman.getStoreProviders().contains(JExcelStoreProvider.NAME)) {
79
                dataman.registerStoreProviderFactory(new JExcelStoreProviderFactory(JExcelStoreProvider.NAME, JExcelStoreProvider.DESCRIPTION));
80

  
81
            }
82
        } catch (RuntimeException e) {
83
            exs.add(e);
84
        }
85

  
86
        try {
87
            DALFileLocator.getFilesystemServerExplorerManager()
88
                    .registerProvider(JExcelStoreProvider.NAME,
89
                            JExcelStoreProvider.DESCRIPTION,
90
                            JExcelFilesystemServerProvider.class);
91
        } catch (RuntimeException e) {
92
            exs.add(e);
93
        }
94

  
95
        DynFormSPIManager manager = DynFormSPILocator.getDynFormSPIManager();
96
        manager.registerDynFieldFactory(new JDynFormFieldExcelSheetFactory());
97
        manager.registerDynFieldFactory(new JDynFormFieldExcelPointFieldsFactory());
98

  
99
        if (exs.size() > 0) {
100
            throw new LibraryException(this.getClass(), exs);
101
        }
102
    }
103
}
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.provider/src/main/java/org/gvsig/jexcel/dal/provider/JExcelFilesystemServerProvider.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.jexcel.dal.provider;
25

  
26
import java.io.File;
27

  
28
import org.gvsig.fmap.dal.DALLocator;
29
import org.gvsig.fmap.dal.DataManager;
30
import org.gvsig.fmap.dal.DataServerExplorer;
31
import org.gvsig.fmap.dal.DataStoreParameters;
32
import org.gvsig.fmap.dal.NewDataStoreParameters;
33
import org.gvsig.fmap.dal.exception.CreateException;
34
import org.gvsig.fmap.dal.exception.DataException;
35
import org.gvsig.fmap.dal.exception.FileNotFoundException;
36
import org.gvsig.fmap.dal.exception.RemoveException;
37
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
38
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
39
import org.gvsig.fmap.dal.serverexplorer.filesystem.impl.AbstractFilesystemServerExplorerProvider;
40
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProvider;
41
import org.gvsig.fmap.dal.serverexplorer.filesystem.spi.FilesystemServerExplorerProviderServices;
42

  
43
public class JExcelFilesystemServerProvider extends AbstractFilesystemServerExplorerProvider 
44
	implements FilesystemServerExplorerProvider, ResourceConsumer {
45

  
46
	private FilesystemServerExplorerProviderServices serverExplorer;
47

  
48
	public String getDataStoreProviderName() {
49
		return JExcelStoreProvider.NAME;
50
	}
51

  
52
	public int getMode() {
53
		return DataServerExplorer.MODE_FEATURE | DataServerExplorer.MODE_GEOMETRY;
54
	}
55

  
56
	public boolean accept(File pathname) {
57
		return (pathname.getName().toLowerCase().endsWith(".xls"));
58
	}
59

  
60
	public String getDescription() {
61
		return JExcelStoreProvider.DESCRIPTION;
62
	}
63

  
64
	public DataStoreParameters getParameters(File file) throws DataException {
65
		DataManager manager = DALLocator.getDataManager();
66
		JExcelStoreParameters params = (JExcelStoreParameters) manager
67
				.createStoreParameters(this
68
				.getDataStoreProviderName());
69
		params.setFile(file);
70
		return params;
71
	}
72

  
73
	public boolean canCreate() {
74
		return false;
75
	}
76

  
77
	public boolean canCreate(NewDataStoreParameters parameters) {
78
			throw new UnsupportedOperationException(); 
79
	}
80

  
81
	public void create(NewDataStoreParameters parameters, boolean overwrite)
82
			throws CreateException {
83
		throw new UnsupportedOperationException(); 
84
	}
85

  
86
	public NewDataStoreParameters getCreateParameters() throws DataException {
87
		throw new UnsupportedOperationException(); 
88
	}
89

  
90
	public void initialize(
91
			FilesystemServerExplorerProviderServices serverExplorer) {
92
		this.serverExplorer = serverExplorer;
93
	}
94

  
95
	public void remove(DataStoreParameters parameters) throws RemoveException {
96
		File file = ((JExcelStoreParameters) parameters).getFile();
97
		if (!file.exists()) {
98
			throw new RemoveException(this.getDataStoreProviderName(),
99
					new FileNotFoundException(file));
100
		}
101
		if (!file.delete()) {
102
			// FIXME throws ???
103
		}
104

  
105
	}
106

  
107
	public boolean closeResourceRequested(ResourceProvider resource) {
108
		// while it is using a resource anyone can't close it
109
		return false;
110
	}
111

  
112
	public void resourceChanged(ResourceProvider resource) {
113
		//Do nothing
114

  
115
	}
116

  
117

  
118
}
org.gvsig.jexcel/tags/org.gvsig.jexcel-1.0.87/org.gvsig.jexcel.provider/src/main/java/org/gvsig/jexcel/dal/provider/JExcelStoreProvider.java
1
/**
2
 * gvSIG. Desktop Geographic Information System.
3
 *
4
 * Copyright (C) 2007-2013 gvSIG Association.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 3
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA 02110-1301, USA.
20
 *
21
 * For any additional information, do not hesitate to contact us
22
 * at info AT gvsig.com, or visit our website www.gvsig.com.
23
 */
24
package org.gvsig.jexcel.dal.provider;
25

  
26
import java.io.File;
27
import java.io.IOException;
28
import java.text.SimpleDateFormat;
29
import java.util.ArrayList;
30
import java.util.HashMap;
31
import java.util.Iterator;
32
import java.util.List;
33
import java.util.Locale;
34
import jxl.Cell;
35
import jxl.Sheet;
36
import jxl.Workbook;
37
import jxl.read.biff.BiffException;
38

  
39
import org.apache.commons.io.FilenameUtils;
40
import org.apache.commons.lang3.StringUtils;
41
import org.cresques.cts.IProjection;
42
import org.gvsig.fmap.dal.DALLocator;
43
import org.gvsig.fmap.dal.DataManager;
44
import org.gvsig.fmap.dal.DataServerExplorer;
45
import org.gvsig.fmap.dal.DataStore;
46
import org.gvsig.fmap.dal.DataStoreNotification;
47
import org.gvsig.fmap.dal.DataTypes;
48
import org.gvsig.fmap.dal.FileHelper;
49
import org.gvsig.fmap.dal.exception.DataException;
50
import org.gvsig.fmap.dal.exception.InitializeException;
51
import org.gvsig.fmap.dal.exception.OpenException;
52
import org.gvsig.fmap.dal.exception.ReadException;
53
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
54
import org.gvsig.fmap.dal.feature.EditableFeature;
55
import org.gvsig.fmap.dal.feature.EditableFeatureAttributeDescriptor;
56
import org.gvsig.fmap.dal.feature.EditableFeatureType;
57
import org.gvsig.fmap.dal.feature.Feature;
58
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
59
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator;
60
import org.gvsig.fmap.dal.feature.FeatureStore;
61
import org.gvsig.fmap.dal.feature.FeatureType;
62
import org.gvsig.fmap.dal.feature.exception.PerformEditingException;
63
import org.gvsig.fmap.dal.feature.spi.FeatureProvider;
64
import org.gvsig.fmap.dal.feature.spi.FeatureStoreProviderServices;
65
import org.gvsig.fmap.dal.feature.spi.memory.AbstractMemoryStoreProvider;
66
import org.gvsig.fmap.dal.resource.file.FileResource;
67
import org.gvsig.fmap.dal.resource.spi.ResourceConsumer;
68
import org.gvsig.fmap.dal.resource.spi.ResourceProvider;
69
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorer;
70
import org.gvsig.fmap.dal.serverexplorer.filesystem.FilesystemServerExplorerParameters;
71
import org.gvsig.fmap.dal.spi.DataStoreProviderServices;
72
import org.gvsig.fmap.geom.Geometry;
73
import org.gvsig.fmap.geom.GeometryLocator;
74
import org.gvsig.fmap.geom.GeometryManager;
75
import org.gvsig.fmap.geom.aggregate.MultiPoint;
76
import org.gvsig.fmap.geom.primitive.Envelope;
77
import org.gvsig.fmap.geom.primitive.Point;
78
import org.gvsig.fmap.geom.type.GeometryType;
79
import org.gvsig.tools.ToolsLocator;
80
import org.gvsig.tools.dataTypes.Coercion;
81
import org.gvsig.tools.dataTypes.CoercionException;
82
import org.gvsig.tools.dataTypes.DataType;
83
import org.gvsig.tools.dataTypes.DataTypesManager;
84
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
85
import org.gvsig.tools.exception.BaseException;
86
import org.gvsig.tools.exception.NotYetImplemented;
87
import org.gvsig.tools.persistence.PersistentState;
88
import org.gvsig.tools.persistence.exception.PersistenceException;
89
import org.gvsig.tools.task.SimpleTaskStatus;
90
import org.gvsig.tools.task.TaskStatusManager;
91
import org.gvsig.tools.visitor.VisitCanceledException;
92
import org.gvsig.tools.visitor.Visitor;
93
import org.slf4j.Logger;
94
import org.slf4j.LoggerFactory;
95

  
96
public class JExcelStoreProvider extends AbstractMemoryStoreProvider implements
97
        ResourceConsumer {
98

  
99
    private static final Logger logger = LoggerFactory.getLogger(JExcelStoreProvider.class);
100

  
101
    public static final String NAME = "JExcel";
102
    public static final String DESCRIPTION = "JExcel file";
103

  
104
    public static final String METADATA_DEFINITION_NAME = NAME;
105

  
106
    private ResourceProvider resource;
107

  
108
    private long counterNewsOIDs = 0;
109
    private Envelope envelope;
110
    private boolean need_calculate_envelope = false;
111
    private SimpleTaskStatus taskStatus;
112
    private String sheetName = "";
113

  
114
    public JExcelStoreProvider(JExcelStoreParameters parameters,
115
            DataStoreProviderServices storeServices) throws InitializeException {
116
        super(
117
                parameters,
118
                storeServices,
119
                FileHelper.newMetadataContainer(METADATA_DEFINITION_NAME)
120
        );
121

  
122
        TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
123
        this.taskStatus = manager.createDefaultSimpleTaskStatus("JExcel");
124

  
125
        counterNewsOIDs = 0;
126

  
127
        File file = getJExcelParameters().getFile();
128
        resource = this.createResource(
129
                FileResource.NAME,
130
                new Object[]{file.getAbsolutePath()}
131
        );
132

  
133
        resource.addConsumer(this);
134
        initializeFeatureTypes();
135
    }
136

  
137
    private JExcelStoreParameters getJExcelParameters() {
138
        return (JExcelStoreParameters) this.getParameters();
139
    }
140

  
141
    public String getProviderName() {
142
        return NAME;
143
    }
144

  
145
    public boolean allowWrite() {
146
        return false;
147
    }
148

  
149
    private String getFullFileName() {
150
        // Usar solo para mostrar mensajes en el logger.
151
        String s = "(unknow)";
152
        try {
153
            s = getJExcelParameters().getFile().getAbsolutePath();
154
        } catch (Exception e2) {
155
            s = "(unknow)";
156
        }
157
        return s;
158
    }
159

  
160
    @Override
161
    public void open() throws OpenException {
162
        if ( this.data != null ) {
163
            return;
164
        }
165
        this.data = new ArrayList<>();
166
        resource.setData(new HashMap());
167
        counterNewsOIDs = 0;
168
        try {
169
            loadFeatures();
170
        } catch (RuntimeException e) {
171
            logger.warn("Can't load features from JExcel '" + getFullFileName() + "'.", e);
172
            throw e;
173
        } catch (Exception e) {
174
            logger.warn("Can't load features from JExcel '" + getFullFileName() + "'.", e);
175
            throw new RuntimeException(e);
176
        }
177
    }
178

  
179
    public DataServerExplorer getExplorer() throws ReadException {
180
        DataManager manager = DALLocator.getDataManager();
181
        FilesystemServerExplorerParameters params;
182
        try {
183
            params = (FilesystemServerExplorerParameters) manager
184
                    .createServerExplorerParameters(FilesystemServerExplorer.NAME);
185
            params.setRoot(this.getJExcelParameters().getFile().getParent());
186
            return manager.openServerExplorer(FilesystemServerExplorer.NAME, params);
187
        } catch (DataException e) {
188
            throw new ReadException(this.getProviderName(), e);
189
        } catch (ValidateDataParametersException e) {
190
            throw new ReadException(this.getProviderName(), e);
191
        }
192

  
193
    }
194

  
195
    public void performChanges(Iterator deleteds, Iterator inserteds, Iterator updateds, Iterator originalFeatureTypesUpdated) throws PerformEditingException {
196
        throw new UnsupportedOperationException();
197
    }
198

  
199
    public boolean closeResourceRequested(ResourceProvider resource) {
200
        return true;
201
    }
202

  
203
    public int getOIDType() {
204
        return DataTypes.LONG;
205
    }
206

  
207
    public boolean supportsAppendMode() {
208
        return false;
209
    }
210

  
211
    public void append(FeatureProvider featureProvider) {
212
        throw new UnsupportedOperationException();
213
    }
214

  
215
    public void beginAppend() {
216
        throw new UnsupportedOperationException();
217
    }
218

  
219
    public void endAppend() {
220
        throw new UnsupportedOperationException();
221
    }
222

  
223
    public void saveToState(PersistentState state) throws PersistenceException {
224
        throw new NotYetImplemented();
225
    }
226

  
227
    public void loadFromState(PersistentState state) throws PersistenceException {
228
        throw new NotYetImplemented();
229
    }
230

  
231
    public Object createNewOID() {
232
        return new Long(counterNewsOIDs++);
233
    }
234

  
235
    protected void initializeFeatureTypes() throws InitializeException {
236
        try {
237
            this.open();
238
        } catch (OpenException e) {
239
            throw new InitializeException(this.getProviderName(), e);
240
        }
241
    }
242

  
243
    public Envelope getEnvelope() throws DataException {
244
        this.open();
245
        if ( this.envelope != null ) {
246
            return this.envelope;
247
        }
248
        if ( !this.need_calculate_envelope ) {
249
            return null;
250
        }
251
        FeatureStore fs = this.getFeatureStore();
252
        FeatureType ft = fs.getDefaultFeatureType();
253
        FeatureAttributeDescriptor fad = ft.getAttributeDescriptor(ft.getDefaultGeometryAttributeIndex());
254

  
255
        try {
256
            this.envelope = GeometryLocator.getGeometryManager().createEnvelope(fad.getGeomType().getSubType());
257
            fs.accept(new Visitor() {
258
                public void visit(Object obj) throws VisitCanceledException, BaseException {
259
                    Feature f = (Feature) obj;
260
                    Geometry geom = f.getDefaultGeometry();
261
                    if ( geom != null ) {
262
                        envelope.add(geom.getEnvelope());
263
                    }
264
                }
265
            });
266
        } catch (BaseException e) {
267
            logger.warn("Can't calculate the envelope of JExcel file '" + this.getFullName() + "'.", e);
268
            this.envelope = null;
269
        }
270

  
271
        this.need_calculate_envelope = false;
272
        return this.envelope;
273
    }
274

  
275
    public Object getDynValue(String name) throws DynFieldNotFoundException {
276
        if ( DataStore.METADATA_ENVELOPE.equalsIgnoreCase(name) ) {
277
            try {
278
                return this.getEnvelope();
279
            } catch (DataException e) {
280
                return null;
281
            }
282
        } else {
283
            if ( DataStore.METADATA_CRS.equalsIgnoreCase(name) ) {
284
                IProjection pro = JExcelStoreParameters.getCRS(this.getJExcelParameters());
285
                if ( pro != null ) {
286
                    return pro;
287
                }
288
            }
289
        }
290
        return super.getDynValue(name);
291
    }
292

  
293
    public void resourceChanged(ResourceProvider resource) {
294
        this.getStoreServices().notifyChange(
295
                DataStoreNotification.RESOURCE_CHANGED,
296
                resource);
297
    }
298

  
299
    public Object getSourceId() {
300
        return this.getJExcelParameters().getFile();
301
    }
302

  
303
    public String getName() {
304
        String name = this.getJExcelParameters().getFile().getName();
305
        if( StringUtils.isBlank(this.sheetName) ) {
306
            return FilenameUtils.getBaseName(name);
307
        }
308
        return FilenameUtils.getBaseName(name)+"."+this.sheetName;
309
    }
310

  
311
    public String getFullName() {
312
        return this.getJExcelParameters().getFile().getAbsolutePath();
313
    }
314

  
315
    public ResourceProvider getResource() {
316
        return resource;
317
    }
318

  
319
    private class FieldTypeParser {
320

  
321
        public String name = null;
322
        public int type = DataTypes.STRING;
323
        public int size = 0;
324
        public boolean allowNulls = true;
325

  
326
        private String typename = "string";
327

  
328
        FieldTypeParser() {
329
        }
330

  
331
        private int getType(String value) {
332
            DataTypesManager dataTypesManager = ToolsLocator.getDataTypesManager();
333
            return dataTypesManager.getType(typename);
334
        }
335

  
336
        // El formato seria:
337
        //   name[:typename[:size[:notnull|null]]]
338
        //   name[__typename[__size[__notnull|null]]]
339
        //
340
        public boolean parse(String value) {
341
            String typename = null;
342
            String[] ss = null;
343
            if ( value.contains(":") ) {
344
                ss = value.split(":");
345
            } else if ( value.contains("__") ) {
346
                ss = value.split("__");
347
            }
348
            if ( ss == null ) {
349
                this.name = value;
350
                return true;
351
            }
352
            switch (ss.length) {
353
            case 4:
354
                if ( ss[3].length() > 0 ) {
355
                    if ( "notnull".equalsIgnoreCase(ss[3]) ) {
356
                        this.allowNulls = false;
357
                    } else {
358
                        this.allowNulls = true;
359
                    }
360
                }
361
            case 3:
362
                if ( ss[2].length() > 0 ) {
363
                    try {
364
                        this.size = Integer.parseInt(ss[2]);
365
                    } catch (Exception ex) {
366
                        logger.warn("Ignore incorrect field size for field " + value + " in JExcel header of '" + getFullFileName() + "'.", ex);
367
                    }
368
                }
369
            case 2:
370
                if ( ss[1].length() > 0 ) {
371
                    this.typename = ss[1];
372
                    this.type = this.getType(this.typename);
373
                    if ( this.type == DataTypes.INVALID ) {
374
                        this.type = DataTypes.STRING;
375
                        logger.info("Type '" + typename + "' not valid for attribute '" + value + "' in JExcel file '" + getFullFileName() + "'.");
376
                    }
377
                }
378
            case 1:
379
                this.name = ss[0];
380
                break;
381
            }
382

  
383
            if ( this.type != DataTypes.STRING ) {
384
                this.size = 0;
385
            }
386
            return true;
387
        }
388

  
389
    }
390

  
391
    private EditableFeatureType getFeatureType(String headers[], int automaticTypes[]) {
392
        EditableFeatureType fType = getStoreServices().createFeatureType(this.getName());
393
        fType.setHasOID(true);
394
        DataTypesManager dataTypesManager = ToolsLocator.getDataTypesManager();
395

  
396
        FieldTypeParser[] fieldTypes = new FieldTypeParser[headers.length];
397
        //
398
        // Calculamos cuales pueden ser los tipos de datos
399
        //
400
        for ( int i = 0; i < fieldTypes.length; i++ ) {
401
            fieldTypes[i] = new FieldTypeParser();
402
        }
403

  
404
        // Asuminos los tipos pasados por parametro, que se supone
405
        // son los detectados automaticamente.
406
        if ( automaticTypes != null ) {
407
            for ( int i = 0; i < fieldTypes.length && i < automaticTypes.length; i++ ) {
408
                fieldTypes[i].type = automaticTypes[i];
409
            }
410
        }
411
        // Luego probamos con lo que diga las cabezeras del CVS, sobreescribiendo
412
        // los tipos anteriores en caso de definirse en la cabezara.
413
        for ( int i = 0; i < fieldTypes.length; i++ ) {
414
            if ( !fieldTypes[i].parse(headers[i]) ) {
415
                continue;
416
            }
417

  
418
        }
419

  
420
        // Y por ultimo hacemos caso a lo que se haya especificado en los parametros
421
        // de apertura del JExcel, teniendo esto prioridad sobre todo.
422
        int[] param_types = JExcelStoreParameters.getFieldTypes(this.getParameters());
423
        if ( param_types != null ) {
424
            for ( int i = 0; i < fieldTypes.length && i < param_types.length; i++ ) {
425
                fieldTypes[i].type = param_types[i];
426
            }
427
        }
428

  
429
        int[] param_sizes = JExcelStoreParameters.getFieldSizes(this.getParameters());
430
        if ( param_sizes != null ) {
431
            for ( int i = 0; i < param_sizes.length; i++ ) {
432
                if ( param_sizes[i] > 0 ) {
433
                    fieldTypes[i].size = param_sizes[i];
434
                }
435
            }
436
        }
437
        //
438
        // Una vez ya sabemos los tipos de datos rellenamos el feature-type
439
        //
440
        for ( int i = 0; i < fieldTypes.length; i++ ) {
441
            EditableFeatureAttributeDescriptor fad = fType.add(
442
                    fieldTypes[i].name,
443
                    fieldTypes[i].type
444
            );
445
            fad.setSize(fieldTypes[i].size);
446
            fad.setAllowNull(fieldTypes[i].allowNulls);
447
            if ( fieldTypes[i].type == DataTypes.GEOMETRY
448
                    && fType.getDefaultGeometryAttributeName() == null ) {
449
                fType.setDefaultGeometryAttributeName(fieldTypes[i].name);
450
            }
451
        }
452
        String[] pointDimensionNames = JExcelStoreParameters.getPointDimensionNames(this.getParameters());
453
        if ( pointDimensionNames != null ) {
454
//            ToPointEvaluaror evaluator = new ToPointEvaluaror(pointDimensionNames);
455
            PointAttributeEmulator emulator = new PointAttributeEmulator(pointDimensionNames);
456
            EditableFeatureAttributeDescriptor attr = fType.add("GEOM", DataTypes.GEOMETRY, emulator);
457
            GeometryManager geommgr = GeometryLocator.getGeometryManager();
458
            GeometryType gt;
459
            try {
460
                if ( emulator.fieldNames != null && emulator.fieldNames.length <= 2 ) {
461
                	gt = geommgr.getGeometryType(Geometry.TYPES.GEOMETRY, Geometry.SUBTYPES.GEOM2D);
462
                } else {
463
                	gt = geommgr.getGeometryType(Geometry.TYPES.GEOMETRY, Geometry.SUBTYPES.GEOM3D);
464
                }
465
                attr.setGeometryType(gt);
466
            } catch (Exception e) {
467
                logger.warn("Can't set geometry type for the calculated field in JExcel file '" + getFullFileName() + "'.", e);
468
            }
469
        }
470
        return fType;
471
    }
472

  
473
    static class PointAttributeEmulator implements FeatureAttributeEmulator {
474

  
475
        private static final Logger logger = LoggerFactory.getLogger(PointAttributeEmulator.class);
476

  
477
        private static final int XNAME = 0;
478
        private static final int YNAME = 1;
479
        private static final int ZNAME = 2;
480

  
481
        private final GeometryManager geommgr;
482
        private final String[] fieldNames;
483
        private final Coercion toDouble;
484
        private final DataType dataType;
485
        private int errorcount = 0;
486

  
487
        public PointAttributeEmulator(String[] pointDimensionNames) {
488
            if ( pointDimensionNames.length > 2 ) {
489
                this.fieldNames = new String[3];
490
                this.fieldNames[ZNAME] = pointDimensionNames[2];
491
            } else {
492
                this.fieldNames = new String[2];
493
            }
494
            this.fieldNames[XNAME] = pointDimensionNames[0];
495
            this.fieldNames[YNAME] = pointDimensionNames[1];
496
            this.geommgr = GeometryLocator.getGeometryManager();
497
            DataTypesManager datatypeManager = ToolsLocator.getDataTypesManager();
498

  
499
            this.toDouble = datatypeManager.getCoercion(DataTypes.DOUBLE);
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff