use of org.apache.poi.hssf.record.chart.SeriesTextRecord in project poi by apache.
the class HSSFChart method createSeries.
public HSSFSeries createSeries() throws Exception {
ArrayList<RecordBase> seriesTemplate = new ArrayList<RecordBase>();
boolean seriesTemplateFilled = false;
int idx = 0;
int deep = 0;
int chartRecordIdx = -1;
int chartDeep = -1;
int lastSeriesDeep = -1;
int endSeriesRecordIdx = -1;
int seriesIdx = 0;
final List<RecordBase> records = sheet.getSheet().getRecords();
/* store first series as template and find last series index */
for (final RecordBase record : records) {
idx++;
if (record instanceof BeginRecord) {
deep++;
} else if (record instanceof EndRecord) {
deep--;
if (lastSeriesDeep == deep) {
lastSeriesDeep = -1;
endSeriesRecordIdx = idx;
if (!seriesTemplateFilled) {
seriesTemplate.add(record);
seriesTemplateFilled = true;
}
}
if (chartDeep == deep) {
break;
}
}
if (record instanceof ChartRecord) {
if (record == chartRecord) {
chartRecordIdx = idx;
chartDeep = deep;
}
} else if (record instanceof SeriesRecord) {
if (chartRecordIdx != -1) {
seriesIdx++;
lastSeriesDeep = deep;
}
}
if (lastSeriesDeep != -1 && !seriesTemplateFilled) {
seriesTemplate.add(record);
}
}
/* check if a series was found */
if (endSeriesRecordIdx == -1) {
return null;
}
/* next index in the records list where the new series can be inserted */
idx = endSeriesRecordIdx + 1;
HSSFSeries newSeries = null;
/* duplicate record of the template series */
ArrayList<RecordBase> clonedRecords = new ArrayList<RecordBase>();
for (final RecordBase record : seriesTemplate) {
Record newRecord = null;
if (record instanceof BeginRecord) {
newRecord = new BeginRecord();
} else if (record instanceof EndRecord) {
newRecord = new EndRecord();
} else if (record instanceof SeriesRecord) {
SeriesRecord seriesRecord = (SeriesRecord) ((SeriesRecord) record).clone();
newSeries = new HSSFSeries(seriesRecord);
newRecord = seriesRecord;
} else if (record instanceof LinkedDataRecord) {
LinkedDataRecord linkedDataRecord = ((LinkedDataRecord) record).clone();
if (newSeries != null) {
newSeries.insertData(linkedDataRecord);
}
newRecord = linkedDataRecord;
} else if (record instanceof DataFormatRecord) {
DataFormatRecord dataFormatRecord = ((DataFormatRecord) record).clone();
dataFormatRecord.setSeriesIndex((short) seriesIdx);
dataFormatRecord.setSeriesNumber((short) seriesIdx);
newRecord = dataFormatRecord;
} else if (record instanceof SeriesTextRecord) {
SeriesTextRecord seriesTextRecord = (SeriesTextRecord) ((SeriesTextRecord) record).clone();
if (newSeries != null) {
newSeries.setSeriesTitleText(seriesTextRecord);
}
newRecord = seriesTextRecord;
} else if (record instanceof Record) {
newRecord = (Record) ((Record) record).clone();
}
if (newRecord != null) {
clonedRecords.add(newRecord);
}
}
/* check if a user model series object was created */
if (newSeries == null) {
return null;
}
/* transfer series to record list */
for (final RecordBase record : clonedRecords) {
records.add(idx++, record);
}
return newSeries;
}
use of org.apache.poi.hssf.record.chart.SeriesTextRecord in project poi by apache.
the class HSSFChart method getSheetCharts.
/**
* Returns all the charts for the given sheet.
*
* NOTE: You won't be able to do very much with
* these charts yet, as this is very limited support
*/
public static HSSFChart[] getSheetCharts(HSSFSheet sheet) {
List<HSSFChart> charts = new ArrayList<HSSFChart>();
HSSFChart lastChart = null;
HSSFSeries lastSeries = null;
// Find records of interest
List<RecordBase> records = sheet.getSheet().getRecords();
for (RecordBase r : records) {
if (r instanceof ChartRecord) {
lastSeries = null;
lastChart = new HSSFChart(sheet, (ChartRecord) r);
charts.add(lastChart);
} else if (r instanceof LinkedDataRecord) {
LinkedDataRecord linkedDataRecord = (LinkedDataRecord) r;
if (lastSeries != null) {
lastSeries.insertData(linkedDataRecord);
}
}
if (lastChart == null) {
continue;
}
if (r instanceof LegendRecord) {
lastChart.legendRecord = (LegendRecord) r;
} else if (r instanceof SeriesRecord) {
HSSFSeries series = new HSSFSeries((SeriesRecord) r);
lastChart.series.add(series);
lastSeries = series;
} else if (r instanceof ChartTitleFormatRecord) {
lastChart.chartTitleFormat = (ChartTitleFormatRecord) r;
} else if (r instanceof SeriesTextRecord) {
// Applies to a series, unless we've seen a legend already
SeriesTextRecord str = (SeriesTextRecord) r;
if (lastChart.legendRecord == null && lastChart.series.size() > 0) {
HSSFSeries series = lastChart.series.get(lastChart.series.size() - 1);
series.seriesTitleText = str;
} else {
lastChart.chartTitleText = str;
}
} else if (r instanceof ValueRangeRecord) {
lastChart.valueRanges.add((ValueRangeRecord) r);
} else if (r instanceof Record) {
Record record = (Record) r;
for (HSSFChartType type : HSSFChartType.values()) {
if (type == HSSFChartType.Unknown) {
continue;
}
if (record.getSid() == type.getSid()) {
lastChart.type = type;
break;
}
}
}
}
return charts.toArray(new HSSFChart[charts.size()]);
}
Aggregations