implemented per issue, breaking out static text vs. formula based title getters and setters, with unit test updates and additions. git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1791025 13f79535-47bb-0310-9956-ffa450edef68tags/REL_3_16_FINAL
import org.apache.poi.ss.usermodel.charts.ChartAxisFactory; | import org.apache.poi.ss.usermodel.charts.ChartAxisFactory; | ||||
import org.apache.poi.ss.usermodel.charts.ChartData; | import org.apache.poi.ss.usermodel.charts.ChartData; | ||||
import org.apache.poi.util.Internal; | import org.apache.poi.util.Internal; | ||||
import org.apache.poi.util.Removal; | |||||
import org.apache.poi.xssf.usermodel.charts.XSSFCategoryAxis; | import org.apache.poi.xssf.usermodel.charts.XSSFCategoryAxis; | ||||
import org.apache.poi.xssf.usermodel.charts.XSSFChartAxis; | import org.apache.poi.xssf.usermodel.charts.XSSFChartAxis; | ||||
import org.apache.poi.xssf.usermodel.charts.XSSFChartDataFactory; | import org.apache.poi.xssf.usermodel.charts.XSSFChartDataFactory; | ||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPageMargins; | import org.openxmlformats.schemas.drawingml.x2006.chart.CTPageMargins; | ||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea; | import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea; | ||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPrintSettings; | import org.openxmlformats.schemas.drawingml.x2006.chart.CTPrintSettings; | ||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTStrRef; | |||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle; | import org.openxmlformats.schemas.drawingml.x2006.chart.CTTitle; | ||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTTx; | import org.openxmlformats.schemas.drawingml.x2006.chart.CTTx; | ||||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx; | import org.openxmlformats.schemas.drawingml.x2006.chart.CTValAx; | ||||
} | } | ||||
/** | /** | ||||
* Returns the title, or null if none is set | |||||
* Returns the title static text, or null if none is set. | |||||
* Note that a title formula may be set instead. | |||||
* @return static title text, if set | |||||
* @deprecated POI 3.16, use {@link #getTitleText()} instead. | |||||
*/ | */ | ||||
@Deprecated | |||||
@Removal(version="4.0") | |||||
public XSSFRichTextString getTitle() { | public XSSFRichTextString getTitle() { | ||||
return getTitleText(); | |||||
} | |||||
/** | |||||
* Returns the title static text, or null if none is set. | |||||
* Note that a title formula may be set instead. | |||||
* Empty text result is for backward compatibility, and could mean the title text is empty or there is a formula instead. | |||||
* Check for a formula first, falling back on text for cleaner logic. | |||||
* @return static title text if set, | |||||
* null if there is no title, | |||||
* empty string if the title text is empty or the title uses a formula instead | |||||
*/ | |||||
public XSSFRichTextString getTitleText() { | |||||
if(! chart.isSetTitle()) { | if(! chart.isSetTitle()) { | ||||
return null; | return null; | ||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* Sets the title text. | |||||
* Sets the title text as a static string. | |||||
* @param newTitle to use | |||||
* @deprecated POI 3.16, use {@link #setTitleText(String)} instead. | |||||
*/ | */ | ||||
@Deprecated | |||||
@Removal(version="4.0") | |||||
public void setTitle(String newTitle) { | public void setTitle(String newTitle) { | ||||
} | |||||
/** | |||||
* Sets the title text as a static string. | |||||
* @param newTitle to use | |||||
*/ | |||||
public void setTitleText(String newTitle) { | |||||
CTTitle ctTitle; | CTTitle ctTitle; | ||||
if (chart.isSetTitle()) { | if (chart.isSetTitle()) { | ||||
ctTitle = chart.getTitle(); | ctTitle = chart.getTitle(); | ||||
run.setT(newTitle); | run.setT(newTitle); | ||||
} | } | ||||
} | } | ||||
/** | |||||
* Get the chart title formula expression if there is one | |||||
* @return formula expression or null | |||||
*/ | |||||
public String getTitleFormula() { | |||||
if(! chart.isSetTitle()) { | |||||
return null; | |||||
} | |||||
CTTitle title = chart.getTitle(); | |||||
if (! title.isSetTx()) { | |||||
return null; | |||||
} | |||||
CTTx tx = title.getTx(); | |||||
if (! tx.isSetStrRef()) { | |||||
return null; | |||||
} | |||||
return tx.getStrRef().getF(); | |||||
} | |||||
/** | |||||
* Set the formula expression to use for the chart title | |||||
* @param formula | |||||
*/ | |||||
public void setTitleFormula(String formula) { | |||||
CTTitle ctTitle; | |||||
if (chart.isSetTitle()) { | |||||
ctTitle = chart.getTitle(); | |||||
} else { | |||||
ctTitle = chart.addNewTitle(); | |||||
} | |||||
CTTx tx; | |||||
if (ctTitle.isSetTx()) { | |||||
tx = ctTitle.getTx(); | |||||
} else { | |||||
tx = ctTitle.addNewTx(); | |||||
} | |||||
if (tx.isSetRich()) { | |||||
tx.unsetRich(); | |||||
} | |||||
CTStrRef strRef; | |||||
if (tx.isSetStrRef()) { | |||||
strRef = tx.getStrRef(); | |||||
} else { | |||||
strRef = tx.addNewStrRef(); | |||||
} | |||||
strRef.setF(formula); | |||||
} | |||||
public XSSFChartLegend getOrCreateLegend() { | public XSSFChartLegend getOrCreateLegend() { | ||||
return new XSSFChartLegend(this); | return new XSSFChartLegend(this); |
// Check the titles | // Check the titles | ||||
XSSFChart chart = s2.createDrawingPatriarch().getCharts().get(0); | XSSFChart chart = s2.createDrawingPatriarch().getCharts().get(0); | ||||
assertEquals(null, chart.getTitle()); | |||||
assertEquals(null, chart.getTitleText()); | |||||
chart = s2.createDrawingPatriarch().getCharts().get(1); | chart = s2.createDrawingPatriarch().getCharts().get(1); | ||||
assertEquals("Pie Chart Title Thingy", chart.getTitle().getString()); | |||||
assertEquals("Pie Chart Title Thingy", chart.getTitleText().getString()); | |||||
chart = s3.createDrawingPatriarch().getCharts().get(0); | chart = s3.createDrawingPatriarch().getCharts().get(0); | ||||
assertEquals("Sheet 3 Chart with Title", chart.getTitle().getString()); | |||||
assertEquals("Sheet 3 Chart with Title", chart.getTitleText().getString()); | |||||
assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb)); | assertNotNull(XSSFTestDataSamples.writeOutAndReadBack(wb)); | ||||
} | } |
assertEquals(1, cs.createDrawingPatriarch().getCharts().size()); | assertEquals(1, cs.createDrawingPatriarch().getCharts().size()); | ||||
XSSFChart chart = cs.createDrawingPatriarch().getCharts().get(0); | XSSFChart chart = cs.createDrawingPatriarch().getCharts().get(0); | ||||
assertNull(chart.getTitle()); | |||||
assertNull(chart.getTitleText()); | |||||
} | } | ||||
} | } |
Workbook wb = createWorkbookWithChart(); | Workbook wb = createWorkbookWithChart(); | ||||
XSSFChart chart = getChartFromWorkbook(wb, "linechart"); | XSSFChart chart = getChartFromWorkbook(wb, "linechart"); | ||||
assertNotNull(chart); | assertNotNull(chart); | ||||
assertNull(chart.getTitle()); | |||||
assertNull(chart.getTitleText()); | |||||
final String myTitle = "My chart title"; | final String myTitle = "My chart title"; | ||||
chart.setTitle(myTitle); | |||||
XSSFRichTextString queryTitle = chart.getTitle(); | |||||
chart.setTitleText(myTitle); | |||||
XSSFRichTextString queryTitle = chart.getTitleText(); | |||||
assertNotNull(queryTitle); | assertNotNull(queryTitle); | ||||
assertEquals(myTitle, queryTitle.toString()); | assertEquals(myTitle, queryTitle.toString()); | ||||
final String myTitleFormula = "1 & \" and \" & 2"; | |||||
chart.setTitleFormula(myTitleFormula); | |||||
// setting formula should unset text, but since there is a formula, returns an empty string | |||||
assertEquals("", chart.getTitleText().toString()); | |||||
String titleFormula = chart.getTitleFormula(); | |||||
assertNotNull(titleFormula); | |||||
assertEquals(myTitleFormula, titleFormula); | |||||
wb.close(); | wb.close(); | ||||
} | } | ||||
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitle.xlsx"); | Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitle.xlsx"); | ||||
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1"); | XSSFChart chart = getChartFromWorkbook(wb, "Sheet1"); | ||||
assertNotNull(chart); | assertNotNull(chart); | ||||
XSSFRichTextString originalTitle = chart.getTitle(); | |||||
XSSFRichTextString originalTitle = chart.getTitleText(); | |||||
assertNotNull(originalTitle); | assertNotNull(originalTitle); | ||||
final String myTitle = "My chart title"; | final String myTitle = "My chart title"; | ||||
assertFalse(myTitle.equals(originalTitle.toString())); | assertFalse(myTitle.equals(originalTitle.toString())); | ||||
chart.setTitle(myTitle); | |||||
XSSFRichTextString queryTitle = chart.getTitle(); | |||||
chart.setTitleText(myTitle); | |||||
XSSFRichTextString queryTitle = chart.getTitleText(); | |||||
assertNotNull(queryTitle); | assertNotNull(queryTitle); | ||||
assertEquals(myTitle, queryTitle.toString()); | assertEquals(myTitle, queryTitle.toString()); | ||||
wb.close(); | wb.close(); | ||||
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_noTitle.xlsx"); | Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_noTitle.xlsx"); | ||||
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1"); | XSSFChart chart = getChartFromWorkbook(wb, "Sheet1"); | ||||
assertNotNull(chart); | assertNotNull(chart); | ||||
assertNull(chart.getTitle()); | |||||
assertNull(chart.getTitleText()); | |||||
final String myTitle = "My chart title"; | final String myTitle = "My chart title"; | ||||
chart.setTitle(myTitle); | |||||
XSSFRichTextString queryTitle = chart.getTitle(); | |||||
chart.setTitleText(myTitle); | |||||
XSSFRichTextString queryTitle = chart.getTitleText(); | |||||
assertNotNull(queryTitle); | assertNotNull(queryTitle); | ||||
assertEquals(myTitle, queryTitle.toString()); | assertEquals(myTitle, queryTitle.toString()); | ||||
wb.close(); | wb.close(); | ||||
} | } | ||||
@Test | |||||
public void testExistingChartWithFormulaTitle() throws IOException { | |||||
Workbook wb = XSSFTestDataSamples.openSampleWorkbook("chartTitle_withTitleFormula.xlsx"); | |||||
XSSFChart chart = getChartFromWorkbook(wb, "Sheet1"); | |||||
assertNotNull(chart); | |||||
XSSFRichTextString originalTitle = chart.getTitleText(); | |||||
assertNotNull(originalTitle); | |||||
assertEquals("", originalTitle.toString()); | |||||
String formula = chart.getTitleFormula(); | |||||
assertNotNull(formula); | |||||
assertEquals("Sheet1!$E$1", formula); | |||||
wb.close(); | |||||
} | |||||
} | } |