Lines 35-42
Link Here
|
35 |
import org.apache.poi.hssf.record.UnknownRecord; |
35 |
import org.apache.poi.hssf.record.UnknownRecord; |
36 |
import org.apache.poi.hssf.record.VCenterRecord; |
36 |
import org.apache.poi.hssf.record.VCenterRecord; |
37 |
import org.apache.poi.hssf.record.formula.Area3DPtg; |
37 |
import org.apache.poi.hssf.record.formula.Area3DPtg; |
|
|
38 |
import org.apache.poi.hssf.record.formula.AreaPtgBase; |
38 |
import org.apache.poi.hssf.record.formula.Ptg; |
39 |
import org.apache.poi.hssf.record.formula.Ptg; |
39 |
import org.apache.poi.hssf.record.chart.LinkedDataRecord; |
40 |
import org.apache.poi.ss.util.CellRangeAddressBase; |
40 |
|
41 |
|
41 |
/** |
42 |
/** |
42 |
* Has methods for construction of a chart object. |
43 |
* Has methods for construction of a chart object. |
Lines 44-49
Link Here
|
44 |
* @author Glen Stampoultzis (glens at apache.org) |
45 |
* @author Glen Stampoultzis (glens at apache.org) |
45 |
*/ |
46 |
*/ |
46 |
public final class HSSFChart { |
47 |
public final class HSSFChart { |
|
|
48 |
private HSSFSheet sheet; |
47 |
private ChartRecord chartRecord; |
49 |
private ChartRecord chartRecord; |
48 |
|
50 |
|
49 |
private LegendRecord legendRecord; |
51 |
private LegendRecord legendRecord; |
Lines 53-60
Link Here
|
53 |
|
55 |
|
54 |
private List<HSSFSeries> series = new ArrayList<HSSFSeries>(); |
56 |
private List<HSSFSeries> series = new ArrayList<HSSFSeries>(); |
55 |
|
57 |
|
56 |
private HSSFChart(ChartRecord chartRecord) { |
58 |
private HSSFChart(HSSFSheet sheet, ChartRecord chartRecord) { |
57 |
this.chartRecord = chartRecord; |
59 |
this.chartRecord = chartRecord; |
|
|
60 |
this.sheet = sheet; |
58 |
} |
61 |
} |
59 |
|
62 |
|
60 |
/** |
63 |
/** |
Lines 146-167
Link Here
|
146 |
for(RecordBase r : records) { |
149 |
for(RecordBase r : records) { |
147 |
|
150 |
|
148 |
if(r instanceof ChartRecord) { |
151 |
if(r instanceof ChartRecord) { |
149 |
lastChart = new HSSFChart((ChartRecord)r); |
152 |
lastSeries = null; |
|
|
153 |
|
154 |
lastChart = new HSSFChart(sheet,(ChartRecord)r); |
150 |
charts.add(lastChart); |
155 |
charts.add(lastChart); |
151 |
} |
156 |
} else if(r instanceof LegendRecord) { |
152 |
if(r instanceof LegendRecord) { |
|
|
153 |
lastChart.legendRecord = (LegendRecord)r; |
157 |
lastChart.legendRecord = (LegendRecord)r; |
154 |
} |
158 |
} else if(r instanceof SeriesRecord) { |
155 |
if(r instanceof SeriesRecord) { |
|
|
156 |
HSSFSeries series = lastChart.new HSSFSeries( (SeriesRecord)r ); |
159 |
HSSFSeries series = lastChart.new HSSFSeries( (SeriesRecord)r ); |
157 |
lastChart.series.add(series); |
160 |
lastChart.series.add(series); |
158 |
lastSeries = series; |
161 |
lastSeries = series; |
159 |
} |
162 |
} else if(r instanceof ChartTitleFormatRecord) { |
160 |
if(r instanceof ChartTitleFormatRecord) { |
|
|
161 |
lastChart.chartTitleFormat = |
163 |
lastChart.chartTitleFormat = |
162 |
(ChartTitleFormatRecord)r; |
164 |
(ChartTitleFormatRecord)r; |
163 |
} |
165 |
} else if(r instanceof SeriesTextRecord) { |
164 |
if(r instanceof SeriesTextRecord) { |
|
|
165 |
// Applies to a series, unless we've seen |
166 |
// Applies to a series, unless we've seen |
166 |
// a legend already |
167 |
// a legend already |
167 |
SeriesTextRecord str = (SeriesTextRecord)r; |
168 |
SeriesTextRecord str = (SeriesTextRecord)r; |
Lines 173-184
Link Here
|
173 |
} else { |
174 |
} else { |
174 |
lastChart.chartTitleText = str; |
175 |
lastChart.chartTitleText = str; |
175 |
} |
176 |
} |
176 |
} |
177 |
} else if (r instanceof LinkedDataRecord) { |
177 |
if(r instanceof LinkedDataRecord) { |
178 |
LinkedDataRecord linkedDataRecord = (LinkedDataRecord) r; |
178 |
LinkedDataRecord data = (LinkedDataRecord)r; |
179 |
if (lastSeries != null) { |
179 |
lastSeries.insertData( data ); |
180 |
lastSeries.insertData(linkedDataRecord); |
180 |
} |
181 |
} |
181 |
if(r instanceof ValueRangeRecord){ |
182 |
} else if(r instanceof ValueRangeRecord){ |
182 |
lastChart.valueRanges.add((ValueRangeRecord)r); |
183 |
lastChart.valueRanges.add((ValueRangeRecord)r); |
183 |
} |
184 |
} |
184 |
} |
185 |
} |
Lines 914-920
Link Here
|
914 |
this.series = series; |
915 |
this.series = series; |
915 |
} |
916 |
} |
916 |
|
917 |
|
917 |
public void insertData(LinkedDataRecord data){ |
918 |
/* package */ void insertData(LinkedDataRecord data){ |
918 |
switch(dataReaded){ |
919 |
switch(dataReaded){ |
919 |
case 0: dataName = data; |
920 |
case 0: dataName = data; |
920 |
break; |
921 |
break; |
Lines 928-933
Link Here
|
928 |
dataReaded++; |
929 |
dataReaded++; |
929 |
} |
930 |
} |
930 |
|
931 |
|
|
|
932 |
/* package */ void setSeriesTitleText(SeriesTextRecord seriesTitleText) |
933 |
{ |
934 |
this.seriesTitleText = seriesTitleText; |
935 |
} |
936 |
|
931 |
public short getNumValues() { |
937 |
public short getNumValues() { |
932 |
return series.getNumValues(); |
938 |
return series.getNumValues(); |
933 |
} |
939 |
} |
Lines 996-1000
Link Here
|
996 |
public SeriesRecord getSeries() { |
1002 |
public SeriesRecord getSeries() { |
997 |
return series; |
1003 |
return series; |
998 |
} |
1004 |
} |
|
|
1005 |
|
1006 |
private CellRangeAddressBase getCellRange(LinkedDataRecord linkedDataRecord) { |
1007 |
if (linkedDataRecord == null) |
1008 |
{ |
1009 |
return null ; |
1010 |
} |
1011 |
|
1012 |
int firstRow = 0; |
1013 |
int lastRow = 0; |
1014 |
int firstCol = 0; |
1015 |
int lastCol = 0; |
1016 |
|
1017 |
for (Ptg ptg : linkedDataRecord.getFormulaOfLink()) { |
1018 |
if (ptg instanceof AreaPtgBase) { |
1019 |
AreaPtgBase areaPtg = (AreaPtgBase) ptg; |
1020 |
|
1021 |
firstRow = areaPtg.getFirstRow(); |
1022 |
lastRow = areaPtg.getLastRow(); |
1023 |
|
1024 |
firstCol = areaPtg.getFirstColumn(); |
1025 |
lastCol = areaPtg.getLastColumn(); |
1026 |
} |
1027 |
} |
1028 |
|
1029 |
return new CellRangeAddressBase(firstRow, lastRow, firstCol, lastCol); |
1030 |
} |
1031 |
|
1032 |
public CellRangeAddressBase getValuesCellRange() { |
1033 |
return getCellRange(dataValues); |
1034 |
} |
1035 |
|
1036 |
public CellRangeAddressBase getCategoryLabelsCellRange() { |
1037 |
return getCellRange(dataCategoryLabels); |
1038 |
} |
1039 |
|
1040 |
private Integer setVerticalCellRange(LinkedDataRecord linkedDataRecord, |
1041 |
CellRangeAddressBase range) { |
1042 |
if (linkedDataRecord == null) |
1043 |
{ |
1044 |
return null; |
1045 |
} |
1046 |
|
1047 |
List<Ptg> ptgList = new ArrayList<Ptg>(); |
1048 |
|
1049 |
int rowCount = (range.getLastRow() - range.getFirstRow()) + 1; |
1050 |
int colCount = (range.getLastColumn() - range.getFirstColumn()) + 1; |
1051 |
|
1052 |
for (Ptg ptg : linkedDataRecord.getFormulaOfLink()) { |
1053 |
if (ptg instanceof AreaPtgBase) { |
1054 |
AreaPtgBase areaPtg = (AreaPtgBase) ptg; |
1055 |
|
1056 |
areaPtg.setFirstRow(range.getFirstRow()); |
1057 |
areaPtg.setLastRow(range.getLastRow()); |
1058 |
|
1059 |
areaPtg.setFirstColumn(range.getFirstColumn()); |
1060 |
areaPtg.setLastColumn(range.getLastColumn()); |
1061 |
ptgList.add(areaPtg); |
1062 |
} |
1063 |
} |
1064 |
|
1065 |
linkedDataRecord.setFormulaOfLink(ptgList.toArray(new Ptg[ptgList.size()])); |
1066 |
|
1067 |
return rowCount * colCount; |
1068 |
} |
1069 |
|
1070 |
public void setValuesCellRange(CellRangeAddressBase range) { |
1071 |
Integer count = setVerticalCellRange(dataValues, range); |
1072 |
if (count == null) |
1073 |
{ |
1074 |
return; |
1075 |
} |
1076 |
|
1077 |
series.setNumValues((short)(int)count); |
1078 |
} |
1079 |
|
1080 |
public void setCategoryLabelsCellRange(CellRangeAddressBase range) { |
1081 |
Integer count = setVerticalCellRange(dataCategoryLabels, range); |
1082 |
if (count == null) |
1083 |
{ |
1084 |
return; |
1085 |
} |
1086 |
|
1087 |
series.setNumCategories((short)(int)count); |
1088 |
} |
999 |
} |
1089 |
} |
|
|
1090 |
|
1091 |
public HSSFSeries createSeries() throws Exception { |
1092 |
ArrayList<RecordBase> seriesTemplate = new ArrayList<RecordBase>(); |
1093 |
boolean seriesTemplateFilled = false; |
1094 |
|
1095 |
int idx = 0; |
1096 |
int deep = 0; |
1097 |
int chartRecordIdx = -1; |
1098 |
int chartDeep = -1; |
1099 |
int lastSeriesDeep = -1; |
1100 |
int endSeriesRecordIdx = -1; |
1101 |
int seriesIdx = 0; |
1102 |
final List<RecordBase> records = sheet.getSheet().getRecords(); |
1103 |
|
1104 |
/* store first series as template and find last series index */ |
1105 |
for(final RecordBase record : records) { |
1106 |
|
1107 |
idx++; |
1108 |
|
1109 |
if (record instanceof BeginRecord) { |
1110 |
deep++; |
1111 |
} else if (record instanceof EndRecord) { |
1112 |
deep--; |
1113 |
|
1114 |
if (lastSeriesDeep == deep) { |
1115 |
lastSeriesDeep = -1; |
1116 |
endSeriesRecordIdx = idx; |
1117 |
if (!seriesTemplateFilled) { |
1118 |
seriesTemplate.add(record); |
1119 |
seriesTemplateFilled = true; |
1120 |
} |
1121 |
} |
1122 |
|
1123 |
if (chartDeep == deep) { |
1124 |
break; |
1125 |
} |
1126 |
} |
1127 |
|
1128 |
if (record instanceof ChartRecord) { |
1129 |
if (record == chartRecord) { |
1130 |
chartRecordIdx = idx; |
1131 |
chartDeep = deep; |
1132 |
} |
1133 |
} else if (record instanceof SeriesRecord) { |
1134 |
if (chartRecordIdx != -1) { |
1135 |
seriesIdx++; |
1136 |
lastSeriesDeep = deep; |
1137 |
} |
1138 |
} |
1139 |
|
1140 |
if (lastSeriesDeep != -1 && !seriesTemplateFilled) { |
1141 |
seriesTemplate.add(record) ; |
1142 |
} |
1143 |
} |
1144 |
|
1145 |
/* check if a series was found */ |
1146 |
if (endSeriesRecordIdx == -1) { |
1147 |
return null; |
1148 |
} |
1149 |
|
1150 |
/* next index in the records list where the new series can be inserted */ |
1151 |
idx = endSeriesRecordIdx + 1; |
1152 |
|
1153 |
HSSFSeries newSeries = null; |
1154 |
|
1155 |
/* duplicate record of the template series */ |
1156 |
ArrayList<RecordBase> clonedRecords = new ArrayList<RecordBase>(); |
1157 |
for(final RecordBase record : seriesTemplate) { |
1158 |
|
1159 |
Record newRecord = null; |
1160 |
|
1161 |
if (record instanceof BeginRecord) { |
1162 |
newRecord = new BeginRecord(); |
1163 |
} else if (record instanceof EndRecord) { |
1164 |
newRecord = new EndRecord(); |
1165 |
} else if (record instanceof SeriesRecord) { |
1166 |
SeriesRecord seriesRecord = (SeriesRecord) ((SeriesRecord)record).clone(); |
1167 |
newSeries = new HSSFSeries(seriesRecord); |
1168 |
newRecord = seriesRecord; |
1169 |
} else if (record instanceof LinkedDataRecord) { |
1170 |
LinkedDataRecord linkedDataRecord = (LinkedDataRecord) ((LinkedDataRecord)record).clone(); |
1171 |
if (newSeries != null) { |
1172 |
newSeries.insertData(linkedDataRecord); |
1173 |
} |
1174 |
newRecord = linkedDataRecord; |
1175 |
} else if (record instanceof DataFormatRecord) { |
1176 |
DataFormatRecord dataFormatRecord = (DataFormatRecord) ((DataFormatRecord)record).clone(); |
1177 |
|
1178 |
dataFormatRecord.setSeriesIndex((short)seriesIdx) ; |
1179 |
dataFormatRecord.setSeriesNumber((short)seriesIdx) ; |
1180 |
|
1181 |
newRecord = dataFormatRecord; |
1182 |
} else if (record instanceof SeriesTextRecord) { |
1183 |
SeriesTextRecord seriesTextRecord = (SeriesTextRecord) ((SeriesTextRecord)record).clone(); |
1184 |
if (newSeries != null) { |
1185 |
newSeries.setSeriesTitleText(seriesTextRecord); |
1186 |
} |
1187 |
newRecord = seriesTextRecord; |
1188 |
} else if (record instanceof Record) { |
1189 |
newRecord = (Record) ((Record)record).clone(); |
1190 |
} |
1191 |
|
1192 |
if (newRecord != null) |
1193 |
{ |
1194 |
clonedRecords.add(newRecord); |
1195 |
} |
1196 |
} |
1197 |
|
1198 |
/* check if a user model series object was created */ |
1199 |
if (newSeries == null) |
1200 |
{ |
1201 |
return null; |
1202 |
} |
1203 |
|
1204 |
/* transfer series to record list */ |
1205 |
for(final RecordBase record : clonedRecords) { |
1206 |
records.add(idx++, record); |
1207 |
} |
1208 |
|
1209 |
return newSeries; |
1210 |
} |
1000 |
} |
1211 |
} |